Блог

HOSTCMS v.6. Поиск по сайту с показом карточки товара

Предлагаем готовый XSL-шаблон для показа в результатах поиска не только строкой ссылки на страницу с товаром, но и вывод самих товаров.
Вывод строковых ссылок можно закомментировать, если вы хотите показывать посетителям в результатах поиска только товары. 

Шаблон вывода непосредственно товара редактируется согласно вашему дизайну и вашим CSS стилям.

<?xml version=  "1.0» encoding=  "utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns= "http://www.w3.org/TR/xhtml1/strict"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding= "utf-8" indent= "yes"
method= "html" omit-xml-declaration= "no" version= "1.0" media-type= "text/xml"/>


<xsl:decimal-format name= "my" decimal-separator="," grouping-separator=""/>

<xsl:template match="/">
<xsl:apply-templates select="/site"/>
</xsl:template>

<xsl:template match="/site">

<!-- Форма поиска -->
<form method= "get" action="/search/">
<input id= "search_text" type= "text" size= "80" name= "text"
value="{query}" maxlength= "200" class= "input_buttom_search"/>&#xA0;
<input type= "submit" class= "input_buttom_search_button" value= "Искать"/>
</form>

<xsl:if test= "query!=''">
<p>
<strong>Найдено <xsl:value-of select= "total"/>&#xA0;
<xsl:call-template name= "declension">
<xsl:with-param name= "number" select= "total"/>
</xsl:call-template></strong>
</p>

<xsl:if test= "total!=0">
<div class= "shop_block">
<div class= "shop_table">
<ol start="{ (page) * limit + 1}">
<xsl:apply-templates select= "search_page">
</xsl:apply-templates>
</ol>
</div>
</div>

<!-- Строка ссылок на другие страницы результата поиска -->
<p>
<xsl:variable name= "count_pages" select= "ceiling (total div limit)"/>
<xsl:variable name= "visible_pages" select= "5"/>

<xsl:variable name= "real_visible_pages"><xsl:choose>
<xsl:when test="$count_pages &lt; $visible_pages">
<xsl:value-of select="$count_pages"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="$visible_pages"/></xsl:otherwise>
</xsl:choose></xsl:variable>

<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name= "pre_count_page"><xsl:choose>
<xsl:when test=" (page) — (floor ($real_visible_pages div 2)) &lt; 0">
<xsl:value-of select= "page"/>
</xsl:when>
<xsl:when test=" ($count_pages — (page) — 1) &lt; floor ($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages — ($count_pages — (page) — 1) — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test= "round ($real_visible_pages div 2) = $real_visible_pages div 2">
<xsl:value-of select= "floor ($real_visible_pages div 2) — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "floor ($real_visible_pages div 2)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose></xsl:variable>

<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name= "post_count_page"><xsl:choose>
<xsl:when test= "0 &gt; (page) — (floor ($real_visible_pages div 2) — 1)">
<xsl:value-of select="$real_visible_pages — (page) — 1"/>
</xsl:when>
<xsl:when test=" ($count_pages — (page) — 1) &lt; floor ($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages — $pre_count_page — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$real_visible_pages — $pre_count_page — 1"/>
</xsl:otherwise>
</xsl:choose></xsl:variable>

<xsl:variable name= "i"><xsl:choose>
<xsl:when test=" (page) + 1 = $count_pages">
<xsl:value-of select=" (page) — $real_visible_pages + 1"/></xsl:when>
<xsl:when test=" (page) — $pre_count_page &gt; 0">
<xsl:value-of select=" (page) — $pre_count_page"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose></xsl:variable>

<xsl:call-template name= "for">
<xsl:with-param name= "limit" select= "limit"/>
<xsl:with-param name= "page" select= "page"/>
<xsl:with-param name= "total" select= "total"/>
<xsl:with-param name= "i" select="$i"/>
<xsl:with-param name= "post_count_page" select="$post_count_page"/>
<xsl:with-param name= "pre_count_page" select="$pre_count_page"/>
<xsl:with-param name= "visible_pages" select="$real_visible_pages"/>
</xsl:call-template>

<div style= "clear: both"></div>
</p>
</xsl:if>
</xsl:if>

<xsl:if test= "query = ''">
<p>Введите поисковой запрос.</p>
</xsl:if>

</xsl:template>

<xsl:template match= "search_page">

<xsl:choose>
<!-- Если магазин (module = 3) и тип элемента товары (module_value_type = 2) -->
<xsl:when test= "module = 3 and module_value_type = 2">
<xsl:apply-templates select= "shop_item" mode= "shop" />
</xsl:when>
<xsl:otherwise>
<div class= "shop-search_pages">
<a href="{url}">
<xsl:value-of select= "title"/>
</a>
<br/>
<xsl:apply-templates select= "url"/>
&#xA0;·&#xA0; <xsl:value-of select= "size"/> Кб&#xA0;·&#xA0;
<xsl:value-of select= "date"/>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!-- Шаблон для товара -->
<xsl:template match= "shop_item" mode= "shop" >
<div class= "shop_item">
<div class= "shop_table_item">

<div class= "image_row">
<div class= "image_cell">
<a href="{url}">
<xsl:choose>
<xsl:when test= "image_small! = ''">
<img src="{dir}{image_small}" alt="{name}" title="{name}"/>
</xsl:when>
<xsl:otherwise>
<img src="/images/no-image.png" alt="{name}" title="{name}"/>
</xsl:otherwise>
</xsl:choose>
</a>
</div>
</div>

<div class= "description_row">
<div class= "description_sell">

<div class= "name">
<xsl:value-of disable-output-escaping= "yes" select= "name"/>
</div>

<div class= "price">
<!-- Цена товара -->
<xsl:choose>
<xsl:when test= "price! = 0">
<span><xsl:value-of select= "format-number (price, '### ##0', 'my')"/>
<xsl:text> </xsl:text><xsl:value-of select= "currency"/>
<xsl:text> </xsl:text></span>
</xsl:when>
<!-- Если цена со скидкой — выводим ее -->
<xsl:when test= "price_tax! = price">
<span class= "oldPrice">
<xsl:value-of select= "format-number (price_tax, '### ##0', 'my')"/>
<xsl:text> </xsl:text><xsl:value-of select= "currency" />
</span><xsl:text> </xsl:text></xsl:when>
<xsl:otherwise><span>под заказ</span></xsl:otherwise>
</xsl:choose>
</div>
</div>
</div>
</div>
</div>
<xsl:if test= "position () mod 3 = 0 and position ()! = last ()">
<div class= "clear" style= "height:16px;"></div>
</xsl:if>

</xsl:template>


<xsl:template name= "url" match= "text ()">
<xsl:param name= "str" select="."/>

<xsl:param name= "max">50</xsl:param>
<xsl:param name= "hvost">10</xsl:param>

<xsl:param name= "begin">
<xsl:choose>
<xsl:when test= "string-length ($str) &gt; $max">
<xsl:value-of select= "substring ($str, 1, $max — $hvost)"/>
</xsl:when>

<xsl:otherwise>
<xsl:value-of select= "substring ($str, 1)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>

<xsl:param name= "end">
<xsl:choose>
<xsl:when test= "string-length ($str) &gt; $max">
<xsl:value-of select= "substring ($str, string-length ($str) — $hvost + 1, $hvost)"/>
</xsl:when>

<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:param>


<xsl:param name= "result">
<xsl:choose>
<xsl:when test="$end! = ''">
<xsl:value-of select= "concat ($begin, '…', $end)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$begin"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>

<xsl:value-of disable-output-escaping= "yes" select="$result"/>

</xsl:template>

<!-- Цикл для вывода строк ссылок -->
<xsl:template name= "for">
<xsl:param name= "i" select= "0"/>
<xsl:param name= "limit"/>
<xsl:param name= "page"/>
<xsl:param name= "total"/>
<xsl:param name= "visible_pages"/>

<xsl:variable name= "url" select="/site/url"/>

<xsl:variable name= "n" select="$total div $limit"/>

<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name= "pre_count_page">
<xsl:choose>
<xsl:when test="$page &gt; ($n — (round ($visible_pages div 2) — 1))">
<xsl:value-of select="$visible_pages — ($n — $page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "round ($visible_pages div 2) — 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name= "post_count_page">
<xsl:choose>
<xsl:when test= "0 &gt; $page — (round ($visible_pages div 2) — 1)">
<xsl:value-of select="$visible_pages — $page"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test= "round ($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "round ($visible_pages div 2) — 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:if test="$i = 0 and $page! = 0">
<span class= "ctrl">
← Ctrl
</span>
</xsl:if>

<xsl:if test="$i >= $n and ($n — 1) > $page">
<span class= "ctrl">
Ctrl -->
</span>
</xsl:if>

<xsl:if test="$total &gt; $limit and $n &gt; $i">

<!-- Определяем адрес ссылки -->
<xsl:variable name= "number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i! = 0">page-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень — просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>

<!-- Ставим ссылку на страницу-->
<xsl:if test="$i! = $page">
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$page — $pre_count_page &gt; 0 and $i = 0">
<a href="{$url}?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">←</a>
</xsl:if>

<xsl:choose>
<xsl:when test="$i &gt;= ($page — $pre_count_page)
and ($page + $post_count_page) &gt;= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$url}{$number_link}?text={/site/queryencode}" class= "page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>

<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 &gt;= $n and $n &gt; ($page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n &gt; round ($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$url}page-{round ($n+1)}/?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">--></a>
</xsl:when>
<xsl:otherwise>
<a href="/page-{round ($n)}/?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">--></a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>

<!-- Ссылка на предыдущую страницу для Ctrl + влево -->
<xsl:if test="$page! = 0 and $i = $page">
<xsl:variable name= "prev_number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test=" ($page)! = 0">page-<xsl:value-of select="$i"/>/</xsl:when>
<!-- Иначе если нулевой уровень — просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>

<a href="{$url}{$prev_number_link}?text={/site/queryencode}" id= "id_prev"></a>
</xsl:if>

<!-- Ссылка на следующую страницу для Ctrl + вправо -->
<xsl:if test=" ($n — 1) > $page and $i = $page">
<a href="{$url}page-{$page+2}/?text={/site/queryencode}" id= "id_next"></a>
</xsl:if>

<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $page">
<span class= "current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>

<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name= "for">
<xsl:with-param name= "i" select="$i + 1"/>
<xsl:with-param name= "limit" select="$limit"/>
<xsl:with-param name= "page" select="$page"/>
<xsl:with-param name= "total" select="$total"/>
<xsl:with-param name= "visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>


<!-- Склонение после числительных -->
<xsl:template name= "declension">

<xsl:param name= "number" select= "number"/>

<!-- Именительный падеж -->
<xsl:variable name= "nominative">
<xsl:text>страница</xsl:text>
</xsl:variable>

<!-- Родительный падеж, единственное число -->
<xsl:variable name= "genitive_singular">
<xsl:text>страницы</xsl:text>
</xsl:variable>

<xsl:variable name= "genitive_plural">
<xsl:text>страниц</xsl:text>
</xsl:variable>

<xsl:variable name= "last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>

<xsl:variable name= "last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>

<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits! = 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits! = 12
or $last_digit = 3 and $last_two_digits! = 13
or $last_digit = 4 and $last_two_digits! = 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
HOSTCMS v.6. Поиск по сайту с показом карточки товара

Понравилась статья? Поделитесь

Вас может заинтересовать:

  • HOSTCMS v.6. Правильная семантическая микроразметка

    Не будем углубляться в терминологию и описание того, что означает микроразметка, т.к. об этом уже много чего написано и я беру за аксиому, что вы об этом уже знаете, раз читаете данную статью. Задача статьи описать более конкретный случай, а именно - использование микроразметки в XSL шаблонах HostCMS...

  • Вертикальное выпадающее меню на jQuery для HostCMS

    Простое вертикальное меню с плавно выпадающим подменю для сайтов на HostCMS. Работает на jQuery…

  • HostCMS v.6. Вертикальное меню на jQuery

    Простой пример левого вертикального выпадающего меню для групп товаров интернет магазина. Простая установка и настройка...

  • HOSTCMS v.6. Боковое выпадающее меню на CSS для каталога товаров

    Создадим раздвижное меню для каталога товаров с несколькими уровнями вложенности разделов. Меню будет открыто в основных разделах, лежащих в корневом каталоге. В принципе, вам нужно просто скопировать шаблон, CSS стили и пользоваться этим меню...

  • Мелкие "полезности" при работе с XSL

    Заметка для тех, кто начинает работать с языком XSL. Небольшие хитрости, которые моут быть полезны при написании сайтов.

    Подробную информацию о языке XSL можно узнать в онлайн учебнике на сайте w3schools.com...

  • HOSTCMS v.6. Полезные php коды

    Некоторые полезные php коды для вывода данных на странице сайта.

Наши услуги по созданию сайтов

WEB ДИЗАЙН

Разработка дизайна сайта. Использование шаблонов для "быстрых" проектов.

ПОДДЕРЖКА САЙТА

Поддержка работоспособности и безопасности. Написание текстов и статей. Наполнение товаром.

ШАБЛОНЫ САЙТОВ

Шаблоны интернет-магазинов и корпоративных сайтов на HostCMS

ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ

Графический дизайн (разработка логотипа). Написание seo-текстов. Редизайн сайта. Замена CMS. Кодинг