Для правильной работы макроса %system numpages()% необходимо передать ему общее количество элементов, и количество элементов на странице. Посмотрим в качестве примера xml-данные UData, возвращаемые макросом %news lastlist()%. Для этого нужно набрать в адресной строке следующее — http://ваш_сайт/udata/news/lastlist/vse_novosti
:
<udata module="news" method="lastlist" generation-time="0.417520">
<items>
<item id="9" ...>Российские пожарные спасли хомячка</item>
<item id="8" ...>В Курске сурка заменили хомяки</item>
<item id="7" ...>Инженерам удалось извлечь энергию из бега хомяка</item>
</items>
<archive_link>/vse_novosti/novosti_mira_homyachkov/</archive_link>
<total>3</total>
<per_page>10</per_page>
</udata>
Мы можем видеть, что после списка новостей (после ветки items
) находятся два элемента total
и per_page
, значением которых и будут искомые параметры. Эти два элемента присутствуют в ответе UData для любого макроса поддерживающего постраничный вывод.
Предположим, что у нас всего 25 элементов, а на страницу мы выводим по 10.
Просмотрим теперь ответ UData макроса %system numpages()% — наберем в адресной строке http://ваш_сайт/udata/system/numpages/25/10
:
<udata module="system" method="numpages" generation-time="0.034420">
<items>
<item link="?p=0&scheme=udata" is-active="1">1</item>
<item link="?p=1&scheme=udata" page-num="1">2</item>
<item link="?p=2&scheme=udata" page-num="2">3</item>
</items>
<toend_link page-num="2">?p=2&scheme=udata</toend_link>
<tonext_link page-num="1">?p=1&scheme=udata</tonext_link>
</udata>
Мы можем видеть ссылки на отдельные страницы по номерам, а также ссылку на следующую страницу, и ссылку на последнюю. Текущая страница может быть определена по атрибуту is-active="1"
.
Теперь наберем в адресной строке http://ваш_сайт/udata/system/numpages/25/10?p=1
и посмотрим, что изменилось:
<udata module="system" method="numpages" generation-time="0.030313">
<items>
<item link="?p=0&scheme=udata">1</item>
<item link="?p=1&scheme=udata" page-num="1" is-active="1">2</item>
<item link="?p=2&scheme=udata" page-num="2">3</item>
</items>
<tobegin_link page-num="0">?p=0&scheme=udata</tobegin_link>
<toend_link page-num="2">?p=2&scheme=udata</toend_link>
<toprev_link page-num="0">?p=0&scheme=udata</toprev_link>
<tonext_link page-num="2">?p=2&scheme=udata</tonext_link>
<current-page>1</current-page>
</udata>
Мы можем видеть, что теперь нам также стали доступны ссылки на начало и предыдущую страницу, и по-прежнему доступны ссылки на следующую и последнюю. Из приведенных двух примеров нетрудно предположить как выглядит ответ макроса при p=2
.
Предположим, что шаблон, где должен быть вызван пейджинг выглядит примерно следующим образом:
<xsl:template match="page" mode="news.lents">
<xsl:param name="doc-macroUData" select="document(concat('udata://news/lastlist/', $lent-id))"/>
<xsl:param name="doc-numpages" select="document(concat('udata://system/numpages/', $doc-macroUData/udata/total, '/', $doc-macroUData/udata/per_page, '/notemplate/p/10'))" />
</xsl:template>
XML-ответ макроса с постраничным выводом (в данном случае это %news lastlist()%) мы поместили в переменную, значение элементов total и per_page которой мы подставляем в вызов макроса %system numpages()%. Ответ этого макроса мы также записали в переменную. Теперь в том месте, где мы хотим отобразить пейджинг нам будет достаточно написать:
<xsl:apply-templates select="$doc-numpages" mode="paging.words" />
<xsl:apply-templates select="$doc-numpages" mode="paging.numbers" />
Мы задали два разных mode
для отображения ссылок "в начало | в конец" (paging.words
) и для отображения цифр (paging.numbers
). Теперь нам остается только описать шаблоны, обрабатывающие переменную $doc-numpages
. Эти шаблоны исключительно из соображений удобства вынесем в отдельный файл paging.xsl
, который подключим к основному файлу шаблонов.
Определить на какой именно странице мы находимся (начало, середина или конец), можно при помощи трех условий:
-
match="udata[not(tobegin_link) and toend_link]"
— обработает первую страницу. -
match="udata[tobegin_link and toend_link]"
— обработает страницы из середины списка. -
match="udata[tobegin_link and not(toend_link)]"
— обработает последнюю страницу.
Теперь опишем сами шаблоны. Добавим в файл paging.xsl
следующее:
<xsl:template match="udata[not(tobegin_link) and toend_link]" mode="paging.words">
<div class="paging-words">
<a>« В начало</a>
<a>« Предыдущая</a>
|
<a class="active" href="{tonext_link}">Следующая »</a>
<a class="active" href="{toend_link}">В конец »</a>
</div>
</xsl:template>
<xsl:template match="udata[tobegin_link and toend_link]" mode="paging.words">
<div class="paging-words">
<a class="active" href="{tobegin_link}">« В начало</a>
<a class="active" href="{toprev_link}">« Предыдущая</a>
|
<a class="active" href="{tonext_link}">Следующая »</a>
<a class="active" href="{toend_link}">В конец »</a>
</div>
</xsl:template>
<xsl:template match="udata[tobegin_link and not(toend_link)]" mode="paging.words">
<div class="paging-words">
<a class="active" href="{tobegin_link}">« В начало</a>
<a class="active" href="{toprev_link}">« Предыдущая</a>
|
<a>Следующая »</a>
<a>В конец »</a>
</div>
</xsl:template>
Для отображения списка страниц нам нужно обработать все элементы item
ветки items
. Добавим в файл paging.xsl
следующее:
<xsl:template match="udata[items]" mode="paging.numbers">
<div class="paging-numbers">
<table align="center">
<tbody>
<tr><td>
<span>Страницы:</span>
<xsl:apply-templates select="items" mode="paging.numbers" />
</td></tr>
</tbody>
</table>
</div>
</xsl:template>
<xsl:template match="item" mode="paging.numbers">
<a class="active" href="{@link}">
<xsl:value-of select="." />
</a>
</xsl:template>
<xsl:template match="item[@is-active = '1']" mode="paging.numbers">
<a>
<xsl:value-of select="." />
</a>
</xsl:template>
Условие match="item[@is-active = '1']"
позволит описать ссылку с номера с текущей страницы, тогда как match="items"
описывает все остальные.