Блог

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. Поиск по сайту с показом карточки товара

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

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

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

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

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

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

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

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

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

  • Используем готовые шаблоны для сайтов

    Если вы сами не дизайнер и не можете пользоваться графическими программами или у вас нет средств на то, чтобы заказать разработку дизайна сайта профессиональному веб дизайнеру, или сайт нужен очень срочно, то в этом случае вам помогут готовые шаблоны сайтов. Или же уже готовые сайты...

  • HOSTCMS v.6. Краткая корзина в модальном окне

    Предлагаю вариант показа отложенного товара и содержимого краткой корзины в модальном окне в момент, когда Пользователь откладывает товар для совершения покупки. Решение делалось на основе встроенного в HostCMS адаптивного шаблона с подключеной библиотекой Bootstrap...

  • HOSTCMS v.6. Проверка вводимых данных при оформлении заказа

    В 6 версии разработчики убрали проверку вводимых данных в форму заказа на шаге заполнения адреса доставки. Предлагаю очень простое решение этой проблемы с использованием JavaScript. 

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

WEB ДИЗАЙН

Разработка дизайна и создание интернет-сайта.

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

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

ГОТОВЫЙ ДИЗАЙН

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

БОЛЬШЕ УСЛУГ

Разработка логотипа. Редизайн сайта. Замена вашей CMS на HostCMS. Калькуляторы. Формы.