[mFilter] Работа сниппета с пагинатором pdoPage

Практически в каждом магазине есть и требуется вставлять фильтры. И так как в моём случае не требуется сильно сложных фильтров, я решил использовать компонент mSearch и входящий в него сниппет mFilter. Но при желании подружить фильтр с pdoPage столкнулся с некоторыми проблемами, причём не я один.

Попробуем же с вами подружить 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 февраля 2015, 06:18
modx.pro
1
4 732
+1
Поблагодарить автора Отправить деньги

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

Музалевский Виктор
15 февраля 2015, 06:43
0
Так понимаю решение не найдено?
    Василий Наумкин
    15 февраля 2015, 07:13
    0
    Решение давно есть — mSearch2.

    У кого нет желания покупать, можно собрать из репозитория на GitHub.
      Музалевский Виктор
      15 февраля 2015, 10:32
      0
      Понятно, подход с напильником для старой версии mSearch.
        Василий Наумкин
        15 февраля 2015, 10:38
        0
        Конечно, на новой всё гладко.
          Музалевский Виктор
          15 февраля 2015, 12:14
          +1
          Меня и удивило что я давно пользуюсь msearch2 ещё с бета теста и меня все устраивает, а тут вдруг заговорили о проблемах.
        Сергей Фещуков
        15 февраля 2015, 10:59
        0
        У кого нет желания собирать из репозитория на GitHub, может просто поменять одну строчку в pdoPage. Правда после обновления пакета снова надо править. ;)
          Музалевский Виктор
          15 февраля 2015, 12:17
          0
          Собрать пакет — это скопировать из Github и запустить файл сборки. Но я предпочитаю поддерживать разработчиков копеечкой.
      Хамка
      18 февраля 2015, 19:33
      0
      Нашла причину почему pdoPage ведёт себя «странно» после комментирования 42 строки:
      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;
      		}
      но вот что именно с ним сделать пока не знаю.
        Василий Наумкин
        18 февраля 2015, 19:52
        0
        Неужели это проще, чем взять готовый и проверенный mSearch2, который еще и регулярно обновляется?

        Нафига ставить капельницы давно заброшенному проекту?
          Хамка
          18 февраля 2015, 20:45
          0
          Потому как проект не коммерческий и я за него ни копейки не получаю, следовательно приобрести платный компонент не могу, а собирать из гита даже понятия не имею как это делается =)
            Василий Наумкин
            18 февраля 2015, 21:43
            3
            +1
            Перейти в директорию сайта в консоли сервера, затем набрать:
            mkdir ./Extras
            cd ./Extras
            git clone https://github.com/bezumkin/mSearch2.git
            php ./mSearch2/_build/build.transport.php
            
            Готовый пакет лежит в ./core/packages/.
            Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.

            Куда проще — я не знаю.
              Хамка
              18 февраля 2015, 22:23
              0
              Просто раньше не сталкивалась с этим и не доводилось разбираться. Казалось что всё намного сложнее. Огромное СПАСИБИЩЕ =)
          Сергей Фещуков
          18 февраля 2015, 21:25
          0
          Всё таки проще не закомментировать эту строку, а поменять на эту
          $page = 1;
          Как я выше и советовал. Тогда не надо править пагинацию. Всё будет работать.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13