Разные результат [[!pdoPage]] и $modx->runSnippet

Вопрос.
Вызываю в шаблоне
[[!pdoPage?
            &parents=`[[*id]]`
             &ajaxMode=`default`
    &element=`msProducts`
получаю как и ожидалось все товары этого родителя. Обратите внимание что вызываю с параметром &ajaxMode

Вызываю в снипете
$params['parents'] = $id;
		    $params['element'] = 'msProducts';	   
		    $params['ajaxMode'] = 'default';
		$res = $modx->runSnippet('pdoPage', $params);
		
		
		if ($res=='') {$res="Ничего не найдено";}
Тоесть тот же сниппет с теми же параметрами и получаю — ничего не найдено! Стоит заккоментировать строку $params['ajaxMode'] = 'default'; и сразу находятся все товары.
Но для меня важно чтобы пагинация работала без перезагрузки страницы.

Спасибо за ранее если кто то поможет.
Александр Мельник
08 июня 2017, 10:49
modx.pro
1 836
0

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

Александр Мельник
08 июня 2017, 18:17
0
Вечно я какие-то «не те» вопросы задаю)
    Андрей
    08 июня 2017, 18:57
    0
    Запрос должен приходить по ajax тогда будет работать, вот из документации:

    pdoPage может выдавать JSON и прерывать работу движка при соответствии запроса трём характеристикам:
    - У сниппета включен параметр &ajax.
    - Запрос сделан при помощи XMLHttpRequest, то есть — ajax.
    - В запросе содержится переменная, указанная у сниппета в &pageVarKey. По умолчанию, это page.
      Александр Мельник
      08 июня 2017, 20:58
      0
      Спасибо за направление, но уж простите не профессионала. Помогите и дальше, если не сложно.
      Вот относительно моей ситуации.
      Есть страница, в шаблоне которой есть div#result
      Попадая на нее в первый раз внутри дива лежит вызов pdoPage, который выводит ну скажем 1 товар используя msProducts и пагинацию
      <div id="result">
             
      [[!pdoPage?
      &parents=`[[*id]]`
        &sortby=`Data.price`
          &sortdir=`desc`
          &element=`msProducts`
          &limit=`1`
          
      ]]
      [[!+page.nav]]  
          </div>
      Попадаем на страницу и все отлично.
      На странице есть ссылки, позволяющие отсортировать результаты и это происходит через JQuery.post
      При клике на ссылку считываем из нее параметры, передаем их в сниппет и там через switch выбираем что запустить и что вернуть.
      К примеру так
      // обработка ссылок если они служат для аякс загрузки
      	$('.ajax_link').click(function() {
      		
      	var action = $(this).data('action');
      	var id_resource = $(this).data('id');
      	alert('Action '+action);	
      	$.post(document.location.href, {action: action, id_resource: id_resource}, function(data) {
      		
      		$('#result').html(data);
      	})
      	
      	return false;
        })
      при клике на ссылку получаем из нее id текущего ресурса и «указание» что делать и ajax ом передаем без перезагрузки на эту же страницу.
      На странице есть снипет который ловит ajax запросы, получает значение и через свитч вызывает тот или иной сниппет с нужными параметрами.
      К примеру так
      //******************************************************************************
      		case 'show_price_down': // показ товаров по цене от большей к меньшей
      		    $params['element'] = 'msProducts';
      		    $params['parents'] = $id;
      		    $params['sortby'] = 'Data.price';
      		    $params['sortdir'] = 'DESC';
      		    $params['limit'] = 1;
                  
      		$res = $modx->runSnippet('pdoPage', $params);
      	
      		if ($res=='') {$res="Ничего не найдено";}
      		    
      		break;
      Тоесть получили с сылки значение show_price_down и вызвали сниппет pdoPage с настройками, которые вернут нам товары, отсортированные по убыванию цены.
      Мой сниппет возвращает $res как строку.
      В ней лежит код выводящий товары.
      И этот код заменяет собой содержимое div#result
      В случае если работать без pdoPage все работает чудно. Я задаю ссылкам нужные мне значения атрибутов, ловлю их в сниппете. вызываю либо msProducts или pdoResorces с нужными настройками, передаваемыми в массиве $params и все работает как часики. Но без пагинации.
      Вызов pdoPage вызывает сложности.
      Пагинация по умолчанию выводится в плейсхолдер [[!+page.nav]]
      Если я указываю его за пределами div#result то пагинация корректно выводится только в первый заход на страницу, что логично. Когда я через аякс меняю выборку и вывожу уже не 100 товаров а 5, то я отлично переписываю содержимое div#result новыми пятью товарам, а строка с пагинацей остается не изменной. Она ведь за пределами контейнера и не сменилась при аякс запросе.
      Вношу плейсхолдер [[!+page.nav]] внутрь контейнера и ожидаемый результат. При аякс запросе пагинация просто исчезает. Что логично ведь она не содержится в переменной $res, в которой лежит результат отработки вызова снипета pdoPage. Делаю свой снипет на основе pdoPage и в return кроме отработки снипета методом конкатенации добавляю значение переменной $pagination в которой как раз и лежит код пагинации. Почти радуюсь ибо теперь с каждый аякс запросом моим возвращаются и товары и новая пагинация. Чудно! НО.
      При переходе по пагинации начинается вполне прогнозируемый сбой.
      Ведь URL не изменяется когда я получаю данные через аякс и страница называется www.site.ru/collection независимо от того выведео у меня сейчас все 100 товаров коллекции или 5, которые отобраны по аякс запросу которые есть на складе. И стоит перейти по пагинации я попадаю на URL типа www.site.ru/collection?page=2
      То есть пагинация идет по гет запросу и я вижу соверщенно не нужный мне результат. Я вижу вторую страницу не товаров которыя я отобрал а вторую страницу ВСЕХ товаров.
      Надеюсь я понятно поясняю, простите за длину.
      А вот попытка передать параметр ajaxMode при вызове снипета pdoPage внутри моего снипета приводит к тому, что он ничего не находит. Стоит убрать указание параметра ajaxMode и все работает чудно, но приводит к ошибкам указанным выше. Я вижу по коду снипета pdoPage что при передаче значения в него ajaxMode он просто вызывает пустой return? но пока не могу понять как с этим бороться.
      Как сделать чтобы на одном URL менялось содержимое тега div#result по моему запросу а пагинация перемещала по отобранным результатам.
      Спасибо всем, кто хотя бы прочел это до конца.
        Андрей
        09 июня 2017, 09:19
        +1
        Я посмотрел вчера как устроен сниппет pdoPage, я так понимаю при вызове он генерирует hash и config, что бы можно было использовать на странице несколько вызовов сниппета. Поэтому когда вы вызываете его в своем сниппете, то кроме того, что надо вставить html на страницу, надо еще и перевызвать метод из js pdoPage.initialize с новым config (его тоже надо сгенерировать), при этом старый как-то отменить или удалить, а так же записать hash в сессию.

        Мне кажется тут проще свой вариант написать с пагинацией, чем переделывать pdoPage.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5