Собственная маршрутизация и pdoPage в mFilter2

Настроил собственную маршрутизацию по инструкции Василия.
У меня mFilter2 выбирает по значению какой-то тв-шке. То есть адрес такой:
/catalog/category/strana_franciya
в коде парсится последняя часть урла и выбирается по тв strana все товары со значением franciya. Так у меня выбираются по разным тв-шкам.

Всё прекрасно работает кроме пагинации — при перелистывании не срабатывает фильтр по какому-то одному признаку (тв-шке). То есть сбрасываются все значения и выводится абсолютно весь каталог не учитывая условие по тв-шке.

Пагинация у mFilter2 работает на ajax-е. При нажатии сбрасываются все значения и выводится весь каталог, в то время как при обычном обновлении на F5 страницы
/catalog/category/strana_franciya?page=2
то всё срабатывает правильно и фильтруется по нужно тв-шке и выводит вторую страницу.

Как решить эту проблему? Или как переключить у mFilter2 pdoPage на не-ajax-овскую?
Василий Столейков
16 сентября 2015, 07:35
modx.pro
2
2 475
+1

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

Василий Столейков
16 сентября 2015, 11:50
0
Можно ли отключить у mFilter2 ajax-пагинацию и оставить стандартную? Или как сохранить параметры поиска в mFilter2 при переключении страниц пагинации?
Или же я не в ту сторону копаю?
    Алексей
    16 сентября 2015, 15:33
    +1
    Столкнулся ровно с такой же проблемой. Пока не нашел решения.
    Василий Столейков
    17 сентября 2015, 10:52
    0
    Получилось убрать ajax-пагинацию просто убрав у списка ul в чанке tpl.mFilter2.outer следующее:
    id="mse2_pagination"
    Теперь пагинация стала стандартной, с перезагрузкой и добавляет к параметрам в адресной строке и название параметра, например вот так:
    /catalog/category/strana_franciya?page=2&strana=franciya
      Василий Наумкин
      17 сентября 2015, 12:36
      0
      Такое ощущение, что ты пропустил вот это место в моей статье:
      // Осталось выставить нужные переменные в запрос, как будто юзер их сам указал
      // Так как это mFilter2 - выставляем выбранный бренд
      $_GET['ms|vendor'] = $_REQUEST['ms|vendor'] = $id;

      В твоём случае нужно так же выставить уже выбранную страну в переменные PHP, чтобы pdoPage включил их в ссылку.
      // если с псевдонимами
      $_GET['country'] = $_REQUEST['country'] = $strana;
      // или если без них
      $_GET['tv|country'] = $_REQUEST['tv|country'] = $strana;

      Нет разницы, через ajax идёт запрос или нет — пляшет он всё равно от ссылки на страницу, которую формирует pdoPage.
        Василий Столейков
        17 сентября 2015, 13:16
        0
        В том-то и дело, что все нужные мне переменные я выставил в GET PHP, но глюки всё равно имели место…
        Вот место как они выставляются у меня:
        $_GET[$filter] = $_REQUEST[$filter] = $name;
                $_GET['parents'] = $_REQUEST['parents'] = $categoryId;
        Но работают они только на первой странице с ajax-ом…

        Вот весь код плагина, если нужно(там у меня идёт выборка тв-шек, их транслитерация, сравнивание транслита с урлом и т.д.):
        <?php
        ini_set("display_errors",1);
        error_reporting(E_ALL);
        if ($modx->event->name != 'OnPageNotFound') {return false;}
        $alias = $modx->context->getOption('request_param_alias', 'q');
        if (!isset($_REQUEST[$alias])) {return false;}
        
        $request = $_REQUEST[$alias];
        $tmp = explode('/', $request);
        
        if (count($tmp) >= 2) {
            
        	if (!$section = $modx->findResource($tmp[0] . '/')) {
        		return false;
        	}
        	
            $tmp2 = explode('_', $tmp[2]);
            $filter = $tmp2[0];
        	$name = str_replace('.html', '', $tmp2[1]);
        	
        	if ($tmp2[1] != $name || (isset($tmp[2]) && $tmp[2] == '')) {
        		$modx->sendRedirect($tmp[0] . '/' .$filter.'_'.$name);
        	}
        
        	if ($fltr = $modx->getObject('modTemplateVar', array('name' => $filter))) {
        
                $rus = array('А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я','а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я',' ');
                $lat = array('a','b','v','g','d','e','e','gh','z','i','y','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','sch','y','y','y','e','yu','ya','a','b','v','g','d','e','e','gh','z','i','y','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','sch','y','y','y','e','yu','ya','-');
            
                $in=$modx->runSnippet('msProducts', array('limit'=>'0', 'returnIds'=>'1'));
                $in = explode(",", $in);
        
            
                $tv = $modx->getObject('modTemplateVar', array('name' => $filter));
                $tv_name = $tv->get('name');
                $tv_desc = $tv->get('description');
                $tv_id = $tv->get('id');
                
                $q = $modx->newQuery('modTemplateVarResource');
                $q->where(array('tmplvarid' => $tv_id));
                $q->where(array('contentid:IN' => $in));
                $q->sortby('value', 'ASC');
                $q->select(array('DISTINCT modTemplateVarResource.value'));
                $q->prepare();
                $q->stmt->execute();
                $recipe = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
            
                $arr = array();
                foreach($recipe as $r)
                {
                    $rarr = explode("||", $r['value']);
                    foreach($rarr as $r2)
                    {
                        $arr[] = $r2;
                    }
            
                }
                $arr = array_unique($arr);
                if (!empty($arr)){
                    foreach($arr as $a) {
                        $latina = str_replace($rus, $lat, $a);
                        if($latina == $name) {
                            $name = $a;
                            $modx->setPlaceholder('pagetitle', $tv_desc.': '.$name);
                            break;
                        }
                    }
                }
        
        
        
                
                $_GET[$filter] = $_REQUEST[$filter] = $name;
        
                $categoryId = $modx->findResource($tmp[0] .'/'.$tmp[1].'/');
                $cat = $modx->getObject('modResource', $categoryId);
                $cattitle = $cat->get('pagetitle');
                $caturl = $modx->makeUrl($categoryId);
        
                $_GET['parents'] = $_REQUEST['parents'] = $categoryId;
        
        		$modx->setPlaceholder('longtitle', $parentId.$tv_desc.': '.$name);
        		$modx->setPlaceholder('category.title', $cattitle);
        		$modx->setPlaceholder('category.link', $caturl);
        		$modx->setPlaceholder('category.id', $categoryId);
        		$modx->setPlaceholder('category.fltr', $name);
        
        		$modx->sendForward($section);
        
        	}
        }
          Василий Наумкин
          17 сентября 2015, 13:20
          0
          Ну значит у меня как-то всё это магически до сих пор само работает на mamaboutique.

          Есть и посвежее пример, хоть и без mFilter2, но принцип тот же.
            Василий Столейков
            17 сентября 2015, 13:35
            0
            Нда, магия..

            Значит что-то где-то у меня.
            А может быть это потому что mFilter2 у тебя работает с минишоповскими брендами, а у меня по тв-шкам? (хотя это тоже бред, работать должно однозначно).
            Спасибо за помощь, и вообще, СПАСИБО ЗА ПРИМЕР СОБСТВЕННОЙ МАРШРУТИЗАЦИИ!
      Oleg Pimanov
      13 апреля 2017, 17:44
      0
      Если убрать id=«mse2_pagination», то в этом случае к пагинации не подцепляется параметр фильтрации?
        Oleg Pimanov
        13 апреля 2017, 17:47
        0
        Как быть в этом случае? Страница перезагружается и не сохраняет данные
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          10