Постраничная навигация результатов макроса data doSelection — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
Строка 31: | Строка 31: | ||
%system numpages(%total%, %per_page%,'default','n')% | %system numpages(%total%, %per_page%,'default','n')% | ||
</source> | </source> | ||
− | где %total% и %per_page% - стандартные макросы блока 'elements_block', выводящие общее число элементов и количество элементов на странице соответственно. | + | где: |
− | + | *%total% и %per_page% - стандартные макросы блока 'elements_block', выводящие общее число элементов и количество элементов на странице соответственно. | |
− | + | *default - шаблон для вывода результатов работы макроса %system numpages()% | |
+ | *'n' - Имя переменной, которая будет использоваться для задания номера страницы в URL в списке страниц. По умолчанию — символ "p". Например, ~/vse_novosti/?p=0 отобразит первую страницу ленты, ~/vse_novosti/?p=1 — вторую страницу, и так далее. | ||
=== Пишем кастомный макрос === | === Пишем кастомный макрос === | ||
Теперь, нам нужно чтобы макрос %data doSelection()% как-то взаимодействовал с переменной 'n' в адресной строке. | Теперь, нам нужно чтобы макрос %data doSelection()% как-то взаимодействовал с переменной 'n' в адресной строке. |
Версия 10:24, 3 октября 2013
Актуально для версии 2.9.1
Содержание
Задача
Стандартно, если добавить в шаблон макроса %data doSelection()% вывод постраничной навигации, то есть макрос %system numpages()%, то работать постраничная навигация, в полном смысле этого слова, не будет, она выведется, но результат выборки по Usel, полученный с помощью макроса %data doSelection()% реагировать на переключение страниц не будет.
Решение
Чтобы результат выборки реагировал на переключение страниц в постраничной навигации нужно будет каким-то образом корректировать выборку.
Модифицируем Usel шаблон
В первую очередь, добавляем в наш Usel тег <limit> с атрибутом page, и поставляем в значение тега и атрибута page индексированные параметры {1} и {2}, то есть добавляем в наш usel шаблон следующую строку:
<limit page="{1}">{2}</limit>
В качестве значения тега <limit> передается количество элементов, которые будут присутствовать в выборке. Атрибут page используется для того, чтобы указать, какую страницу данных вернуть в результате выборки.
Эта модификация дает нам возможно менять результат выборки, передавая в нее некоторые параметры, например, прямо в макрос %data doSelection()%:
%data doSelection('default','usel', '0', '10')%
где:
- default - имя шаблона, по которому мы выводим результат макроса %data doSelection()%
- usel - имя шаблона, по которому мы формируем Usel выборку
- 0 - значение атрибута page тега <limit> (первая страница)
- 10 - значение тега <limit> (10 элементов на странице)
Добавляем вызов %system numpages()%
Теперь мы можем железно задать количество элементов на странице и номер страницы, но нам нужно передавать значения, учитывающие работу макроса %system numpages()%.
Сначала мы добавляем в шаблон результатов работы макроса %data doSelection()%, в блок 'elements_block' вызов макроса %system numpages()%, со следующими параметрами:
%system numpages(%total%, %per_page%,'default','n')%
где:
- %total% и %per_page% - стандартные макросы блока 'elements_block', выводящие общее число элементов и количество элементов на странице соответственно.
- default - шаблон для вывода результатов работы макроса %system numpages()%
- 'n' - Имя переменной, которая будет использоваться для задания номера страницы в URL в списке страниц. По умолчанию — символ "p". Например, ~/vse_novosti/?p=0 отобразит первую страницу ленты, ~/vse_novosti/?p=1 — вторую страницу, и так далее.
Пишем кастомный макрос
Теперь, нам нужно чтобы макрос %data doSelection()% как-то взаимодействовал с переменной 'n' в адресной строке. Для этого напишем следующий кастомный макрос, в файле /classes/modules/custom.php:
public function getNumPage($numPage){
if(!@$_GET['n']){
$result = $numPage;
}
else $result = htmlspecialchars($_GET['n']);
if(is_numeric($result) === true){
return "$result";
}
else return 'i need number';
}
Работаем он следующим образом, если нет переменной 'n', макрос возвращает значение параметра, который в него передали, если такая переменная есть то получается её значение, если значение - число, макрос возвращает его, если нет, то макрос возвращает текст "i need number".
Модифицируем вызов макроса %data doSelection()%
Теперь изменяем вызов нашего макроса %data doSelection()% на следующий:
%data doSelection('default','usel', %custom getNumPage(0)%, '10')%
- В третий параметр мы передаем наш кастомный макрос, который, если мы находимся на 'первой странице' постраничной навигации принимаем значение,
указанное его параметром - "0"(то есть первая страница), а если мы перейдем на любую другую 'страницу' навигации, то макрос возвратит значение переменной 'n', которую поместит в адресную строку браузера макрос %system numpages()%.
- А четвертым параметром мы задаем сколько элементов мы хотим видеть на каждой "странице" постраничной навигации.
Результат
Выборки по Usel, получаемые при помощи макроса %data doSelection()% будут адекватно работать с постраничной навигацией, выводимой макросом %system numpages()%.