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

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

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

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

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

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

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


9 шагов для создания веб-сайта на HostCMS
9 шагов для создания веб-сайта на HostCMS

Вы можете создать веб-сайт менее чем за 1 час. Вам также не нужно быть техническим мастером.

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


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

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

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

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

QRcode

2010-2024 © Веб студия iNikSite.ru (г. Подольск). Все права сохранены.

Цены на сайте носят ознакомительный характер и не являются публичной офертой! Просим уточнять цены при отправке заявки в нашу компанию. У нас действуют специальные предложения и скидки на различные варианты исполнения заказа и 100% предоплату!

Мы используем файлы cookie. Они помогают улучшить ваше взаимодействие с сайтом.