/** * Load Extra data * * @return void */ protected function loadExtraData() { $workingLanguage = NenoHelper::getWorkingLanguage(); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select(array('SUM(word_counter) AS counter', 'tr.state'))->from('#__neno_content_element_translations as tr')->innerJoin('#__neno_content_element_language_strings AS ls ON tr.content_id = ls.id')->innerJoin('#__neno_content_element_language_files AS lf ON lf.id = ls.languagefile_id')->where(array('content_type = ' . $db->quote('lang_string'), 'lf.id = ' . $this->getId(), 'tr.language = ' . $db->quote($workingLanguage)))->group('tr.state'); $db->setQuery($query); $statistics = $db->loadAssocList('state'); $wordCount = new stdClass(); $wordCount->untranslated = 0; $wordCount->queued = 0; $wordCount->changed = 0; $wordCount->translated = 0; // Assign the statistics foreach ($statistics as $state => $data) { switch ($state) { case NenoContentElementTranslation::NOT_TRANSLATED_STATE: $wordCount->untranslated = (int) $data['counter']; break; case NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE: $wordCount->queued = (int) $data['counter']; break; case NenoContentElementTranslation::SOURCE_CHANGED_STATE: $wordCount->changed = (int) $data['counter']; break; case NenoContentElementTranslation::TRANSLATED_STATE: $wordCount->translated = (int) $data['counter']; break; } } $wordCount->total = $wordCount->untranslated + $wordCount->queued + $wordCount->changed + $wordCount->translated; $this->wordCount = $wordCount; }
/** * {@inheritdoc} * * @param boolean $cachable If Joomla should cache the response * @param array $urlParams URL parameters * * @return JController */ public function display($cachable = false, $urlParams = array()) { $input = $this->input; $view = $input->getCmd('view', 'dashboard'); $app = JFactory::getApplication(); if (NenoSettings::get('installation_completed') != 1 && $view != 'installation' && $view != 'debug' && $app->isAdmin()) { if ($view != 'dashboard') { $app->enqueueMessage(JText::_('COM_NENO_INSTALLATION_ERROR'), 'error'); } $app->redirect('index.php?option=com_neno&view=installation'); } $input->set('view', $view); // Ensure that a working language is set for some views $viewsThatRequireWorkingLanguage = array('groupselements', 'editor', 'strings'); $showLanguagesDropDown = false; if (in_array($view, $viewsThatRequireWorkingLanguage)) { // Get working language $workingLanguage = NenoHelper::getWorkingLanguage(); $languages = JFactory::getLanguage()->getKnownLanguages(); $showLanguagesDropDown = true; if (empty($workingLanguage) || !in_array($workingLanguage, array_keys($languages))) { $url = JRoute::_('index.php?option=com_neno&view=setworkinglang&next=' . $view, false); $this->setRedirect($url); $this->redirect(); } } NenoHelperBackend::setAdminTitle($showLanguagesDropDown); parent::display($cachable, $urlParams); return $this; }
/** * Method to handle ajax call for google translation * * @return string */ public function translate() { $app = JFactory::getApplication(); $input = $app->input; $text = html_entity_decode($input->getHtml('text')); $workingLanguage = NenoHelper::getWorkingLanguage(); $defaultLanguage = NenoSettings::get('source_language'); $translator = NenoSettings::get('translator'); $result = array(); try { /* @var $nenoTranslate NenoTranslateApi */ $nenoTranslate = NenoTranslateApi::getAdapter($translator); try { $result['text'] = $nenoTranslate->translate($text, $defaultLanguage, $workingLanguage); $result['status'] = 'ok'; } catch (Exception $e) { $result['text'] = $text; $result['status'] = 'err'; $result['error'] = $e->getMessage(); } } catch (UnexpectedValueException $e) { $result['text'] = $text; $result['status'] = 'err'; $result['error'] = $e->getMessage(); } echo json_encode($result); $app->close(); }
* * @author Jensen Technologies S.L. <*****@*****.**> * @copyright Copyright (C) 2014 Jensen Technologies S.L. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ // No direct access defined('_JEXEC') or die; JHtml::_('bootstrap.tooltip'); JHtml::_('behavior.multiselect'); // Include the CSS file JHtml::stylesheet('media/neno/css/admin.css'); // Joomla Component Creator code to allow adding non select list filters if (!empty($this->extraSidebar)) { $this->sidebar .= $this->extraSidebar; } $workingLanguage = NenoHelper::getWorkingLanguage(); ?> <style> .toggler { cursor: pointer; width: 18px; border: 0; padding: 10px 0 0 0 !important; } .toggler .icon-arrow-right-3, .toggler .icon-arrow-down-3 { color: #08c;
/** * Get an object with the amount of words per state * * @return stdClass */ public function getWordCount() { if ($this->wordCount === null) { $this->wordCount = new stdClass(); $this->wordCount->total = 0; $this->wordCount->untranslated = 0; $this->wordCount->translated = 0; $this->wordCount->queued = 0; $this->wordCount->changed = 0; $db = JFactory::getDbo(); $query = $db->getQuery(true); $workingLanguage = NenoHelper::getWorkingLanguage(); $query->select(array('SUM(word_counter) AS counter', 't.state'))->from($db->quoteName(NenoContentElementLanguageString::getDbTable()) . ' AS ls')->innerJoin($db->quoteName(NenoContentElementLanguageFile::getDbTable()) . ' AS lf ON ls.languagefile_id = lf.id')->innerJoin($db->quoteName(NenoContentElementTranslation::getDbTable()) . ' AS t ON t.content_id = ls.id AND t.content_type = ' . $db->quote('lang_string') . ' AND t.language LIKE ' . $db->quote($workingLanguage))->where('lf.group_id = ' . $this->getId())->group('t.state'); $db->setQuery($query); $statistics = $db->loadAssocList('state'); // Assign the statistics foreach ($statistics as $state => $data) { switch ($state) { case NenoContentElementTranslation::NOT_TRANSLATED_STATE: $this->wordCount->untranslated = (int) $data['counter']; break; case NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE: $this->wordCount->queued = (int) $data['counter']; break; case NenoContentElementTranslation::SOURCE_CHANGED_STATE: $this->wordCount->changed = (int) $data['counter']; break; case NenoContentElementTranslation::TRANSLATED_STATE: $this->wordCount->translated = (int) $data['counter']; break; } } $query->clear()->select(array('SUM(word_counter) AS counter', 'tr.state'))->from('#__neno_content_element_tables AS t')->innerJoin('#__neno_content_element_fields AS f ON f.table_id = t.id')->innerJoin('#__neno_content_element_translations AS tr ON tr.content_id = f.id AND tr.content_type = ' . $db->quote('db_string') . ' AND tr.language LIKE ' . $db->quote($workingLanguage))->where(array('t.group_id = ' . $this->getId(), 't.translate IN (1,2)', 'f.translate = 1'))->group('tr.state'); $db->setQuery($query); $statistics = $db->loadAssocList('state'); // Assign the statistics foreach ($statistics as $state => $data) { switch ($state) { case NenoContentElementTranslation::NOT_TRANSLATED_STATE: $this->wordCount->untranslated = (int) $data['counter'] + $this->wordCount->untranslated; break; case NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE: $this->wordCount->queued = (int) $data['counter'] + $this->wordCount->queued; break; case NenoContentElementTranslation::SOURCE_CHANGED_STATE: $this->wordCount->changed = (int) $data['counter'] + $this->wordCount->changed; break; case NenoContentElementTranslation::TRANSLATED_STATE: $this->wordCount->translated = (int) $data['counter'] + $this->wordCount->translated; break; } } $this->wordCount->total = $this->wordCount->untranslated + $this->wordCount->queued + $this->wordCount->changed + $this->wordCount->translated; } return $this->wordCount; }
/** * Create the HTML for the fairly advanced title that allows changing the language you are working in * * @param boolean $showLanguageDropDown If we should show the languages dropdown * * @return string */ public static function setAdminTitle($showLanguageDropDown = false) { $app = JFactory::getApplication(); $view = $app->input->getCmd('view', ''); $document = $app->getDocument(); $currentTitle = $document->getTitle(); $document->setTitle($currentTitle . ' - ' . JText::_('COM_NENO_TITLE_' . strtoupper($view))); // If there is a language constant then start with that $displayData = array('view' => $view); if ($showLanguageDropDown) { $displayData['workingLanguage'] = NenoHelper::getWorkingLanguage(); $displayData['targetLanguages'] = NenoHelper::getLanguages(false, false); } $adminTitleLayout = JLayoutHelper::render('toolbar', $displayData, JPATH_NENO_LAYOUTS); $layout = new JLayoutFile('joomla.toolbar.title'); $html = $layout->render(array('title' => $adminTitleLayout, 'icon' => 'nope')); $app->JComponentTitle = $html; }
public function refreshWordCount() { $input = $this->input; // Refresh content for groups $groups = $input->get('groups', array(), 'ARRAY'); $tables = $input->get('tables', array(), 'ARRAY'); $files = $input->get('files', array(), 'ARRAY'); $workingLanguage = NenoHelper::getWorkingLanguage(); /* @var $db NenoDatabaseDriverMysqlx */ $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('tr.id')->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_fields AS f ON tr.content_id = f.id')->innerJoin('#__neno_content_element_tables AS t ON t.id = f.table_id')->where(array('tr.state = ' . $db->quote(NenoContentElementTranslation::TRANSLATED_STATE), 'tr.language = ' . $db->quote($workingLanguage))); if (!empty($groups)) { $query->innerJoin('#__neno_content_element_groups AS g ON t.group_id = g.id')->where('g.id IN (' . implode(',', $db->quote($groups)) . ')'); } elseif (!empty($tables) || !empty($files)) { $where = array(); if (!empty($tables)) { $where[] = '(t.id IN (' . implode(',', $db->quote($tables)) . ') AND tr.content_type = ' . $db->quote(NenoContentElementTranslation::DB_STRING) . ')'; } if (!empty($files)) { $where[] = '(t.id IN (' . implode(',', $db->quote($tables)) . ') AND tr.content_type = ' . $db->quote(NenoContentElementTranslation::LANG_STRING) . ')'; } $query->where('(' . implode(' OR ', $where) . ')'); } $db->setQuery($query); $translationIds = $db->loadArray(); foreach ($translationIds as $translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); $translation->persist(); } JFactory::getApplication()->redirect('index.php?option=com_neno&view=groupselements'); }
/** * Get languages * * @return array */ public function getLanguages() { $languages = NenoHelper::getLanguages(false); $workingLanguage = NenoHelper::getWorkingLanguage(); $defaultLanguage = NenoSettings::get('source_language'); foreach ($languages as $key => $language) { if ($language->lang_code == $workingLanguage || $language->lang_code == $defaultLanguage) { unset($languages[$key]); } } return $languages; }
/** * Consolidate translation methods * * @param int $groupId Group Id * @param bool $deleteTranslationMethods Delete previous translation methods * * @return void */ public static function consolidateTranslationMethods($groupId, $deleteTranslationMethods = false) { $db = JFactory::getDbo(); $subQuery = $db->getQuery(true); $workingLanguage = NenoHelper::getWorkingLanguage(); if ($deleteTranslationMethods) { $subQuery->select('DISTINCT tr.id')->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_fields AS f ON tr.content_id = f.id')->innerJoin('#__neno_content_element_tables AS t ON f.table_id = t.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = t.group_id')->where(array('tr.state = ' . NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId)); $query = $db->getQuery(true); $query->delete('#__neno_content_element_translation_x_translation_methods')->where('translation_id IN (' . (string) $subQuery . ')'); $db->setQuery($query); $db->execute(); $subQuery->clear()->select('DISTINCT tr.id')->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_language_strings AS ls ON tr.content_id = ls.id')->innerJoin('#__neno_content_element_language_files AS lf ON ls.languagefile_id = lf.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = lf.group_id')->leftJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON g.id = gtm.group_id AND tr.language = gtm.lang')->where(array('tr.state = ' . NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId)); $query->clear('where')->where('translation_id IN (' . (string) $subQuery . ')'); $db->setQuery($query); $db->execute(); } else { $subQuery2 = $db->getQuery(true); $subQuery2->select('1')->from('#__neno_content_element_translation_x_translation_methods AS trtm')->innerJoin('#__neno_translation_methods AS tm ON trtm.translation_method_id = tm.id')->where(array('trtm.translation_id = tr.id', 'FIND_IN_SET(gtm.translation_method_id,tm.acceptable_follow_up_method_ids)')); // For database strings $subQuery->select(array('tr.id', 'gtm.translation_method_id', 'gtm.ordering'))->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_fields AS f ON tr.content_id = f.id')->innerJoin('#__neno_content_element_tables AS t ON f.table_id = t.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = t.group_id')->leftJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON g.id = gtm.group_id AND tr.language = gtm.lang')->where(array('tr.state = ' . NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId)); $query = 'REPLACE INTO #__neno_content_element_translation_x_translation_methods (translation_id,translation_method_id,ordering) (' . (string) $subQuery . ')'; $db->setQuery($query); $db->execute(); $subQuery->clear()->select(array('tr.id', 'gtm.translation_method_id', 'gtm.ordering'))->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_fields AS f ON tr.content_id = f.id')->innerJoin('#__neno_content_element_tables AS t ON f.table_id = t.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = t.group_id')->leftJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON g.id = gtm.group_id AND tr.language = gtm.lang')->where(array('tr.state = ' . NenoContentElementTranslation::TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId, 'gtm.ordering > 1', 'EXISTS (' . (string) $subQuery2 . ' )')); $query = 'REPLACE INTO #__neno_content_element_translation_x_translation_methods (translation_id,translation_method_id,ordering) (' . (string) $subQuery . ')'; $db->setQuery($query); $db->execute(); $subQuery->clear()->select(array('tr.id', 'gtm.translation_method_id', 'gtm.ordering'))->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_language_strings AS ls ON tr.content_id = ls.id')->innerJoin('#__neno_content_element_language_files AS lf ON ls.languagefile_id = lf.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = lf.group_id')->leftJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON g.id = gtm.group_id AND tr.language = gtm.lang')->where(array('tr.state = ' . NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId)); $query = 'REPLACE INTO #__neno_content_element_translation_x_translation_methods (translation_id,translation_method_id,ordering) (' . (string) $subQuery . ')'; $db->setQuery($query); $db->execute(); $subQuery->clear()->select(array('tr.id', 'gtm.translation_method_id', 'gtm.ordering'))->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_language_strings AS ls ON tr.content_id = ls.id')->innerJoin('#__neno_content_element_language_files AS lf ON ls.languagefile_id = lf.id')->innerJoin('#__neno_content_element_groups AS g ON g.id = lf.group_id')->leftJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON g.id = gtm.group_id AND tr.language = gtm.lang')->where(array('tr.state = ' . NenoContentElementTranslation::TRANSLATED_STATE, 'tr.content_type = ' . $db->quote('db_string'), 'tr.language = ' . $db->quote($workingLanguage), 'g.id = ' . (int) $groupId, 'gtm.ordering > 1', 'EXISTS (' . (string) $subQuery2 . ' )')); $query = 'REPLACE INTO #__neno_content_element_translation_x_translation_methods (translation_id,translation_method_id,ordering) (' . (string) $subQuery . ')'; $db->setQuery($query); $db->execute(); } }
/** * Get an object with the amount of words per state * * @return stdClass */ public function getWordCount() { if ($this->wordCount === null) { $cacheId = NenoCache::getCacheId(get_called_class() . '.' . __FUNCTION__, array($this->getId())); $cacheData = NenoCache::getCacheData($cacheId); if ($cacheData === null) { $this->wordCount = new stdClass(); $this->wordCount->total = 0; $this->wordCount->untranslated = 0; $this->wordCount->translated = 0; $this->wordCount->queued = 0; $this->wordCount->changed = 0; $db = JFactory::getDbo(); $query = $db->getQuery(true); $workingLanguage = NenoHelper::getWorkingLanguage(); $query->select(array('SUM(word_counter) AS counter', 'tr.state'))->from('#__neno_content_element_translations AS tr')->where(array('tr.content_type = ' . $db->quote('db_string'), 'tr.language LIKE ' . $db->quote($workingLanguage), 'tr.content_id = ' . $this->getId()))->group('tr.state'); $db->setQuery($query); $statistics = $db->loadAssocList('state'); // Assign the statistics foreach ($statistics as $state => $data) { switch ($state) { case NenoContentElementTranslation::NOT_TRANSLATED_STATE: $this->wordCount->untranslated = (int) $data['counter']; break; case NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE: $this->wordCount->queued = (int) $data['counter']; break; case NenoContentElementTranslation::SOURCE_CHANGED_STATE: $this->wordCount->changed = (int) $data['counter']; break; case NenoContentElementTranslation::TRANSLATED_STATE: $this->wordCount->translated = (int) $data['counter']; break; } } $this->wordCount->total = $this->wordCount->untranslated + $this->wordCount->queued + $this->wordCount->changed + $this->wordCount->translated; $cacheData = $this->wordCount; NenoCache::setCacheData($cacheId, $cacheData); } $this->wordCount = $cacheData; } return $this->wordCount; }
/** * Build an SQL query to load the list data. * * @return JDatabaseQuery * * @since 1.6 */ protected function getListQuery() { $db = JFactory::getDbo(); $workingLanguage = NenoHelper::getWorkingLanguage(); // Create a new query object. $dbStrings = parent::getListQuery(); $languageFileStrings = parent::getListQuery(); $dbStrings->select(array('tr1.*', 'f.field_name AS `key`', 't.table_name AS element_name', 'g1.group_name AS `group`', 'CHAR_LENGTH(tr1.string) AS characters'))->from('`#__neno_content_element_translations` AS tr1')->innerJoin('`#__neno_content_element_fields` AS f ON tr1.content_id = f.id')->innerJoin('`#__neno_content_element_tables` AS t ON t.id = f.table_id')->innerJoin('`#__neno_content_element_groups` AS g1 ON t.group_id = g1.id ')->where(array('tr1.language = ' . $db->quote($workingLanguage), 'tr1.content_type = ' . $db->quote('db_string'), 'f.translate = 1'))->group(array('HEX(tr1.string)', 'tr1.state'))->order('tr1.id'); $languageFileStrings->select(array('tr2.*', 'ls.constant AS `key`', 'lf.filename AS element_name', 'g2.group_name AS `group`', 'CHAR_LENGTH(tr2.string) AS characters'))->from('`#__neno_content_element_translations` AS tr2')->innerJoin('`#__neno_content_element_language_strings` AS ls ON tr2.content_id = ls.id')->innerJoin('`#__neno_content_element_language_files` AS lf ON lf.id = ls.languagefile_id')->innerJoin('`#__neno_content_element_groups` AS g2 ON lf.group_id = g2.id ')->where(array('tr2.language = ' . $db->quote($workingLanguage), 'tr2.content_type = ' . $db->quote('lang_string')))->group(array('HEX(tr2.string)', 'tr2.state'))->order('tr2.id'); $queryWhereDb = array(); /* @var $groups array */ $groups = $this->getState('filter.group_id', array()); /* @var $element array */ $element = $this->getState('filter.element', array()); /* @var $field array */ $field = $this->getState('filter.field', array()); /* @var $file array */ $file = $this->getState('filter.files', array()); $groupIdAdded = false; if (!is_array($groups)) { $groups = array($groups); } if (!empty($groups) && !in_array('none', $groups)) { $queryWhereDb[] = 't.group_id IN (' . implode(', ', $groups) . ')'; $languageFileStrings->where('lf.group_id IN (' . implode(', ', $groups) . ')'); } if (!empty($element)) { if ($groupIdAdded === false) { $languageFileStrings->select('g2.id AS group_id'); $dbStrings->select('g1.id AS group_id'); $groupIdAdded = true; } $queryWhereDb[] = 't.id IN (' . implode(', ', $element) . ')'; // Do not show any strings for this language file if (empty($file)) { $languageFileStrings->where('lf.id = 0'); } } if (!empty($field)) { if ($groupIdAdded === false) { $languageFileStrings->select('g2.id AS group_id'); $dbStrings->select('g1.id AS group_id'); } // Do not show any strings for this language file if (empty($file)) { $languageFileStrings->where('lf.id = 0'); } $queryWhereDb[] = 'f.id IN (' . implode(', ', $field) . ')'; } if (!empty($file)) { $languageFileStrings->where('lf.id IN (' . implode(',', $file) . ')'); if (empty($field) && empty($element)) { $queryWhereDb[] = 'f.id = 0 AND t.id = 0'; } } if (count($queryWhereDb)) { $dbStrings->where('(' . implode(' OR ', $queryWhereDb) . ')'); } $method = (array) $this->getState('filter.translator_type', array()); if (!empty($method) && !in_array('none', $method)) { $dbStrings->where('tr_x_tm1.translation_method_id IN ("' . implode('", "', $method) . '")')->leftJoin('`#__neno_content_element_translation_x_translation_methods` AS tr_x_tm1 ON tr1.id = tr_x_tm1.translation_id'); $languageFileStrings->where('tr_x_tm2.translation_method_id IN ("' . implode('", "', $method) . '")')->leftJoin('`#__neno_content_element_translation_x_translation_methods` AS tr_x_tm2 ON tr2.id = tr_x_tm2.translation_id'); } $status = (array) $this->getState('filter.translation_status', array()); if (!empty($status) && $status[0] !== '' && !in_array('none', $status)) { $dbStrings->where('tr1.state IN (' . implode(', ', $status) . ')'); $languageFileStrings->where('tr2.state IN (' . implode(', ', $status) . ')'); } // Hide empty strings if the user wants to do that if (NenoSettings::get('hide_empty_strings', true)) { $dbStrings->where('tr1.original_text <> ' . $db->quote('')); $languageFileStrings->where('tr2.original_text <> ' . $db->quote('')); } $query = parent::getListQuery(); $query->select('DISTINCT *')->from('((' . (string) $dbStrings . ') UNION (' . (string) $languageFileStrings . ')) AS a')->group('id'); $search = $this->getState('filter.search'); if (!empty($search)) { $search = $db->quote('%' . $search . '%'); $query->where('(a.original_text LIKE ' . $search . ' OR a.string LIKE ' . $search . ')'); } // Add the list ordering clause. $orderCol = $this->state->get('list.ordering'); $orderDirection = $this->state->get('list.direction'); if ($orderCol && $orderDirection) { $query->order($db->escape($orderCol . ' ' . $orderDirection)); } return $query; }