Логотип

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

Итак нам необходимо сверстать шаблон для вывода формы и набор шаблонов, которые будут заниматься оформлением результатов вывода.

Место, где будет выводиться форма мы укажем при помощи инструкции <xsl:apply-templates> и функции document().

Общий шаблон страниц

В главный шаблон разметки страницы добавим вызов макроса, а также объявим глобальный параметр search_string, в котором будет содержаться строка поиска после ввода формы (этот параметр будет присутствовать в URL).

Кроме того мы подключим пейджинг из дополнительного набора шаблонов, которые мы разместили в отдельном файле по адресу ~/xsltTpls/imports/paging.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" />

  
  <xsl:param name="search_string"/>

  
  <xsl:include href="imports/paging.xsl"/>

 <xsl:template match="/">
    <html>
      <head> ... </head>
      <body>

        
        <xsl:apply-templates select="document('udata://search/insert_form')/udata"/>

        <div class="content">
          <xsl:apply-templates select="result"/>
        </div>

      </body>
    </html>
 </xsl:template>
</xsl:stylesheet>

Шаблон вывода формы поиска

Форму мы будем выводить, обрабатывая результаты макроса %search insert_form()%, поэтому создадим соответствующий шаблон.

В этом шаблоне укажем результат последнего поиска, который мы получим из ответа макроса (элемент last_search_string), остальное — это просто HTML-код формы.

<xsl:template match="udata[@method = 'insert_form']">
  <div class="search_form">
    <form method="get" action="/search/search_do/">
      <input type="text" name="search_string" value="{last_search_string}"/>
      <input type="submit" value="Искать" />
    </form>
  </div>
</xsl:template>

Теперь, в любом месте где мы хотим вставить форму, достаточно написать:

<xsl:apply-templates select="document('udata://search/insert_form')/udata"/>

Выше мы вставили этот код для всех страниц сайта, добавив его в шаблон с match="/".

Шаблон страницы результатов поиска

На странице с адресом http://адрес_сайта/search/search_do/, куда будет совершен редирект после отправки данных формы, мы воспользуемся макросом %search search_do()%, который и вернет нам список результатов по текущему запросу.

Для того, чтобы идентифицировать эту страницу воспользуемся сведениями о том, что она отдается модулем "Поиск" и методом search_do.

<xsl:template match="result[@module = 'search'][@method = 'search_do']">

  
  

  

</xsl:template>

Для того, чтобы передать параметры, которые вернул макрос %search search_do()% макросу, который будет выводить пейджинг — %system numpages()%, создадим переменную $search-results, куда мы поместим XML-ответ макроса.

Далее отправим на обработку по шаблонам переменную с результатами поиска, и вызов макроса %system numpages()% с параметрами, полученными из этой переменной. Для построения запроса воспользуемся функцией concat():

<xsl:template match="result[@module = 'search'][@method = 'search_do']">

  
  <xsl:variable name="search-results" select="document('udata://search/search_do/')/udata" />

  
  <xsl:apply-templates select="$search-results"/>

  
  <xsl:apply-templates select="document(concat('udata://system/numpages/',
   $search-results/total, '/', $search-results/per_page, '/notemplate/p/3'))" mode="paging.numbers" />

</xsl:template>

Как сделать пейджинг рассказывается в отдельном топике — Постраничный вывод (пейджинг) стредствами XSLT-шаблонизатора

Шаблоны результатов поиска

В случае, если по указанному запросу найдены страницы сайта, в ответе макроса будут содержаться элементы item, вложенные в элемент items и описывающие каждый результат. В обратном случае их не будет. Воспользуемся этим условием, чтобы описать шаблон под каждый вариант.

Если результатов нет, выведем сообщение, что заданная строка не найдена. Отсутствие элементов item опишем условием [not(items/item)] в атрибуте match шаблона обработки результатов макроса:

<xsl:template match="udata[@module = 'search'][@method = 'search_do'][not(items/item)]">
  <div class="search_message">
    <xsl:text>По запросу </xsl:text>
    <span>&#171;<xsl:value-of select="$search_string" />&#187;</span>
    <xsl:text> ничего не найдено.</xsl:text>
  </div>
</xsl:template>

Теперь опишем шаблон, когда результаты есть:

<xsl:template match="udata[@module = 'search'][@method = 'search_do'][items/item]">
  <div class="search_message">
    <xsl:text>Найдено страниц: </xsl:text>
    <xsl:value-of select="total" />
  </div>

  <ul class="search_results">
      
  </ul>
</xsl:template>

Количество результатов содержится в элементе total, для того, чтобы оформить отдельный результат поиска, следует выбрать все элементы item при помощи <xsl:apply-templates select="items/item"> и создать шаблон оформления:

<xsl:template match="udata[@module = 'search'][@method = 'search_do'][items/item]">
  <div class="search_message">
    <xsl:text>Найдено страниц: </xsl:text>
    <xsl:value-of select="total" />
  </div>

  <ul class="search_results">
    <xsl:apply-templates select="items/item" mode="search.results"/>
  </ul>
</xsl:template>

<xsl:template match="item" mode="search.results" >
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name"/>
    </a>
    <xsl:value-of select="." disable-output-escaping="yes"/>
  </li>
</xsl:template>

Для каждого отдельного результата мы вывели значение атрибута name для элемента item, а также содержимое самого элемента item.