Итак нам необходимо сверстать шаблон для вывода формы и набор шаблонов, которые будут заниматься оформлением результатов вывода.
Место, где будет выводиться форма мы укажем при помощи инструкции <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>«<xsl:value-of select="$search_string" />»</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
.