Логотип

Документация по макросам и шаблонам UMI.CMS

Для правильной работы макроса %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>«&nbsp;В начало</a>
      &nbsp;    
      <a>«&nbsp;Предыдущая</a>    
    &nbsp;&nbsp;|&nbsp;&nbsp;
      <a class="active" href="{tonext_link}">Следующая&nbsp;»</a>
    &nbsp;
    <a class="active" href="{toend_link}">В&nbsp;конец&nbsp;»</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}">«&nbsp;В начало</a>
      &nbsp;
      <a class="active" href="{toprev_link}">«&nbsp;Предыдущая</a>
    &nbsp;&nbsp;|&nbsp;&nbsp;
      <a class="active" href="{tonext_link}">Следующая&nbsp;»</a>
      &nbsp;
    <a class="active" href="{toend_link}">В&nbsp;конец&nbsp;»</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}">«&nbsp;В начало</a>
      &nbsp;
      <a class="active" href="{toprev_link}">«&nbsp;Предыдущая</a>
    &nbsp;&nbsp;|&nbsp;&nbsp;
      <a>Следующая&nbsp;»</a>
      &nbsp;
    <a>В&nbsp;конец&nbsp;»</a>
    </div>
</xsl:template>

Ссылки «1 2 3 ... »

Для отображения списка страниц нам нужно обработать все элементы 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" описывает все остальные.