Пэйджинг объектов, которые фильтруются с помощью usel на XSLT

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

Задача

Сделать разбивку на страницы объектов, которые фильтруются с помощью usel.

Идея решения

Будем использовать тэг <limit> и макрос %system numpages()%.

Решение

1. В usel-запросе необходимо описать условие аналогичное следующему:

<limit page="{1}">5</limit>

где {1} - это номер страницы, который будет передаваться, а 5 - количество объектов на странице.

2. Опишим параметр, который будет передавать номер страницы. Его описание должно быть до тэга <xsl:template match="/">

<xsl:param name="p" />

3. Для использования макроса %system numpages()% нам необходимо знать общее количество товаров, которые отобраны с помощью usel-запроса. Запишем данное число в переменную:

<xsl:variable name="total" select="document('usel://test')/udata/total"/>

Это выражение необходимо описывать в самом начале шаблона.

4. В нужном месте опишем пэйджинг с помощью следующего выражения:

<xsl:apply-templates select="document(concat('udata://system/numpages/', $total, '/5'))/udata/items" mode="page"/>    

где 5 - кол-во товаров на странице.

5. Напишем шаблон для обработки пэйджинга:

<xsl:template match="items/item" mode="page">
    <a href="{@link}"><xsl:value-of select="."/></a>
</xsl:template>	

6. Опишем вызов usel-запроса и передадим в него значение страницы:

<xsl:apply-templates select="document(concat('usel://test/', $p, '/'))/udata"/>

7. Осталось вывести объекты отобранные с помощью usel-запроса. Например, если это объекты каталога, то можно сделать так:

<xsl:template match="udata" mode="test">
     <xsl:apply-templates select="item" mode="test"/>
</xsl:template>
<xsl:template match="udata/item" mode="test">
     <xsl:value-of select="@name"/>
</xsl:template>