Drupal 8: Как сделать поиск по своему модулю
Продолжая работать над своим проектом на Drupal 8, понадобилось добавить поиск по своему модулю. Но тут меня снова ждал сюрприз — методы hook_search_info и hook_search_execute использовать не получилось. Они просто не вызывались системой и пришлось разбираться, как это правильно делается. Информация меняется часто и удалось найти только одну статью с подсказкой.
Оказалось, что Drupal не поддерживает единую выдачу для нескольких модулей. Вместо этого он разбивает её на типы и каждый тип настраивается отдельно. Также он поддерживает индексацию для ускорения работы, но я это не буду использовать в своём примере.
Для того, чтоб начать делать свой поиск, нужно разобраться, как же он работает. Как я уже писал, во многих примерах для Drupal 7 используются hook_search_info и hook_search_execute, но в Drupal 8 использовать их у меня не получилось. Тогда было решено исследовать функционал сайта: поиск по пользователям и содержимому. Через некоторое время были найдены классы: NodeSearch.php и UserSearch.php.
Детальное описание не прилагалось, но разобраться можно.
/**
* Executes a keyword search for users against the {users} database table.
*
* @SearchPlugin(
* id = «user_search»,
* title = @Translation(«Users»)
* )
*/class UserSearch extends SearchPluginBase implements AccessibleInterface {
user_search - это тип поиска
title — это название в админке
Можно скопировать UserSearch.php в <your module>/Plugin/Search, переименовать файл, имя класса, id и title и можно получить свой простой обработчик для запросов на поиск. Теперь остаётся реализовать метод public function execute() с тем функционалом, который вам нужен.
Результат поиска — это массив, который состоит из массивов с полями title и link.
Метод access лучше заменить реализацией ниже иначе пользователи не увидят новый тип поиска.
public function access($operation = ‘view’, AccountInterface $account = NULL, $return_as_object = FALSE) {
$result = AccessResult::allowedIfHasPermission($account, ‘access content’);
return $return_as_object ? $result : $result->isAllowed();
}
Главная -> Администрирование -> Конфигурация -> Поиск и метаданные
После добавления его на страницу поиска у вас должна появиться возможность поиска по вашему модулю.