Товры в три ряда с фоном через строчку

#
Товры в три ряда с фоном через строчку
Проблема вот в чем:
Не получается сделать бакграунд через строчку и в конце таблицы появляется лишняя пара тэгов открывающийся и закрывающийся tr

<?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="/shop"/>
   </xsl:template>
   <!-- Шаблон для магазина -->
   <xsl:template match="/shop">
      <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
      <xsl:variable name="parent_group_id" select="@current_group_id"/>
      <xsl:variable name="count">1</xsl:variable>
<!-- ..Определяем цвет фона строки -->

      <xsl:variable name="background_color">
         <xsl:choose>
            <xsl:when test="(position() + 1) mod 2 &gt; 0">#f7f7f7</xsl:when>
            <xsl:otherwise>#ffffff</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <!-- Выводим товары магазина -->
      <xsl:if test="count(item) &gt; 0">
         <table cellspacing="0" cellpadding="0" border="0" width="100%" class="shop_table" summary="Горячие предложения продукции ХСН">
            <tr style="background-color: {$background_color};">
               <xsl:apply-templates select="item"/>
            </tr>
         </table>
      </xsl:if>
   </xsl:template>
   <!-- Шаблон для товара -->
   <xsl:template match="item">
      <td width="30%">
         <!-- Название товара -->
         <h3>
            <a href="{/shop/path}{fullpath}{path}/"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         </h3>
         <!-- Изображения для товара, если есть -->
         <xsl:if test="small_image!=''">
            <a href="{/shop/path}{fullpath}{path}/"><img src="{small_image}" alt="{name}"  align="top"/></a>
         </xsl:if>
         <!-- Цена товара товара -->
         <p class="price">
            <xsl:value-of disable-output-escaping="yes" select="price"/>&#xA0;<xsl:value-of disable-output-escaping="yes" select="currency"/>&#xA0;
            <a href="{/shop/path}{fullpath}{path}/"><img alt="В корзину" title="В корзину" src="/hostcmsfiles/images/cart.gif"/></a>
         </p>
      </td>

      <!-- Позиций в строке -->
      <xsl:if test="position() mod 3 = 0">
         <xsl:text disable-output-escaping="yes">
            &lt;/tr&gt;
            &lt;tr  style="background-color: {$background_color};"  valign="top"&gt;
         </xsl:text>
      </xsl:if>
   </xsl:template>
   <!-- Шаблон для скидки -->
   <xsl:template match="discount">
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="name"/>&#xA0;
      <xsl:value-of disable-output-escaping="yes" select="value"/>%
   </xsl:template>
</xsl:stylesheet>
Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
sivruk, а неправильно делаете.
Цвет надо считать внутри шаблона item, а вы его считаете внутри shop, и в item он даже не передается.
И выводить надо не так - внутри тега xsl:text переменные не выводятся.

Попорбуйте такой вариант:
<?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="/shop"/>
   </xsl:template>
   <!-- Шаблон для магазина -->
   <xsl:template match="/shop">
      <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
      <xsl:variable name="parent_group_id" select="@current_group_id"/>
      <xsl:variable name="count">1</xsl:variable>
      <!-- ..Определяем цвет фона строки -->


      <!-- Выводим товары магазина -->
      <xsl:if test="count(item) &gt; 0">
         <table cellspacing="0" cellpadding="0" border="0" width="100%" class="shop_table" summary="Горячие предложения продукции ХСН">
            <tr style="background-color: ffffff;">
               <xsl:apply-templates select="item"/>
            </tr>
         </table>
      </xsl:if>
   </xsl:template>
   <!-- Шаблон для товара -->
   <xsl:template match="item">
      <td width="30%">
         <!-- Название товара -->
         <h3>
            <a href="{/shop/path}{fullpath}{path}/">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </h3>
         <!-- Изображения для товара, если есть -->
         <xsl:if test="small_image!=''">
            <a href="{/shop/path}{fullpath}{path}/">
               <img src="{small_image}" alt="{name}" align="top"/>
            </a>
         </xsl:if>
         <!-- Цена товара товара -->
         <p class="price">
            <xsl:value-of disable-output-escaping="yes" select="price"/>&#xA0;<xsl:value-of disable-output-escaping="yes" select="currency"/>&#xA0;
            <a href="{/shop/path}{fullpath}{path}/">
               <img alt="В корзину" title="В корзину" src="/hostcmsfiles/images/cart.gif"/>
            </a>
         </p>
      </td>

      <!--Цвет считаем здесь и по более сложной логике-->
      <xsl:variable name="background_color">
         <xsl:choose>
            <xsl:when test="position() mod 3 = 0 and position() mod 2 = 1">#f7f7f7</xsl:when>
            <xsl:when test="position() mod 3 = 0 and position() mod 2 = 0">#ffffff</xsl:when>
         </xsl:choose>
      </xsl:variable>

      <!-- Позиций в строке -->
      <xsl:if test="position() mod 3 = 0">
         <xsl:text disable-output-escaping="yes">&lt;/tr&gt; &lt;tr  style="background-color:</xsl:text>
         <xsl:value-of select="$background_color"/>
         <xsl:text disable-output-escaping="yes">;"  valign="top"&gt;</xsl:text>
      </xsl:if>
   </xsl:template>
   <!-- Шаблон для скидки -->
   <xsl:template match="discount">
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="name"/>&#xA0;
      <xsl:value-of disable-output-escaping="yes" select="value"/>%</xsl:template>
</xsl:stylesheet>
Заказов не беру. Консультирую редко.
#
Re: Товры в три ряда с фоном через строчку
ААААААААААААА!
Ведь близок был!
Спасибо. Работает!
Но осталась раздражающая мелочь - пустая пара tr
</td></tr> <tr  style="background-color:#f7f7f7;"  valign="top"></tr></table>

Как от нее избавиться?
Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
Пустая пара tr, скорее всего, появляется когда число товаров на странице кратно трем. Отсюда логический вывод, что после обработки последнего item для текущей страницы, запись tr нам выводить не нужно.
Попробуйте дополнить условие вывода следующим образом:
<!-- Позиций в строке -->
      <xsl:if test="position() mod 3 = 0 and position() != last()">
         <xsl:text disable-output-escaping="yes">&lt;/tr&gt; &lt;tr  style="background-color:</xsl:text>
         <xsl:value-of select="$background_color"/>
         <xsl:text disable-output-escaping="yes">;"  valign="top"&gt;</xsl:text>
      </xsl:if>


А еще, на самом деле, неплохо бы предусмотреть вариант вывода одного или двух пустых td в случае, когда число товаров в последней строке меньше трех.
Сделать это можно, например, так:
<!--создадим пустые ячейки если число товаров в последней строке меньше 3х -->
      <xsl:if test="position() = last() and position() mod 3 &gt; 0">
         <!--если в последней строке 2 товара-->
         <xsl:text disable-output-escaping="yes">&lt;td&gt;&#xA0;&lt;/td&gt;</xsl:text>
         <xsl:if test="position() mod 2 = 0">
            <!--если в последней строке 1 товар-->
            <xsl:text disable-output-escaping="yes">&lt;td&gt;&#xA0;&lt;/td&gt;</xsl:text>
         </xsl:if>
      </xsl:if>

Вставлять этот блок нужно перед комментарием "Цвет считаем здесь и по более сложной логике"

Всегда пожалуйста
Заказов не беру. Консультирую редко.
#
Re: Товры в три ряда с фоном через строчку
Kotoff,
Спасибо, дружище!
Использовал первый пример, так как не планируется вывод в строку более 3-х товаров (иначе при разрешении 1024 в экран не влезает) и более 3-х строк.
Но второй пример буду иметь ввиду, но уже для инфосистем, там материалы могут добавляться и появляться не всегда предсказуемо.
Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
sivruk писал(а):
Использовал первый пример, так как не планируется вывод в строку более 3-х товаров (иначе при разрешении 1024 в экран не влезает) и более 3-х строк.
Хм. Кажется вы не совсем поняли мою мысль.
У вас же число товаров в группе не всегда будет кратно трем?

У вас получается по 3 товара в строку на 3 строки = 9 товаров на страницу.

А если, например, есть группа в которой 25 товаров? Это же получится что на первых двух страницах будет по 9 товаров, в на последней - 7! То есть две строки по 3 товара а в последней строке - один товар.

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

Этот способ лучше, чем вручную следить за количеством товаров в группе.
Заказов не беру. Консультирую редко.
#
Re: Товры в три ряда с фоном через строчку
Kotoff,
Я все правильно понял. Сори.
Этот xsl в информационных материалах выводит 9 случайных товаров из всех групп и подгрупп
То есть в шаблоне php кусок сосущий этот xsl
<?
if (class_exists('shop'))
{
$shop = & singleton('shop');
$element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
$element['name'] = 'shop_item_discount_table.shop_items_catalog_item_id';
$element['prefix'] = 'and'; // префикс
$element['if'] = '='; // Условие
$element['value'] = 'shop_items_catalog_table.shop_items_catalog_item_id';  //
$element['sufix'] = '';
$param = array();
//$param['select'][] = $element;
$param['current_group_id'] = false;
$param['items_on_page'] = 3;
$param['items_order'] = 'rand';
// Получить все скидки
$AllDiscount = $shop->GetAllDiscounts(1);
if ($AllDiscount)
{
$param['select_discount'] = array();
while ($row = mysql_fetch_assoc($AllDiscount))
{
$param['select_discount'][] = $row['shop_discount_id'];
}
}
$shop->ShowShop(1,'МагазинКаталогТоваровНаГлавнойСпецПредХСН',$param);
}
?>

Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
Ой! Это для главной было, ну да бог с ним с инфосистемами та же логика
Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
<?php
$shop = & singleton('shop');
$param = array();
$param['items_order']='Rand';
$param['items_field_order']='shop_items_catalog_show_count';
$param['current_group_id'] = false;
$param['items_on_page'] = 9;
$param['xml_show_group_type'] = 'all';
$shop->ShowShop('1','МагазинКаталогТоваровНаГлавнойСпецПредХСН',$param);
?>

Чтоб не быть голословным
Не стыдно что-либо не знать или не понимать. Стыдно бояться спросить.
#
Re: Товры в три ряда с фоном через строчку
А, ну если у вас выборка из всех групп с ограничением максимального числа элементов, то тогда конечно можно и без этого блока. Хотя он в даже в таком случае хоть и бесполезен но при этом и безобиден
Заказов не беру. Консультирую редко.
Авторизация