Три последовательно идущих товара в одном DIV

#
Три последовательно идущих товара в одном DIV
Здравствуйте.
Подскажите, пожалуйста, каким образом можно реализовать в xml-шаблоне "МагазинКаталогТоваров" следующий вывод:

<div class="row">
   <div class="shop-item"></div>
   <div class="shop-item"></div>
   <div class="shop-item"></div>
</div>
<div class="row">
   <div class="shop-item"></div>
   <div class="shop-item"></div>
   <div class="shop-item"></div>
</div>


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

Заранее спасибо
#
Re: Три последовательно идущих товара в одном DIV

<div class="shop-item"></div>
<xsl:if test="position() mod 3 = 0">
</div>
<div class="row">
</xsl:if>
Модератор
#
Re: Три последовательно идущих товара в одном DIV
Arkadiy,
так работать не будет
#
Re: Три последовательно идущих товара в одном DIV
HostCMS, а как будет?
#
Re: Три последовательно идущих товара в одном DIV
HostCMS писал(а):
так работать не будет

чувство юмора у вас хорошее, почему бы сразу не подсказать верное решение?

<!-- ловим первый элемент -->
<xsl:if test="position() = 0">
&ltdiv class="row"&gt;
</xsl:if>

<div class="shop-item"></div>

<xsl:if test="position() < last() and position() mod 3 = 0">
&lt;/div&gt;
&ltdiv class="row"&gt;
</xsl:if>

<!-- ловим последний элемент -->
<xsl:if test="position() = last()">
&lt;/div&gt;
</xsl:if>
разработка сайтов, фирменных стилей, интерфейсов
Модератор
#
Re: Три последовательно идущих товара в одном DIV
toasterec, времени хватило только на констатацию факта.
Модератор
#
Re: Три последовательно идущих товара в одном DIV
Если совсем кошерно, то пример для групп из 6-й версии:
<xsl:variable name="count">1</xsl:variable>

<div class="group_list">
   <xsl:apply-templates select=".//shop_group[parent_id=$group][position() mod $n = 1]"/>
</div>

И сам темплейт:
   <!-- Шаблон для групп товара -->
   <xsl:template match="shop_group">
      <ul>
         <xsl:for-each select=". | following-sibling::shop_group[position() &lt; $n]">
            <li>
               <a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_group"><xsl:value-of disable-output-escaping="yes" select="name"/></a><xsl:text> </xsl:text><span class="shop_count"><xsl:value-of select="items_total_count"/></span>
            </li>
         </xsl:for-each>
      </ul>
   </xsl:template>
#
Re: Три последовательно идущих товара в одном DIV
toasterec, попробовал сделать Вашим способом

Возникла такие ошибки:

Предупреждение: DOMDocument::loadXML() [<a href='domdocument.loadxml'>domdocument.loadxml</a>]: Opening and ending tag mismatch: div line 226 and xsl:if in Entity, line: 227 в файле /home/cp449005/public_html/test2/modules/xsl/processor/xslt.php (строка 33)Предупреждение: DOMDocument::loadXML() [<a href='domdocument.loadxml'>domdocument.loadxml</a>]: Opening and ending tag mismatch: if line 268 and div in Entity, line: 269 в файле /home/cp449005/public_html/test2/modules/xsl/processor/xslt.php (строка 33)Предупреждение: DOMDocument::loadXML() [<a href='domdocument.loadxml'>domdocument.loadxml</a>]: Opening and ending tag mismatch: div line 270 and xsl:if in Entity, line: 271 в файле /home/cp449005/public_html/test2/modules/xsl/processor/xslt.php (строка 33)Предупреждение: DOMDocument::loadXML() [<a href='domdocument.loadxml'>domdocument.loadxml</a>]: Opening and ending tag mismatch: if line 274 and div in Entity, line: 275 в файле /home/cp449005/public_html/test2/modules/xsl/processor/xslt.php (строка 33)

Насколько я понял, неправильно распознаются начало и конец DIVa

Вот код части шаблона, где вношу изменения:

   <!-- Шаблон для товара -->
   <xsl:template match="shop_item">
      
      <!-- ловим первый элемент -->
      <xsl:if test="position() != 0">
         <div class="row">
      </xsl:if>
      
      <div class="span4 item">
         <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 class="item-desc-block">
            <p class="item-name">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </p>
            <p class="item-cat">настенный кондиционер</p>
            <p class="item-price"><xsl:value-of select="format-number(price, '### ##0', 'my')"/><xsl:text> </xsl:text><xsl:value-of disable-output-escaping="yes" select="currency"/><xsl:text> </xsl:text></p>
         </div>
         <div class="item-buy-block">
            <xsl:if test="type = 0 or (type = 1 and (digitals > 0 or digitals = -1))">
               <a href="{/shop/url}cart/?add={@id}" onclick="return $.addIntoCart('{/shop/url}cart/', {@id}, 1)">
                  Купить
               </a>
            </xsl:if>
            <a class="item-page-link" href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
               Узнать подробнее
            </a>
            
            <!-- Сравнение товаров -->
            <xsl:variable name="shop_item_id" select="@id" />
            <div class="compare" onclick="return $.addCompare('{/shop/url}', {@id}, this)">
               <xsl:if test="/shop/comparing/shop_item[@id = $shop_item_id]/node()">
                  <xsl:attribute name="class">compare current</xsl:attribute>
               </xsl:if>
            </div>
         </div>
      </div>
      
      
      <xsl:if test="position() &lt; last() and position() mod 3 = 0">
         </div>
         <div class="row">
      </xsl:if>

      <!-- ловим последний элемент -->
      <xsl:if test="position() != last()">
         </div>
      </xsl:if>
      
   </xsl:template>


Пробовал обозначать блоки в коде следующим образом: &lt;div class="row"&gt; &lt;/div&gt;? но тогда выводится просто текст, а не сами дивы.

Подскажите, что я делаю неправильно?

PS: Не нашел, куда зайти для расширенного ответа, поэтому код не отформатированный
#
Re: Три последовательно идущих товара в одном DIV
Я только
position() < last()
забыл, а в остальном все правильно. Ну и внешний обвес не описал.
#
Re: Re: Три последовательно идущих товара в одном DIV
HostCMS, заменил в Вашем темплейте <ul> на <div> и осуществить необходимый вывод групп магазина получилось. Но когда я попробовал применить к товарам подобную конструкцию:


   <xsl:template match="shop_item">
      <div class="row">
         <xsl:for-each select=". | following-sibling::shop_item[position() &lt; $n]">   
            <div class="span4 item">
               ...
            </div>
         </xsl:for-each>
      </div>      
   </xsl:template>


то получил дублирующиеся товары. Не совсем понял почему и по какому принципу они дублируются, поиск результатов не дал.

Каким образом нужно правильно сформировать темплейт, чтобы вывод товаров осуществлялся без дублирования?
Авторизация