[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
Так понимаю решение не найдено?
Решение давно есть — mSearch2.
У кого нет желания покупать, можно собрать из репозитория на GitHub.
У кого нет желания покупать, можно собрать из репозитория на GitHub.
Понятно, подход с напильником для старой версии mSearch.
Конечно, на новой всё гладко.
Меня и удивило что я давно пользуюсь msearch2 ещё с бета теста и меня все устраивает, а тут вдруг заговорили о проблемах.
У кого нет желания собирать из репозитория на GitHub, может просто поменять одну строчку в pdoPage. Правда после обновления пакета снова надо править. ;)
Собрать пакет — это скопировать из Github и запустить файл сборки. Но я предпочитаю поддерживать разработчиков копеечкой.
Нашла причину почему pdoPage ведёт себя «странно» после комментирования 42 строки:
то переход работает нормально.
Задача в том чтобы исправить генерацию ссылок на пагинации. Пока не знаю как это сделать, кроме как написать скрипт, который при загрузке страницы будет менять href у ссылок пагинации.
Если кто знает что можно сделать посредством php — подскажите, буду благодарна.
Пока копаю в сторону метода makePageLink в классе pdoPage, там есть условие:
if (isset($_REQUEST[$pageVarKey]) && (!is_numeric($_REQUEST[$pageVarKey]) || ($_REQUEST[$pageVarKey] <= 1 && !$isAjax))) {
//return $pdoPage->redirectToFirst($isAjax);
}
Если кому интересно, дело в том что для вывода товаров mFilter использует хэш вида: #ms_price%5B%5D=140--400&page=1&sort=ms_price%2Cdesc
А ссылки на пагинации формируются с хэшем ?page=1, что при переходе по страницам даёт такой хэш: ?page=2#ms_price%5B%5D=140--400&page=1&sort=ms_price%2Cdesc
Если вручную в адресной строке менять хэш:#ms_price%5B%5D=140--400&page=2&sort=ms_price%2Cdesc
то переход работает нормально.
Задача в том чтобы исправить генерацию ссылок на пагинации. Пока не знаю как это сделать, кроме как написать скрипт, который при загрузке страницы будет менять href у ссылок пагинации.
Если кто знает что можно сделать посредством php — подскажите, буду благодарна.
Пока копаю в сторону метода makePageLink в классе pdoPage, там есть условие:
if ($page > 1 || ($page == 1 && !empty($this->pdoTools->config['ajax']))) {
$href .= strpos($href, '?') !== false
? '&'
: '?';
$href .= $this->pdoTools->config['pageVarKey'] . '=' . $page;
}
но вот что именно с ним сделать пока не знаю.
Неужели это проще, чем взять готовый и проверенный mSearch2, который еще и регулярно обновляется?
Нафига ставить капельницы давно заброшенному проекту?
Нафига ставить капельницы давно заброшенному проекту?
Потому как проект не коммерческий и я за него ни копейки не получаю, следовательно приобрести платный компонент не могу, а собирать из гита даже понятия не имею как это делается =)
Перейти в директорию сайта в консоли сервера, затем набрать:
Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.
Куда проще — я не знаю.
mkdir ./Extras cd ./Extras git clone https://github.com/bezumkin/mSearch2.git php ./mSearch2/_build/build.transport.phpГотовый пакет лежит в ./core/packages/.
Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.
Куда проще — я не знаю.
Просто раньше не сталкивалась с этим и не доводилось разбираться. Казалось что всё намного сложнее. Огромное СПАСИБИЩЕ =)
Всё таки проще не закомментировать эту строку, а поменять на эту
$page = 1;
Как я выше и советовал. Тогда не надо править пагинацию. Всё будет работать.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.