Документация InstantCMS

для администраторов и разработчиков

Инструменты пользователя

Инструменты сайта


dev:integration:search

Интеграция полнотекстового поиска

В комплекте InstantCMS есть компонент «Поиск», позволяющий искать нужные страницы на сайте. Архитектура компонента построена таким образом, что позволяет подключить к поиску любые компоненты движка.

Подключение хука

Подключение вашего компонента сводится к созданию хука, который работает по параллельной схеме с именем fulltext_search. Обратите внимание, что производится полнотекстовый поиск MySQL. Ваша таблица должна иметь соответствующий индекс типа FULLTEXT (если поиск по нескольким ячейкам, то индекс должен быть составной). Движок таблицы должен быть MyISAM (допускается InnoDB, если ваша версия MySQL поддерживает полнотекстовые индексы InnoDB).

В хук не передаётся параметров. Возвратить хук должен массив с такими ячейками (все обязательные):

return array(
    'name'          => $this->name,
    'sources'       => $sources,
    'table_names'   => $table_names,
    'match_fields'  => $match_fields,
    'select_fields' => $select_fields,
    'filters'       => $filters,
    'item_callback' => function($item, $model, $sources_name, $match_fields, $select_fields){
 
        return array_merge($item, array(
            'url'      => href_to($sources_name, $item['slug'] . '.html'),
            'title'    => $item['title'],
            'fields'   => array(),
            'date_pub' => $item['date_pub'],
            'image'    => ''
        ));
 
    }
);

Расшифровка ячеек ответа

Название Описание
name Название контроллера, например guestbook.
sources Массив обрабатываемых целей, например array('guestbook' ⇒ 'Гостевая книга'). Название цели может совпадать с названием контроллера. Целей может быть несколько.
table_names Массив таблиц, из которых выбирать данные. Ключом массива должно быть название цели. Для каждой цели указывается своя таблица, например array('guestbook' ⇒ 'guestbooks') (таблица cms_guestbooks).
match_fields Массив, ключом которого является название цели, а значением массив полей, которые участвуют непосредственно в полнотекстовой выборке в операторе MATCH. Например, array('guestbook' ⇒ array('title', 'description')). Для каждой цели можно указать свой набор полей.
select_fields Массив, ключом которого является название цели, а значением массив полей, которые нужно выбрать из таблицы. Например, array('guestbook' ⇒ array('id', 'slug', 'title', 'description')). Для каждой цели можно указать свой набор полей.
filters Массив, ключом которого является название цели, а значением массив условий и полей для фильтрации. Например, array('guestbook' ⇒ array(array('condition' ⇒ '=','value' ⇒ 1,'field' ⇒ 'is_pub'))). В этом случае будет происходить фильтрация по полю is_pub, которое должно быть равным 1.
item_callbackck Анонимная функция, которая обрабатывает ответ из базы данных. В ней доступны переменные: $item - массив записи с полями, которые мы запросили в ячейке select_fields, $model - объект модели класса modelSearch, $sources_name - название цели, например guestbook (полезно для формирования url записей), $match_fields и $select_fields в которых содержится массив соответствующих полей, которые мы указали выше. Возвращать эта функция должна несколько обязательных ячеек: url сформированная ссылка на страницу просмотра искомой записи, title - название найденной записи, date_pub - дата записи (без форматирования), image HTML код изображения, если таковое есть. Остальные ячейки не являются обязательными, поэтому при ответе практичнее будет результирующий массив сливать с массивом обязательных ячеек, как показано в PHP коде выше.

Примеры уже готовых хуков вы можете посмотреть в файлах /system/controllers/content/hooks/fulltext_search.php (реализация полнотекстового поиска в компоненте «Контент») и /system/controllers/photos/hooks/fulltext_search.php (полнотекстовый поиск по фотографиям).

Свой шаблон вывода результатов для цели

По-умолчанию, движок для вывода результатов поиска использует шаблон /templates/default/controllers/search/index.tpl.php. Однако, для нужной цели вы можете создать свой шаблон с названием по принципу index_НАЗВАНИЕ_ЦЕЛИ.tpl.php. Например, шаблон /templates/default/controllers/search/index_photos.tpl.php обрабатывает результаты поиска по фотографиям. Шаблон /templates/default/controllers/search/index_guestbook.tpl.php будет обслуживать результаты поиска по компоненту «Гостевая книга» и так далее.

Хуки обработки данных поиска

Помимо описанного выше, после выполнения основного хука, компонент «Поиск» обрабатывает следующие хуки:

Название Описание
search_CONTROLLER_NAME_data CONTROLLER_NAME - название контроллера, например guestbook (название хука будет search_guestbook_data). Обрабатывает каждый ответ контроллеров основного хука fulltext_search. В него передаётся то, что вернул заданный контроллер. Полезно использовать для дополнительной фильтрации/дополнения полей в выборку или для иных действий.
content_TARGET_NAME_search_list TARGET_NAME - название цели, например guestbook (название хука будет content_guestbook_search_list). Обрабатывает результирующий массив данных ответа от поиска.
dev/integration/search.txt · Последние изменения: 01.10.2016 19:53 — fuze