Постраничная навигация результатов макроса data doSelection — различия между версиями
Mad grant (обсуждение | вклад)  | 
				Mad grant (обсуждение | вклад)   | 
				||
| (не показаны 4 промежуточные версии этого же участника) | |||
| Строка 19: | Строка 19: | ||
%data doSelection('default','usel', '0', '10')%    | %data doSelection('default','usel', '0', '10')%    | ||
</source>  | </source>  | ||
| − | где *default - имя шаблона, по которому мы выводим результат макроса %data doSelection()%  | + | где:  | 
| − | + | *default - имя шаблона, по которому мы выводим результат макроса %data doSelection()%  | |
| − | + | *usel - имя шаблона, по которому мы формируем Usel выборку  | |
| − | + | *0 - значение атрибута page тега <limit> (первая страница)  | |
| + | *10 - значение тега <limit> (10 элементов на странице)  | ||
=== Добавляем вызов %system numpages()% ===  | === Добавляем вызов %system numpages()% ===  | ||
Теперь мы можем железно задать количество элементов на странице и номер страницы, но нам нужно передавать значения, учитывающие работу макроса %system numpages()%.  | Теперь мы можем железно задать количество элементов на странице и номер страницы, но нам нужно передавать значения, учитывающие работу макроса %system numpages()%.  | ||
| Строка 30: | Строка 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' в адресной строке.  | ||
| Строка 39: | Строка 41: | ||
public function getNumPage($numPage){  | public function getNumPage($numPage){  | ||
| − | 		if(!  | + | 		if(!isset($_GET['p'])){  | 
			$result = $numPage;  | 			$result = $numPage;  | ||
		}  | 		}  | ||
| Строка 63: | Строка 65: | ||
== Результат ==  | == Результат ==  | ||
Выборки по Usel, получаемые при помощи макроса %data doSelection()% будут адекватно работать с постраничной навигацией, выводимой макросом %system numpages()%.  | Выборки по Usel, получаемые при помощи макроса %data doSelection()% будут адекватно работать с постраничной навигацией, выводимой макросом %system numpages()%.  | ||
| + | == Полезные ссылки ==  | ||
| + | *Документация по протоколу Usel [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/]  | ||
| + | *Документация по макросу %data doSelection()% [http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/shablony_dannyh/data_doselection/]  | ||
| + | *Документация по макросу %system numpages()% [http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_numpages/]  | ||
Текущая версия на 07:28, 17 октября 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(!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()%.