Постраничная навигация результатов макроса data doSelection

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 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(!isset($_GET['p'])){
			$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()%.

Полезные ссылки

  • Документация по протоколу Usel [1]
  • Документация по макросу %data doSelection()% [2]
  • Документация по макросу %system numpages()% [3]