Разные результат [[!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'; и сразу находятся все товары.Но для меня важно чтобы пагинация работала без перезагрузки страницы.
Спасибо за ранее если кто то поможет.
Комментарии: 5
Вечно я какие-то «не те» вопросы задаю)
Запрос должен приходить по ajax тогда будет работать, вот из документации:
pdoPage может выдавать JSON и прерывать работу движка при соответствии запроса трём характеристикам:
- У сниппета включен параметр &ajax.
- Запрос сделан при помощи XMLHttpRequest, то есть — ajax.
- В запросе содержится переменная, указанная у сниппета в &pageVarKey. По умолчанию, это page.
Спасибо за направление, но уж простите не профессионала. Помогите и дальше, если не сложно.
Вот относительно моей ситуации.
Есть страница, в шаблоне которой есть div#result
Попадая на нее в первый раз внутри дива лежит вызов pdoPage, который выводит ну скажем 1 товар используя msProducts и пагинацию
На странице есть ссылки, позволяющие отсортировать результаты и это происходит через JQuery.post
При клике на ссылку считываем из нее параметры, передаем их в сниппет и там через switch выбираем что запустить и что вернуть.
К примеру так
На странице есть снипет который ловит ajax запросы, получает значение и через свитч вызывает тот или иной сниппет с нужными параметрами.
К примеру так
Мой сниппет возвращает $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 по моему запросу а пагинация перемещала по отобранным результатам.
Спасибо всем, кто хотя бы прочел это до конца.
Вот относительно моей ситуации.
Есть страница, в шаблоне которой есть 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 по моему запросу а пагинация перемещала по отобранным результатам.
Спасибо всем, кто хотя бы прочел это до конца.
Я посмотрел вчера как устроен сниппет pdoPage, я так понимаю при вызове он генерирует hash и config, что бы можно было использовать на странице несколько вызовов сниппета. Поэтому когда вы вызываете его в своем сниппете, то кроме того, что надо вставить html на страницу, надо еще и перевызвать метод из js pdoPage.initialize с новым config (его тоже надо сгенерировать), при этом старый как-то отменить или удалить, а так же записать hash в сессию.
Мне кажется тут проще свой вариант написать с пагинацией, чем переделывать pdoPage.
Мне кажется тут проще свой вариант написать с пагинацией, чем переделывать pdoPage.
Спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.