2015 25 января

Стандартный поиск по отдельным категориям, !Joomla 2.5

Обновление поста по поиску по отдельным категориям для старой старой версии 1.0 Стандартный поиск по отдельным категориям, !Joomla 1.0.xx представляю черновую версию аналогичного поиска для движка 2.5. Цель - в форме стандартного поиска получить список категорий контента для поиска по отдельным категориям. Работает только для категорий контента, не других расширений (даже стандартных, кто желает - модификации запроса на свое усмотрение) Выглядеть в итоге (на стандартном шаблоне) должно примерно так: Стандартный поиск по отдельным категориям, !Joomla 2.5 Шаг 1 \components\com_search\views\search\tmpl\default_form.php после строки примерно 58 (где phrases) добавляем блок поиска по категориям
1
23
45
67
89
1011
1213
1415
1617
1819
20
// By Beliyadm добавляем список категорий
$htmlcat = '';$htmlcat .= '<fieldset class="only"><label for="catid">Искать в категории:</label>';
 $db     =& JFactory::getDBO();
$sql = 'select id, title from #__categories where extension = "com_content" and  published = 1 ';$db->setQuery($sql);
$rows = $db->loadObjectList(); 
$htmlcat .= '<select size="1" name="catid" id=""catid">';$catsel = '';
$htmlcat .= '<option class="catid" value="0">Все категории</option>';foreach ($rows as $row) {
        if ($row->id == $this->catid) {                $catsel = ' selected="selected" ';
        } else {$catsel = '';}        $htmlcat .= '<option class="catid" value="'.$row->id.'" '.$catsel.'>'.$row->title.'</option>';
}$htmlcat .= '</select></fieldset>';
echo $htmlcat;
## Можно пользоваться стандартным API движка, но сути не меняет, это тот же запрос к базе на выборку категорий, только здесь мы можем настроить запрос под наши требования
Шаг 2 \plugins\search\content\content.php функция onContentSearch (строка 41) меняем на
1
function onContentSearch($text, $phrase='', $ordering='', $areas=null, $catid)
После $wheres = array(); добавляем
1
23
45
// By Beliyadm добавляем список категорий
$wherescatid = '';if ($catid != 0) {
        $wherescatid = ' AND a.catid = "'.$catid.'" ';}
Ниже находим строку примерно 165
1
$query->where('('. $where .')' . 'AND a.state=1 AND c.published = 1 AND a.access IN ('.$groups.') '
и меняем ее на
1
$query->where('('. $where .')' . 'AND a.state=1 AND c.published = 1 '.$wherescatid.' AND a.access IN ('.$groups.') '
## конечно, можно и может даже лучше пихать категорию в общий массив where, но мне так проще впоследствии разбираться что где я менял
Шаг 3 \components\com_search\controller.php В функцию function search() добавляем (по аналогии с другими элементами массива)
1
$post['catid'] = JRequest::getUInt('catid', null, 'post');
Шаг 4 \components\com_search\models\search.php В функции function getData() меняем весь блок $results на
1
23
45
67
$results = $dispatcher->trigger('onContentSearch', array(
        $this->getState('keyword'),        $this->getState('match'),
        $this->getState('ordering'),        $areas['active'],
        $this->getState('catid')));
Шаг 5 \components\com_search\views\search\view.html.php В функции function display после
1
$searchword = $state->get('keyword');
добавляем
1
$catid          = $state->get('catid');
На этом все. С учетом того, что мы работали только с категориями контента - нужно отключить плагины поиска по другим компонентам либо дописывать условия в запрос. На всякий случай прикладываю измененные файлы версии 2.5.7 скачать архив. В архиве две папки, содержимое com_search залить в components\com_search, содержимое plg_search_content в каталог plugins\search\content (не забываем про резервные копии!!!!!). Если у вас на уровне шаблона переопределяется вывод формы поиска, значит обновление шага 1 применять к файлу \templates\ваш_шаблон\html\com_search\search\default_form.php

Комментарии

0 Artem пишет нам 30.01.2015 03:58
Спасибо, всё отлично работает.
Сообщить модератору
0 Beliyadm отвечает 30.01.2015 12:28
Ну и отлично, благодарю за тестирование!
Сообщить модератору
0 Артур пишет нам 31.01.2015 18:54
Искать в категории:' Разве не да это делать с использованием ru-RU.ini JERROR_LAYOUT_SEARCH_category
Сообщить модератору
0 Beliyadm отвечает 31.01.2015 20:24
А какая принципиальная разница в данном случае, использовать одну из стандартных языковых констант или написать все что угодно прямо в коде? Не думаю, что этот тот текст, который часто используется в разных файлах. Так что можно делать как угодно на свое усмотрение
Сообщить модератору
0 Артур отвечает 01.02.2015 01:35
да, даже не сомневаюсь в вашем опыте. я просто спросил. интересно было ваше мнение. и что лучшее? использовать джумловскые компоненты поиска или вставлять поиск от яндекса или гугла?
Сообщить модератору
0 Beliyadm отвечает 01.02.2015 16:09
В плане релевантности поиска сторонние сервисы, конечно же, лучше. Цитата с одного из обзоров "морфология русского и других языков, автоматическое исправления ошибок, поисковые подсказки, а также оптимизация поиска под мобильные устройства и улучшение индексации сайта." - то, чего нет в стандартном поиске движков. Еще снижаем нагрузку к базе сайта, ведь поиск идет по индексированным данным поисковика. Но при этом сложность в настройки внешнего вида, невозможность (в всяком случае я не знаю как это сделать) поиска по расширенным параметрам (к примеру, как мы сделали с категориями) и тд. С версии движка 2.5 есть еще и умный поиск, в составе которого есть парадигматический модуль, что частично заменяет морфологический поиск. Но умный поиск создает достаточно сильную нагрузку на БД хостинга, потому я им никогда не пользуюсь на продакшне. Так что что выбрать - только ваше решение, можно подключить разные поисковые системы, посмотреть на различие в выдаче результатов, нагрузку, удобство работы и принять решение.
Сообщить модератору

Недостаточно прав для комментирования