[mFilter] Работа сниппета с пагинатором pdoPage
Практически в каждом магазине есть и требуется вставлять фильтры. И так как в моём случае не требуется сильно сложных фильтров, я решил использовать компонент mSearch и входящий в него сниппет mFilter. Но при желании подружить фильтр с pdoPage столкнулся с некоторыми проблемами, причём не я один.
Попробуем же с вами подружить mFilter и pdoPage. Для настройки mSearch и отдельно mFilter есть отличный мануал, который был написан почти два года назад, но не потерял своей актуальности и полноты.
Пробуем вывести фильтр. Для этого используем почти стандартный чанк, изменений немного:
Открываем страницу, где писутствует чанк, и… в консоли браузера получаем следующую ошибку:
Становится ясно, что сниппет выдаёт не то, что ожидает JS-скрипт. Воспользуемся решением, которое предложил наш товарищ (см. ссылку в начале статьи):
Вроде работает, но… Пагинация начинает себя глупо вести. Заглянув в «иначе» (см. ниже elseif {… }), предлагаю вам такое решение, при котором всё будет работать чётко.
Конечно, очень бы не хотелось вносить изменения в сниппет, но пока другого решения проблемы не нашёл.
Необходимо в сниппете pdoPage найти условие (строки 56-62):
P.S. Из условия можно сделать вывод, что если указать параметр ajax=1 при вызове mFilter должно всё работать, но не тут то было. В таком случае в консоли получаем следующую ошибку:
Попробуем же с вами подружить mFilter и pdoPage. Для настройки mSearch и отдельно mFilter есть отличный мануал, который был написан почти два года назад, но не потерял своей актуальности и полноты.
Пробуем вывести фильтр. Для этого используем почти стандартный чанк, изменений немного:
<div class="row">
<div class="span3">
<div class="filter">
<form action="[[~[[*id]]]]" method="post" id="mFilter">
[[!mFilter?
&paginator=`pdoPage`
&resources=`[[!getCatIds? &parents=`[[*id]]`]]`
&includeTVs=`0`
&includeMS=`1`
&includeMSList=`price,color,size,tags`
&sortFilters=`menuindex,ms_price`
&tpl=`tpl.msProducts.row`
&limit=`12`
&pageLimit=`10`
]]
<input type="hidden" name="page" value="1">
<input type="hidden" name="sort" value="menuindex,asc">
<input type="hidden" name="action" value="filter" />
</form>
</div><!-- end_filter -->
</div>
<div id="mItems"></div>
</div>
<link href="assets/components/msearch/css/jquery-ui.min.css" rel="stylesheet" type="text/css">
<script src="assets/components/msearch/js/jquery-ui.min.js" type="text/javascript"></script>
<script src="assets/components/msearch/js/mfilter.js" type="text/javascript"></script>Открываем страницу, где писутствует чанк, и… в консоли браузера получаем следующую ошибку:
Uncaught SyntaxError: Unexpected token <Становится ясно, что сниппет выдаёт не то, что ожидает JS-скрипт. Воспользуемся решением, которое предложил наш товарищ (см. ссылку в начале статьи):
UPD: решено комментированием первого вхождения строки в pdoPage
if (isset($_REQUEST[$pageVarKey]) && (!is_numeric($_REQUEST[$pageVarKey]) || ($_REQUEST[$pageVarKey] <= 1 && !$isAjax))) { //return $pdoPage->redirectToFirst($isAjax); }
Вроде работает, но… Пагинация начинает себя глупо вести. Заглянув в «иначе» (см. ниже elseif {… }), предлагаю вам такое решение, при котором всё будет работать чётко.
Конечно, очень бы не хотелось вносить изменения в сниппет, но пока другого решения проблемы не нашёл.
Необходимо в сниппете pdoPage найти условие (строки 56-62):
// Page
if (isset($_REQUEST[$pageVarKey]) && (!is_numeric($_REQUEST[$pageVarKey]) || ($_REQUEST[$pageVarKey] <= 1 && !$isAjax))) {
return $pdoPage->redirectToFirst($isAjax);
}
elseif (!empty($_REQUEST[$pageVarKey])) {
$page = (integer) $_REQUEST[$pageVarKey];
}и заменить строку return $pdoPage->redirectToFirst($isAjax); на $page = 1;P.S. Из условия можно сделать вывод, что если указать параметр ajax=1 при вызове mFilter должно всё работать, но не тут то было. В таком случае в консоли получаем следующую ошибку:
Uncaught TypeError: Cannot read property 'ms_color' of undefined mfilter.js:71 Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
У кого нет желания покупать, можно собрать из репозитория на GitHub.
Если кому интересно, дело в том что для вывода товаров mFilter использует хэш вида:
А ссылки на пагинации формируются с хэшем ?page=1, что при переходе по страницам даёт такой хэш:
Если вручную в адресной строке менять хэш:
то переход работает нормально.
Задача в том чтобы исправить генерацию ссылок на пагинации. Пока не знаю как это сделать, кроме как написать скрипт, который при загрузке страницы будет менять href у ссылок пагинации.
Если кто знает что можно сделать посредством php — подскажите, буду благодарна.
Пока копаю в сторону метода makePageLink в классе pdoPage, там есть условие:
но вот что именно с ним сделать пока не знаю.
Нафига ставить капельницы давно заброшенному проекту?
Готовый пакет лежит в ./core/packages/.
Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.
Куда проще — я не знаю.
Как я выше и советовал. Тогда не надо править пагинацию. Всё будет работать.