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

Материал из Umicms
Перейти к:навигация, поиск
Строка 19: Строка 19:
 
%data doSelection('default','usel', '0', '10')%  
 
%data doSelection('default','usel', '0', '10')%  
 
</source>
 
</source>
где default - имя шаблона, по которому мы выводим результат макроса %data doSelection()%
+
где *default - имя шаблона, по которому мы выводим результат макроса %data doSelection()%
     usel - имя шаблона, по которому мы формируем Usel выборку
+
     *usel - имя шаблона, по которому мы формируем Usel выборку
     0 - значение атрибута page тега <limit> (первая страница)
+
     *0 - значение атрибута page тега <limit> (первая страница)
     10 - значение тега <limit> (10 элементов на странице)
+
     *10 - значение тега <limit> (10 элементов на странице)
 
=== Добавляем вызов %system numpages()% ===
 
=== Добавляем вызов %system numpages()% ===
 
Теперь мы можем железно задать количество элементов на странице и номер страницы, но нам нужно передавать значения, учитывающие работу макроса %system numpages()%.
 
Теперь мы можем железно задать количество элементов на странице и номер страницы, но нам нужно передавать значения, учитывающие работу макроса %system numpages()%.
Строка 57: Строка 57:
 
%data doSelection('default','usel', %custom getNumPage(0)%, '10')%  
 
%data doSelection('default','usel', %custom getNumPage(0)%, '10')%  
 
</source>
 
</source>
В третий параметр мы передаем наш кастомный макрос, который, если мы находимся на 'первой странице' постраничной навигации принимаем значение,
+
*В третий параметр мы передаем наш кастомный макрос, который, если мы находимся на 'первой странице' постраничной навигации принимаем значение,
 
указанное его параметром - "0"(то есть первая страница), а если мы перейдем на любую другую 'страницу' навигации, то макрос возвратит значение переменной 'n',
 
указанное его параметром - "0"(то есть первая страница), а если мы перейдем на любую другую 'страницу' навигации, то макрос возвратит значение переменной 'n',
 
которую поместит в адресную строку браузера макрос %system numpages()%.
 
которую поместит в адресную строку браузера макрос %system numpages()%.
 
+
*А четвертым параметром мы задаем сколько элементов мы хотим видеть на каждой "странице" постраничной навигации.
А четвертым параметром мы задаем сколько элементов мы хотим видеть на каждой "странице" постраничной навигации.
 
 
== Результат ==
 
== Результат ==
 
Выборки по Usel, получаемые при помощи макроса %data doSelection()% будут адекватно работать с постраничной навигацией, выводимой макросом %system numpages()%.
 
Выборки по Usel, получаемые при помощи макроса %data doSelection()% будут адекватно работать с постраничной навигацией, выводимой макросом %system numpages()%.

Версия 10:20, 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()%.