Модификации товаров

#
Модификации товаров
На форуме ещё нет решения выбора по цвету и размеру для шестой версии. Делал по одному свойству (размер) + изменение цены, может кому пригодится.
В начале шаблона добавим ключ:
<xsl:key name="property63" match="modifications/shop_item/property_value[tag_name='size']" use="value"/>

property63 и size замените на свои.
в темплейте для товара в самом начале:
<script type="text/javascript" >
      function GetSelectValue(selectName)
         {
            value=document.getElementById(selectName).value;
            return value;
         }
   </script>

Вывод модификаций (выпадающий список) с кнопкой в корзину:
<div class="priceBig">
                        <span id="tovar_price"><xsl:value-of select="format-number(price, '### ##0', 'my')"/>,-</span>
                      </div>
                     <strong>Размер</strong><br/>
                     <select name="property63" id="property63" onchange="shoutbox(this)">
                        <xsl:apply-templates select="modifications/shop_item/property_value[tag_name='size' and generate-id(.)=generate-id(key('property63', value))]"/>
                     </select>
                     
                     
                     <!-- Ссылку на добавление в корзины выводим, если:
                     type = 0 - простой тип товара
                     type = 1 - электронный товар, при этом остаток на складе больше 0 или -1,
                     что означает неограниченное количество -->
                     <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/cart/', GetSelectValue('property63'), 1)">
                           <img src="/images/add_to_cart.gif" alt="Добавить в корзину" title="Добавить в корзину" />
                        </a>
                     </xsl:if>

Скрипт для смены цены
<script type="text/javascript">
              var shouts = {
               <xsl:apply-templates select="modifications/shop_item/property_value[tag_name='size' and generate-id(.)=generate-id(key('property63', value))]" mode="js"/>
                 };
                 function shoutbox(select) {
                  var selected = select.options[select.selectedIndex];
                  if (selected.value in shouts) {
                    document.getElementById("tovar_price").innerHTML = shouts[selected.value];
                  } else {
                    document.getElementById("tovar_price").innerHTML = "";
                  }
                 }
               </script>

Шаблон для модификаций
<xsl:template match="modifications/shop_item/property_value[tag_name='size']">
      <option value="{entity_id}">
         <xsl:variable name="value" select="value" />
         
         <xsl:value-of disable-output-escaping="yes" select="value"/>
      </option>
   </xsl:template>

И чтобы менялась цена сделаем шаблон
<xsl:template match="modifications/shop_item/property_value[tag_name='size']" mode="js">
      <xsl:variable name="price" select="../price" />
      <xsl:value-of disable-output-escaping="yes" select="../@id"/>: "<xsl:value-of disable-output-escaping="yes" select="format-number(../price, '### ##0', 'my')"/>,-"<xsl:if test="position() != last()">, </xsl:if>
   </xsl:template>   

Вроде ничего не забыл. И делайте бекапы по чаще!
#
Re: Модификации товаров
А подробнее можешь расписать?
или пример целого файла привести
#
Re: Модификации товаров
Куда уже подробнее?
#
Re: Модификации товаров
Не знаю, у меня не появляется список модификаций..
Можешь файл целиком привести?
#
Re: Модификации товаров
А у меня выпадающий список пустым получается. Заносится только первый id модификации и все.
почта - kirill.lkdesign@gmail.com, скайп - t-reklama, viber, whatsapp: +380679494384
#
Re: Модификации товаров
Еще в этой теме было похожее решение для 5-ой версии - http://www.hostcms.ru/forums/17/3096/page-2/
Вчера вечером думал над всем этим и у меня вопрос родился.
Правильно ли я понял, что такие усложнения в коде делаются исключительно из-за необходимости реализации одной кнопки "В корзину" которая будет добавлять модификацию с тем или иным выбранным в списке свойством в корзину?

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

Дальше только одна проблема была - чтобы в корзине отображалась не модификация, а родитель. Точнее ссылка и название родителя - а остальное можно и из модификации.
В итоге посмотрел XML - там оказывается есть параметр modification_id по которому мы можем определить, является товар модификацией или нет, а также выводится еще и родительский товар со всеми параметрами.
В итоге добавил условие в XSL Корзины - и вроде все работает.

Сейчас выложу полный пример с кодом, мало ли кому пригодится, да и может я где-то ошибаюсь? Ну не может же быть так просто все
#
Re: Модификации товаров
После взвешивания всех за и против решили все же остановиться на варианте с выводом через Select.

Asl, ОГРОМНОЕ СПАСИБО ЗА КОД! Все работает!

Однако мы решили его слегка модифицировать под свои нужды.
1. В данном коде не выводится доп. свойство родителя, а только модификаций. Для вывода доп. свойства в select добавили еще одну опцию:
<option value="{@id}" selected="selected"><xsl:value-of select="property_value[tag_name='vkus']/value"/> (<xsl:value-of disable-output-escaping="yes" select="rest"/> шт.)</option>


2. Кроме того, надо не забыть и о товарах без доп. свойств. Для этого добавили условие:
<xsl:choose>
   <xsl:when test="property_value[tag_name='vkus']/value != 0 and rest != 0">
   Вывод добавления в корзину из примера выше
   </xsl:when>
      <xsl:otherwise>
   Стандартный вывод добавления в корзину                                                     </xsl:otherwise></xsl:choose>


3. Также необходимо в корзине отображать ссылку не на модификацию, а на родителя. Для этого также небольшое условие:
   <xsl:choose>
      <xsl:when test="shop_item/modification_id != 0">
      <a href="{shop_item/shop_item/url}">
      <xsl:value-of disable-output-escaping="yes" select="shop_item/shop_item/name"/>
                     </a>
         </xsl:when>
            <xsl:otherwise>
            <a href="{shop_item/url}">
            <xsl:value-of disable-output-escaping="yes" select="shop_item/name"/>
                     </a>
                  </xsl:otherwise>
               </xsl:choose>


4. В корзине также крайне желательно отображать значение доп. свойства. Для этого необходимо в код ТДС Корзины (в самом начале) внести след. изменения:
$oShop = $Shop_Cart_Controller_Show
->itemsProperties(TRUE)
->itemsPropertiesList(FALSE)
->getEntity();

Это позволит вывести значения доп. свойств в XML Корзины. А дальше в XSL они выводятся аналогично карточке товара.
Кстати, вопрос по ходу - чем вызвано то, что по умолчанию значения свойств и список свойств имеют значения FALSE и TRUE? Обычно нужны как раз значения, а не весь список свойств, т. е. ровно наоборот.
Отключение вывода списка свойств позволило сократить размер XML на 10%. И это с учетом того, что у нас в список пока занесено всего несколько значений. Но это так, мысли вслух. Не обижайтесь, если что

5. Вместо смены цены (обычно она одинаковая для наших модицикаций), решили динамически изменять остаток товара на складе.

И вот тут проблема. Скрипт работает не полностью, поскольку в select добавлен option родителя. Соответственно при выборе сначала option модификации кол-во выводится корректно, однако потом, при выборе option родителя не выводится ничего.
Видимо, надо как-то подкорректировать скрипт изменения цены. Попробовал пару идей, но что-то не вышло.

Буду благодарен, если кто поможет!

P. S. Еще одна проблема в моем способе - если товар-родитель закончился, а товар-модификация - нет. Проблема и с карточкой товара будет, и с катологом. Самый простой способ: поменять местами значения доп. свойств родителя и модификации. Но тут есть ощущение, что могут возникнуть проблемы с уже оформленными заказами Тогда возможно, лучше сделать по способу Asl. Но что тогда выводить в каталоге? Одну из модификаций? Как-то муторно в реализации. И то же много вопросов. Надо еще подумать сейчас...
P. P. S. Еще надо поправить шаблоны финального шага корзины, писем пользователю и администратору.
И как-то добавить вывод доп. свойства товара в заказе.
#
Re: Модификации товаров
Вобщем решили не использовать указание свойства для родителя.
Т. е. указывать всё отдельными модификациями, а для самого родителя свойство не задавать и использовать только для вывода информации (в каталоге товара и карточке товара).
Соответственно остатки указывать по модификациям, а для родителя - общее число остатков по всем модификациям.

В каталоге товаров также добавили условие для вывода поля выбора свойства аналогично карточке товара. И наверно лучше это сделать как-н. так:
<xsl:when test="modifications != 0 and rest != 0">

Пока вроде нормально, посмотрим, как в работе будет
#
Re: Модификации товаров
Вобщем пришлось еще внести разные правки в процессе тестов. Особенно при выводе свойств в каталоге товаров.
В частности:
<select name="property63" id="property63_{@id}" style="width: 105px;">

<button onclick="return $.addIntoCart('{/shop/url}cart/', GetSelectValue('property63_{@id}'), 1)">В&#xA0;корзину</button>


Однако выявилась одна проблема. При выводе около каждого товара в каталоге SELECT для выбора св-ва - св-ва отображаются однократно.

Т. е. например товар 1 имеет размер А и Б. Все нормально.
Товар 2 имеет размеры П и У. Все нормально.
Но если след. товар в списке - товар 3 - имеет снова размер А, то этот размер уже не отображается.
Т. е. option для выбора данного размера не выводится.

Как быть? Никак не пойму, куда копать.

Буду очень признателен за помощь!
#
Re: Модификации товаров
Друзья, я что-то совсем запутался
Поскольку реализация через xsl:key не работает в шаблоне КаталогТоваров, мы решили ее убрать.

В итоге - без xsl:key все работает!

Насколько я понимаю, xsl:key - это лишняя нагрузка. Поэтому если можно без него обойтись - лучше его не использовать. Тем более если его использование накладывает еще и опр. ограничения.

В связи с чем вопрос, зачем в принципе в указанном выше коде использовать xsl:key
Авторизация