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

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

Не хотите читать? Сядьте поудобней, либо займитесь другими делами и слушайте эту статью в наушниках или динамиках. Поехали! *

Предлагаем готовый 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. Полезные SQL запросы
HOSTCMS v.6. Полезные SQL запросы

Подборка SQL запросов к базе данных для сайтов на HostCMS v.6. Может быть очень полезной в некоторых случаях в пройцессе создания или обслуживания сайта...

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

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

HostCMS v.6. Вывод товаров по значению дополнительного свойства типа строка
HostCMS v.6. Вывод товаров по значению дополнительного свойства типа строка

Вам нужно вывести товары интернет-магазина по какому-то, заранее определенному, признаку? Для начала создаем дополнительное свойство товара, пройдя по цепочке «Интернет-магазин ⇒ Товар ⇒ Свойства товара».

HOSTCMS v.6. Вывод комментариев к товарам магазина
HOSTCMS v.6. Вывод комментариев к товарам магазина

Выводим на Главной или отдельной странице сайта комментарии к товарам, оставляемые посетителями или покупателями...

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

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

Разметка Open Graph для HostCMS v.6
Разметка Open Graph для HostCMS v.6

Для начала узнаем, что такое Open Graph? Open Graph - это протокол, который формирует вид внешней ссылки в социальных сетях. Первоначально этот протокол был разработан для Facebook, однако сейчас используется и в других соцсетях.

Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам обеспечивать вас лучшим контентом. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Отключение cookie-файлов может привести к неполадкам в работе сайта. Продолжая пользоваться сайтом без изменения настроек, вы даете согласие на использование ваших cookie-файлов. Это совершенно безопасно!