как добавить картинку и артикуль в поиске(не в фильтре) ?

#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
да всё верно, я также указал, но при этом ничего не стало выводится, если указываю так

<xsl:if test="item/small_image!=''">
<br />IMG: [<xsl:value-of select="item/small_image"/>]{item/small_image}
</xsl:if>


то данные выводятся, такого вида

# Инструмент для снятия AIRBAG
IMG: [/upload/shop_10/0/8/5/8/item_858/small_car_8584_s.jpg]{item/small_image}
Артикул: CT-8584
URL: http://car-tool.ru/catalog/tools-car/ct-8584/
Дата добавления: 21.07.2010 22:59:50

# Инструмент для снятия катушек
IMG: [/upload/shop_10/0/9/9/2/item_992/small_ct_1401_04_tool_s.jpg]{item/small_image}
Артикул: CT-1401-01
URL: http://car-tool.ru/catalog/audi-vw-tools…vw-tool-1/
Дата добавления: 01.02.2011 22:58:16

# Инструмент для двигателей Ford
IMG: [/upload/shop_10/0/8/4/8/item_848/small_car_a1150_s.jpg]{item/small_image}
Артикул: CT-A1150
URL: http://car-tool.ru/catalog/ford-tools/ford-tool/
Дата добавления: 20.07.2010 02:07:54


по этой ссылке видно
http://car-tool.ru/search/?text=%E8%ED%F1%F2%F0%F3%EC%E5%ED%F2

получается что тег {item/small_image} вообще не обрабатывается, а выводится как есть

а если указываю так
<a href="{page_address}"><img src="{item/small_image}"></a>

в этом случаи вообще ничего не выводится
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
После внесения в код строки:
<a href="{page_address}"><img src="{item/small_image}"></a>

приведите получившийся код XSL-шаблона полностью.
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?

<?xml version="1.0" encoding="windows-1251"?>
<!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="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <xsl:template match="/">
      <xsl:apply-templates select="/document"/>
   </xsl:template>
   
   <xsl:template match="/document">
      
      <!-- Форма поиска -->
   <p>Задайте поисковый запрос и нажмите кнопку Enter. Например: <a href="http://car-tool.ru/search/?text=%D1%EF%E5%F6%E8%ED%F1%F2%F0%F3%EC%E5%ED%F2++%E4%EB%FF+%F1%F2%FF%E6%EA%E8+%EF%F0%F3%E6%E8%ED">специнструмент для стяжки пружин</a></p>
      <form method="get" action="/search/">
         <input type="text" size="80" name="text" value="{search_query}" maxlength="200" class="input_buttom_search"/>&#xA0;
         <input type="submit" class="input_buttom_search_button" value="Найти"/>
      </form>
      
      <xsl:if test="search_query!=''">
         <p>
            <strong>Нашлось <xsl:value-of select="count_items"/>&#xA0;<xsl:call-template name="declension">
            <xsl:with-param name="number" select="count_items"/></xsl:call-template></strong></p>
         
         <xsl:if test="count_items!=0">
            <ol start="{(current_page - 1) * items_on_page + 1}" class="search">
               <xsl:apply-templates select="item">
               </xsl:apply-templates>
            </ol>
            
            <!-- Строка ссылок на другие страницы результата поиска -->
            
            <!--<xsl:call-template name="for">
               <xsl:with-param name="n" select="count_items div items_on_page"/>
               <xsl:with-param name="current_page" select="current_page - 1"/>
            </xsl:call-template>-->
            <xsl:if
               test="count_items &gt; 10 and items_on_page &lt; count_items">
               <div id="al"><div class="n2" id="ar">Страницы:
                     <xsl:call-template name="for">
                        <xsl:with-param name="items_on_page" select="items_on_page"/>
                        <xsl:with-param name="current_page" select="current_page - 1"/>
                        <xsl:with-param name="count_items" select="count_items"/>
                        <xsl:with-param name="visible_pages">5</xsl:with-param>
                     </xsl:call-template>
            </div></div></xsl:if>
            
            
         </xsl:if>
      </xsl:if>
      
      <xsl:if test="search_query = ''">
      </xsl:if>
   </xsl:template>
   
   <xsl:template match="item">
      <li>
         <a href="{page_address}">
            <xsl:value-of select="page_name"/>
         </a>
         

<xsl:if test="item/small_image!=''">
<br /><a href="{page_address}"><img src="{item/small_image}"></a>
</xsl:if>

<xsl:if test="item/marking_of_goods!=''">
<br />Артикул: <xsl:value-of select="item/marking_of_goods"/>
</xsl:if>
         <br/>URL:
         
         <!--<xsl:value-of select="page_address" />-->
         <xsl:apply-templates select="page_address"/><br />Дата добавления: <xsl:value-of select="page_date"/><br/></li>
   </xsl:template>
   
   <xsl:template name="page_address" 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="prefix">page</xsl:param>
      <xsl:param name="items_on_page"/>
      <xsl:param name="current_page"/>
      <xsl:param name="count_items"/>
      <xsl:param name="visible_pages"/>
      
      <xsl:variable name="n" select="$count_items div $items_on_page"/>
      
      <!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
      <xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id"/>
      
      
      <!-- Считаем количество выводимых ссылок перед текущим элементом -->
      <xsl:variable name="pre_count_page">
         
         <xsl:choose>
            <xsl:when test="$current_page &gt; ($n - (round($visible_pages div 2) - 1))">
               <xsl:value-of select="$visible_pages - ($n - $current_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; $current_page - (round($visible_pages div 2) - 1)">
               <xsl:value-of select="$visible_pages - $current_page - 1"/>
            </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 $current_page != 0"> &#8592; Ctrl </xsl:if>
      <xsl:if test="$i >= $n and ($n - 1) > $current_page"> Ctrl &#8594; </xsl:if>
      
      <xsl:if test="$count_items &gt; $items_on_page and $n &gt; $i">
         
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="number_link">
            <xsl:choose>
               <!-- Если не нулевой уровень -->
               <xsl:when test="$i != 0">&amp;<xsl:value-of select="$prefix"/>=<xsl:value-of select="$i + 1"/></xsl:when>
               <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
               <xsl:otherwise></xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
         
         
         <!-- Ставим ссылку на страницу-->
         <xsl:if test="$i != $current_page">
            <!-- Выводим ссылку на первую страницу -->
            <xsl:if test="$current_page - $pre_count_page &gt; 0 and $i = 0">
               <a href="./?text={search_query_url}"></a>
            </xsl:if>
            
            <xsl:choose>
               <xsl:when test="$i &gt;= ($current_page - $pre_count_page) and ($current_page + $post_count_page) &gt;= $i">
                  <!-- Выводим ссылки на видимые страницы -->
                  <a href="./?text={search_query_url}{$number_link}">
                     <xsl:value-of select="$i + 1"/>
               </a>&#xA0;</xsl:when>
               <xsl:otherwise></xsl:otherwise>
            </xsl:choose>
            
            <!-- Выводим ссылку на последнюю страницу -->
            <xsl:if test="$i+1 &gt;= $n and $n &gt; ($current_page + 1 + $post_count_page)">
               <xsl:choose>
                  <xsl:when test="$n &gt; round($n)">
                     <!-- Выводим ссылку на последнюю страницу -->
                     <a href="./?text={search_query_url}&amp;{$prefix}={round($n+1)}"></a>
                  </xsl:when>
                  <xsl:otherwise>
                     <a href="./?text={search_query_url}&amp;{$prefix}={round($n)}"></a>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:if>
         </xsl:if>
         
         
         
         <!-- Ссылка на предыдущую страницу для Ctrl + влево -->
         <xsl:if test="$current_page != 0 and $i = $current_page">
            <xsl:variable name="prev_number_link">
               <xsl:choose>
                  <!-- Если не нулевой уровень -->
                  <xsl:when test="($current_page - 1) != 0">&amp;<xsl:value-of select="$prefix"/>=<xsl:value-of select="$i"/></xsl:when>
                  <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
                  <xsl:otherwise></xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
            <a href="./?text={search_query_url}{$prev_number_link}" id="id_prev"></a>
         </xsl:if>
         
         <!-- Ссылка на следующую страницу для Ctrl + вправо -->
         <xsl:if test="($n - 1) > $current_page and $i = $current_page">
            <a href="./?text={search_query_url}&amp;{$prefix}={$current_page+2}" id="id_next"></a>
         </xsl:if>
         
         <!-- Не ставим ссылку на страницу-->
         <xsl:if test="$i = $current_page">
            
            <xsl:value-of select="$i+1"/>&#xA0;</xsl:if>
         
         <!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
         <xsl:call-template name="for">
            <xsl:with-param name="i" select="$i + 1"/>
            <xsl:with-param name="prefix" select="$prefix"/>
            <xsl:with-param name="items_on_page" select="$items_on_page"/>
            <xsl:with-param name="current_page" select="$current_page"/>
            <xsl:with-param name="count_items" select="$count_items"/>
            <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>
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
AndryNK, а тег img кто закрывать будет?
Я-то вам показал как сделать вывод внутри параметра, даже и внимания не обратил на то что у вас тег img не закрыт - Это вообще какая-то детская ошибка, правиьно закрывать теги - это же азы валидной верстки!
Раз у вас тег не закрыт, то нарушается вся структура вложенности тегов в xsl-шаблоне, и тогда xslt-процессор не может этого переварить и выдает пустую страницу.

Надо так:
<a href="{page_address}"><img src="{item/small_image}"/></a>


А писать внутри значения атрибута конструкцию value-of - это, простите, бред! value-of используется при обычном выводе, а если мы выводим значение какого-либо атрибута для html-тега, то вместо value-of используются фигурные скобки, что я вам и показал в примере.

Учите матчасть!

P.S. Smarty - унылое говно!
Заказов не беру. Консультирую редко.
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
спасибо, так заработало.
Я благодарен вам за помощь, но с тем что вы так лесно высказались против Смарти я с вами не соглашусь, спорить я думаю тут не очём, это дело каждого, кому что больше нравиться.

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

Но я знаю одно, что столкнувшийся с XSL, это мой первый и последний случай, то больше с ним связываться не собираюсь. Это ведь не второй язык программирования, и ужасающие вставки, только отпугивают, верстальщика. Нет полной свободы, куда не коснись, не то напиши, и не знаешь, сработает или нет.
Насчёт правильности закрытия тегов, есть парные, вот их и нужно закрывать, но чтобы закрывать одиночные вроде br,img не вижу ни какого смысла, столько лишних символов...
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
AndryNK писал(а):
но чтобы закрывать одиночные вроде br,img не вижу ни какого смысла, столько лишних символов…
Я так понимаю, что строка
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 "
вам тоже ни о чем не говорит. Так же как и слова "стандарт" и "валидная верстка".

AndryNK писал(а):
и ужасающие вставки, только отпугивают, верстальщика
Значит вы такой пугливый верстальщик.

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

Впрочем, вы не первый адепт Смарти на данном форуме Б-г с вами
Заказов не беру. Консультирую редко.
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
ну эта строчка один раз пишется, изначально выбрав подходящий стандарт. Насчёт пугливости, ну не знаю, просто привык писать как можно меньше кода, и простым методом.
XSLT может чем то интересен, но это как уже говорил для каждого своё, спорить у меня даже чёто нету желания, всё равно будет компромисс. Ну до ладно.

кстати вот ещё хотел спросить, допустим имеется у нас в строке УРЛ, некий параметр ну например site.ru?agr=1
как получить его значение внутри xsl шаблоне?
в нативном шаблоне можно получить так $_GET['agr'] а в xsl есть подобная возможность, или нужно через динамическую страницу передавать значение?

в динамической странице у меня имеется такое

if (to_int($_GET['agr']) > 0)      
{
...
$external_propertys['agr'] = $_GET['agr'];    
$external_propertys['apply_filter'] = true;  
}  
   
как я понимаю $external_propertys['agr'] получает значение параметра и передаёт в xsl шаблон, а как его внутри шаблона получить?

смысл в том что нужно сделать условие, если присутствует значение данного параметра, сделать вывод нужного блока, иначе не отображать

както так
<xsl:if test="agr != 0">
тут выводим блок
</xsl:if>

сработает?
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
AndryNK писал(а):
ну эта строчка один раз пишется, изначально выбрав подходящий стандарт.
Пишется-то она один раз, но она же и определяет что непарные теги типа img и br таки надо закрывать. Не надо было только в HTML 4.0.

По приведенному вами коду - в целом ход мылси правильный, но два уточнения:
if (to_int($_GET['agr']) > 0)      
{
...
$external_propertys['agr'] = to_int($_GET['agr']);  // так надежнее ;)
$external_propertys['apply_filter'] = true;  
}  
и
<xsl:if test="/shop/agr != 0">
тут выводим блок
</xsl:if>
для того чтобы это условие работало в любом темплейте. То которое указали вы будет правильно работать только в template match="shop" и template match="/shop", т.к. параметры передаваемые через external propertys в xml-документе являются прямыми потомками корневого узла /shop
Заказов не беру. Консультирую редко.
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
спасибо за наводку
насчёт to_int() я уже думал, но вот руки не доходили, сейчас поправил.

Вот пробую сейчас
<xsl:if test="count(item) &lt; 1 and /shop/autoid != 0 or /shop/agr != 0">
тут выводим блок
</xsl:if>


но вот как-то не то, в случаи если записей не имеется, то как мне кажется последующие условия /shop/autoid != 0 or /shop/agr != 0 уже не срабатывают(не видятся), поскольку значения они не имеют, и сравнивать уже не удаётся.
Можно как то проверить параметры не зависимо имеются записи или нет?

Смысл в чём, если находишься по адресу
http://car-tool.ru/catalog/
то по середине, блок каталога должен выводится, а при нахождении по адресу
http://car-tool.ru/catalog/?autoid=145&agr=160
этот блок должен исчезнуть, за место него должно выводиться только запись "Не найдено инструмента по данному запросу." эта запись выводится исправно как и должно, вот только каталог убрать не удаётся.


Запись выводится при условии
<xsl:if test="count(item) &lt; 1 and apply_filter = 1">
Не найдено инструмента по данному запросу.
</xsl:if>


Вообщем каталог должен выводится именно только на одной странице
http://car-tool.ru/catalog/
на всех других его не должно быть
#
Re: как добавить картинку и артикуль в поиске(не в фильтре) ?
AndryNK, попробуйте так:
xsl:if test="count(item) &lt; 1 and (shop/autoid != 0 or /shop/agr != 0)">
тут выводим блок
</xsl:if>

и я бы еще немного оптимизировал проверку отсутствия записей:
xsl:if test="not(item/node()) and (/shop/autoid != 0 or /shop/agr != 0)">
тут выводим блок
</xsl:if>
второй вариант будет работать быстрее чем первый

И хорошо бы еще в ТДС передавать для этого параметра значение по умолчанию, чтобы в xsl не заморачиваться не проверку его существования:

$external_propertys['agr'] = 0;
if (to_int($_GET['agr']) > 0)      
{
...
$external_propertys['agr'] = to_int($_GET['agr']);  // так надежнее ;)
$external_propertys['apply_filter'] = true;  
}  
Заказов не беру. Консультирую редко.
Авторизация