[mSearch2] Поиск в найденном. Реализация

Поиск в найденном — удобный механизм последовательного органичения поисковой информации. Многие помнят, что до лета 2014 у Яндекса была такая замечательная возможность. И сколько шума на форумах было, когда её убрали.
На mSearch2 можно достаточно легко реализовать такую возможность. Нужны всего лишь сам mSearch2 и бутылочка пива. Открываем и то и другое, и поехали.
1. Первым делом добавляем в форму чанка tpl.mSearch2.form чекбокс.
<input type="checkbox" value="1" name="sinf" id="sinf" /> Искать в найденном
Получается, например, вот так

Вот и все. Отмечаем галочку и ищем. :)

Шучу. Иначе зачем тогда пиво открывать.

2. Следующим шагом расширим класс msearch2.class.php. Нам нужно изменить 2 метода: Search и simpleSearch. Вернее, всего лишь добавить одну строчку в оба метода
if (!empty($this->resources)) $q->where(array('resource:IN' => $this->resources));
И добавить еще один параметр resources, в котором хранятся id ресурсов из предыдущего запроса.
Создадим свой класс msearch2ext с измененными методами рядом с базовым.
Файл класса msearch2ext.class.php.

3. Дальше нам надо изменить сниппет mSearch2. Надеюсь, все знают, что при обновлении сниппеты и файлы затираются, в отличие от чанков (возможностью обновления чанков можно управлять). Поэтому советую скопировать сниппет mSearch2. Править будем именно копию. Как назвать новый сниппет решать вам, главное запомнить имя, потому что его надо будет указать в параметре element сниппета mSearchForm и pdoPage. Я назвал mSearch2Ext.
Собственно изменения небольшие. В строках 10-11 указываем наш новый класс вместо msearch2
if (!$modx->loadClass('msearch2ext', MODX_CORE_PATH . 'components/msearch2/model/msearch2/', false, true)) {return false;}
$mSearch2 = new mSearch2ext($modx, $scriptProperties, $pdoFetch);
А в строчках 48-56 обрабатываем чекбокс и настраиваем поиск по найденному
$sinf = isset($_REQUEST['sinf']) ? true : false;
if ($sinf && isset($_SESSION['msearch2']['ids'])) {
if (isset($_SESSION['msearch2']['ids'])) $mSearch2->resources = $_SESSION['msearch2']['ids'];
}
$found = $mSearch2->Search($query);
$ids = array_keys($found);
$resources = implode(',', $ids);
$_SESSION['msearch2']['ids'] = $ids;
Вот готовый сниппет.

4. Дальше ищем файл assets/components/msearch2/action.php.
Делаем копию и называем action2.php. Делаем пару изменений — в 45 строчке подключаем наш класс и в строчке 216 ловим и обрабатываем чекбокс.
Вот готовый файл
Теперь нам надо подключить наш новый action2.php. Сделать это нужно в сниппете mSearchForm. Говорим в сниппете, а подразумеваем в копии (помним про обновления). В конце находим код и меняем последний ключ в массиве настроек
// Setting values for frontend javascript
$main_config = array(
	'cssUrl' => $mSearch2->config['cssUrl'].'web/',
	'jsUrl' => $mSearch2->config['jsUrl'].'web/',
	'actionUrl' => $mSearch2->config['assetsUrl'].'action2.php',
);

5. Ну и осталось подправить файл assets/components/msearch2/js/web/default.js. Копируем, обзываем default2.js. Делаем несколько исправлений. Описывать не буду. Найти их можно по комментарию //search in found.
Берем код отсюда.
Дальше нам надо его подключить. В системных настройках раздела mSearch2 в параметре «Скрипты фронтенда» (mse2_frontend_js) указываем этот файл:
[[+jsUrl]]web/default2.js

Все. К этому моменту бутылка пива должна быть наполовину пустой. Теперь вызываем наш поиск. Например так
[[!mSearchForm2?element=`mSearch2Ext`]]
[[!pdoPage?
	&element=`mSearch2Ext`
	&returnIds = `0`
	&limit=`10`
]]
<div class="pagination">
	[[!+page.nav]]
</div>
Обратите внимание, сниппет mSearchForm2 — это измененный mSearchForm.

П.С. Теперь поиск в найденном должен работать. Работает он только во фронтенде. Глобального тестирования я не проводил, но теоретически ничего не должно поломаться. Очень на это надеюсь :)
П.П.С. Все изменения, которые я вносил в исходные файлы, я предварял комментарием
//Search in found
Так что легко понять, где я натоптал :)
Сергей Шлоков
18 февраля 2015, 15:45
modx.pro
11
1 778
+9
Поблагодарить автора Отправить деньги

Комментарии: 1

Сергей Шлоков
19 февраля 2015, 19:15
+1
Друзья. Обнаружил небольшой проблем с кешированием запросов. Например, если вы ищете «телефон» и потом захотите выбрать все «apple» в найденном, то автодополнение покажет все телефоны apple. Как положено. Но если после этого вы захотите найти все товары «apple» и уберете галочку, то все равно автодополнение покажет только телефоны. Это происходит потому, что прошлый запрос закешировался.
Я поправил это дело. Теперь, когда чекбокс меняется, кеш сбрасывается. Так что обновитесь — файл default2.js из пятого пункта.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1