[pdoTools] 1.9.6-rc Ajax пагинация в pdoPage
Предлагаю вам обновление pdoTools с одной очень интересной функцией — возможностью работы pdoPage через ajax.
С этого момент pdoPage может выдавать JSON и прерывать работу движка при соответствии запроса трём характеристикам:
На этом сайте и на bezumkin.ru все страницы с пагинацией уже переведены на работу через ajax — можно тестировать, а под катом вас ждёт готовый код для внедрения у себя.
Написать универсальный javascript для всех сайтов с пагинацией не представляется возможным, хотя бы потому, что я не знаю, какие у вас там используются идентификаторы на странице. Так что показываю готовый код с комментариями, который вы легко сможете адаптировать для себя.
Первым делом оборачиваем вызов pdoPage в блоки с идентификаторами:
Теперь вешаем javascript на эту разметку:
В итоге, вы получаете нормальную ajax навигацию в современных браузерах, с сохранением параметров в url, и обычную загрузку страниц поисковиками и древним IE6.
Вот еще пара наворотов, которые можно добавить после
1. Прокрутка контента страницы вверх:
2. Если вы используете мой сниппет Title, то неплохо бы эмулировать его работу и при ajax навигации.
Всем успешных ajax навигаций!
С этого момент pdoPage может выдавать JSON и прерывать работу движка при соответствии запроса трём характеристикам:
- Запрос сделан при помощи XMLHttpRequest, то есть — ajax.
- В запросе содержится переменная, указанная у сниппета в &pageVarKey. По умолчанию, это page.
- У сниппета включен параметр &ajax=`1`.
$.get('document.html?page=5', function(response) {
console.log(response);
}, 'json');И в ответ вы получите JSON c результатами работы, пагинацией и служебными данными: номер страницы, сколько всего страниц и сколько всего результатов.На этом сайте и на bezumkin.ru все страницы с пагинацией уже переведены на работу через ajax — можно тестировать, а под катом вас ждёт готовый код для внедрения у себя.
Написать универсальный javascript для всех сайтов с пагинацией не представляется возможным, хотя бы потому, что я не знаю, какие у вас там используются идентификаторы на странице. Так что показываю готовый код с комментариями, который вы легко сможете адаптировать для себя.
Первым делом оборачиваем вызов pdoPage в блоки с идентификаторами:
<div id="tickets-wrapper">
<div id="tickets-rows">
[[!pdoPage?
&element=`getTickets`
&parents=`0`
&ajax=`1`
]]
</div>
[[!+page.nav]]
</div>Внутри [[+page.nav]] у нас div с классом pagination — так в pdoPage по умолчанию.Теперь вешаем javascript на эту разметку:
// Работаем только при поддержке браузером History Api
if (window.history && history.pushState) {
var JustLoaded = true;
// Задаём функцию загрузки страницы
function loadPage(href) {
// Обёртка всего блока
var parent = $('#tickets-wrapper');
// Индикация загрузки контента
parent.css({opacity: .3});
// Если загружается первая страница, то у неё нет параметра ?page=1 -
// нужно добавить самостоятельно, иначе pdoPage не отзовётся
if (!href.match(/page=\d+/)) {
href += href.match(/\?/)
? '&page=1'
: '?page=1';
}
// Запрос на сервер по указанной ссылке
$.get(href, function(response) {
// Дальше работаем только если пришел нормальный ответ
if (response && response['total']) {
// Вставляем контент и пагинацию в заранее подготовленные элементы
parent.find('#tickets-rows').html(response['output']);
parent.find('.pagination').html(response['pagination']);
// Убираем индикацию загрузки
parent.css({opacity: 1});
}
}, 'json');
}
// Вешаем обработчик ссылок в нашей разметке на кнопки пагинации
$(document).on('click', '#tickets-wrapper .pagination a', function(e) {
e.preventDefault();
var href = $(this).prop('href');
history.pushState({href: href}, '', href);
loadPage(href);
JustLoaded = false;
});
// Вешаем обработчик на переключение кнопок браузера взад-вперёд
$(window).on('popstate', function(e) {
if (!JustLoaded && e.originalEvent.state && e.originalEvent.state['href']) {
loadPage(e.originalEvent.state['href']);
}
JustLoaded = false;
});
// При первой загрузке страницы помещаем в историю текущий адрес
history.replaceState({href: window.location.href}, '');
}Выглядит страшно, но если убрать все комментарии, то останется одна небольшая функция и 2 обработчика событий.В итоге, вы получаете нормальную ajax навигацию в современных браузерах, с сохранением параметров в url, и обычную загрузку страниц поисковиками и древним IE6.
Вот еще пара наворотов, которые можно добавить после
parent.css({opacity: 1});1. Прокрутка контента страницы вверх:
$('html, body').animate({
scrollTop: parent.position().top + 50 || 0
}, 0);К parent.position().top можно прибавить несколько пикселей для более точного позиционирования. На стандартной верстке Bootstrap3 нужно плюсовать высоту навигационной панели — 50px.2. Если вы используете мой сниппет Title, то неплохо бы эмулировать его работу и при ajax навигации.
var delimeter = ' / ';
var title = [];
var tmp = $('title').text().split(delimeter);
for (var i = 0; i < tmp.length; i++) {
if (i === tmp.length - 1 && response.page && response.page > 1) {
title.push('стр. ' + response.page + ' из ' + response.pages);
}
if (!tmp[i].match(/^стр\./)) {
title.push(tmp[i]);
}
}
$('title').text(title.join(delimeter));Всем успешных ajax навигаций!
Комментарии: 45
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как сделать лучше — не придумал.
ПашокПишу, так как в виде из коробки не работает. Стопориться как раз на запросе.
Что-то из этого ты упустил.
prntscr.com/5j94e2
prntscr.com/5j94il
Если штука сложная, готов проспонсировать доработку в стандартный pdoPage.
Заранее благодарен.
Или грузить сразу 6ю и 2 ссылки «загрузить до» и «загрузить после»?
И какой профит, по сравнению с нормальными страницами? Я его не вижу. Разве что радоваться, что «каквконтактике».
Сайт опрашивали анонимно. От 10к посещений в сутки. Сайт-каталог. 71,4% выбрали подгрузку товаров по кнопке, как наиболее удобную.
Это я не к тому, что я весь из себя прав. В блого-социальной нише пагинация функциональнее. Когда же речь идет о каталоге с фильтрами — клиентам незачем ссылаться на пагинацию, они скидывают ссылки на товар или лайкают во вконтактике или лицокниге.
Спасибо, что ответил.
- The “footer” of the page will be typically impossible to reach.
- Currently there is no way to cancel or opt-out of the behavior.
- There is no permalink to a given state of the page.
- Dynamically adding more content to the page increases the memory footprint of the browser. Depending on the browser, this could account for around 50megs of RAM.
- Analytics will not immediately capture the event, so custom configuration is required.
www.infinite-scroll.com/Для добавления «в коробку» нужно решить хотя бы основную проблему — прямую ссылку на страницу. Вконтакте есть хороший пример такой работы.
Если ты готов оплатить 3500 рублей, то я добавлю в pdoPage ajax навигацию двумя способами: по страницам и прокруткой.
Вконтакте схема немного другая. Там контент подгружается динамически при прокрутке по вертикали. Это действительно нагружает систему. Поэтому в каталогах используют кнопку «Показать еще 30 товаров». Они подгружаются на ту же страницу. Это ничем по ресурсоемкости не отличается от пагинации и в то же время очень удобно. Именно о таком решении я рассказывал.
Всё уже в работе, завтра постараюсь выложить новую версию.
Очень надеюсь, что не придётся объяснять — почему.
Сниппет пагинации должен принимать параметр с номером страницы, чтобы выводить те или иные ресурсы, в зависимости от него. Соотвественно, он должен вызываться всегда, при каждой загрузке страницы. А кэшированные сниппеты вызываются только один раз — в этом сам смысл кэширования.
Отсюда следует простейший вывод, что такие сниппеты, как pdoPage и getPage нельзя кэшировать в принципе, иначе они не будут работать.
modx.pro/help/5339/. Если не сложно, не могли бы вы подсказать, как правильно делать. А то приходится для фильтров использовать getProducts, а у него есть свои недостатки.
точнее все работает, в url ( /portfolio/?page=2), но идет перезагрузка общей страницы. А нужно что бы только перезагружалась область вывода ресурсов в определенном блоке на сайте.
то почему то 1 страница работает, на 2 переключает, но ресурсы не активные....((( как это сделать не понятно
При ajax-загрузке контента с помощью pdopage перестают работать скрипты слайдеров и галерей, потому что они работают только с контентом, который был загружен во время загрузки страницы. Перепробовал уже
$('body').on( 'click', '.btn-more', function() { });
и
pdoPage.callbacks['after'] = function(config, response) { };
и
$(document).ajaxSuccess(function() { };
ничто не отрабатывает правильно. При вызове обычного alert, изначально появляется модальное окно, а уже потом подгружается контент, из чего делаю вывод, что при клике по кнопке с классом .btn-more изначально загружаются скрипты, а уже потом подгружается контент с помощью ajax, с которым подгруженные скрипты уже не работают. Помогите понять как решить проблему
Получилось заставить работать галерею с помощью ajaxStop. Правда тут возникла другая сложность — после подгрузки контента ajax'ом функция, которая была отработана во время изначальной загрузки страницы продолжает работать и после загрузки контента ajax'ом, при этом дублируя результаты отработки после каждого нажатия на кнопку btn-more. Пока не могу понять как обнулить результаты отработки функции и одновременно снова загрузить скрипт.
код PDO page выдает ошибку после пагинации Array что не так
[[!pdoPage?
&element=`getTickets`
&tpl=`tpl.tickets.post`
&includeTVs=`tel,gorod,cena,vadelit,map,phototik,photo1`
&limit=`10`
&ajaxMode=`scroll`
&includeContent=`1`
]] [[!+page.nav]]