Localizator + mSearch2. Шерше ля фам или поиск по-французски
На днях в разделе работы появилось объявление о скрещивании Localizator и mSearch2. Заинтересовало оно меня тем, что по итогу работы необходимо написать статью и опубликовать здесь. А вы знаете, как я люблю писать статьи, правда? Заказ оформил Hiddenski, за что давайте вместе его поблагодарим! :)
Первый раз пишу статью по заказу, посмотрим, что из этого получится.
Подготовка
Нам потребуется mSearch2, Localizator, Fenom. Предположим, что вы уже настроили Localizator так, как вам надо.Теперь нам нужно определить, каким образом это всё будет работать.
1) У компонента mSearch2 есть событие плагина mse2OnBeforeSearchIndex,
2) Сниппет mSearch2 имеет возможность переопределять список полей для поиска по индексу, делается это параметром &fields.
Если соединить эти условия в правильном алгоритме, то мы получаем рабочее решение. Давайте посмотрим, как этим можно воспользоваться для реализации нашей задумки!
Шаг 1
Создаём плагин на событие mse2OnBeforeSearchIndex:switch ($modx->event->name) {
case 'mse2OnBeforeSearchIndex':
// Получаем список полей индексации
$keys = $mSearch2->fields;
unset($keys['comment']);
// Получаем список локализованных полей ресурса
if ($contents = $modx->getCollection('localizatorContent', array('resource_id' => $resource->id))) {
foreach ($contents as $content) {
foreach ($keys as $k => $v) {
// Если поле заполнено
if (!empty($content->{$k})) {
// Присваиваем названию поля префикс с ключом языка
$field_key = $content->key . '-' . $k;
// Добавляем поле языка в список полей для индексации
$mSearch2->fields[$field_key] = $v;
// Передаём новое поле через объект ресурса в процессор mSearch2 создающий индекс слов ресурса
$resource->set($field_key, $content->{$k});
}
}
}
}
break;
}
Надеюсь комментариев достаточно для понимания алгоритма работы плагина.Лирическое отступление
У сниппета mSearch2 есть параметр &onlyIndex, который позволяет отключить поиск по LIKE и оставить только по проиндексированным словам. По-сути, это идеально подходит для нашего решения, если бы не одно но!Дело в том, что новый алгоритм поиска в mSearch2 не знает об этой настройке и ищет себе по индексу, а если не нашёл ничего по проиндексированным словам, то отчаянно начинает искать по LIKE. К счастью, у компонента есть системная настройка mse2_old_search_algorithm, позволяющая включить поиск по старому алгоритму!
Шаг 2
Поэтому нам придётся включить старый алгоритм поиска в системных настройках:mse2_old_search_algorithm = true
Шаг 3
На фронт-энде у нас что-то вроде этого:<form action="" method="GET">
<input type="text" name="query" value="{$.get['query']}" />
<button type="submit">Искать!</button>
</form>
{var $language_key = ('localizator_key' | option)}
{var $mse2_fields = (('mse2_index_fields' | option) | split : ',')}
{if $language_key != ('localizator_default_language' | option)}
{foreach $mse2_fields as $k => $v}
{var $mse2_fields[$k] = ($language_key ~ '-' ~ $v)}
{/foreach}
{/if}
{'!mSearch2' | snippet : [
'onlyIndex' => true,
'fields' => ($mse2_fields | join : ','),
]}
Здесь мы получаем ключ текущего языка и если он отличен от языка по-умолчанию, то подменяем список полей для поиска на те же поля, только Важно!
Чтобы локализованные поля индекса сохранялись в базу, необходимо после добавления/обновления языковой версии ресурса нажать кнопку сохранить!Итого
Вот и всё! Так довольно просто и изящно получилось решить эту интересную задачу!P.S. Если Василий добавит в новый алгоритм поиска возможность отключить поиск по LIKE, будет идеально! :)
Поблагодарить автора
Отправить деньги
Комментарии: 2
Благодарю за решение. Было приятно поработать с Павлом!
Заголовок что надо!) А за статью Merci monsieur!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.