Признак сопутствующего товара в корзине

#
Признак сопутствующего товара в корзине
Здравствуйте.
Существует ли способ передачи в XML для корзины некоего признака товара, сообщающего о том, что он был добавлен как сопутствующий или как модификатор.

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

Итого, в корзине окажутся: шина, вентиль. Но вентиль должен иметь признак того, что он — сопутствующий товар именно для той шины, которая в корзине, и что он был добавлен как модификатор.

Если такого способа нет, код чего можно было бы дополнить для этого?
#
Re: Признак сопутствующего товара в корзине
Как вариант можете написать хук на shop_cart и добавлять в xml нужные вам объекты https://www.hostcms.ru/documentation/modules/core/events/ пункт "Манипулирование XML"

«Не выходи из комнаты, не совершай ошибку…»
#
Re: Признак сопутствующего товара в корзине
llirik,
мне нужно в каталоге shop/cart создать файл observer.php, в котором создать класс Shop_Cart_Observer? В этом классе создать метод... хм... onBeforeGetXml, так? И в файл bootstrap.php добавить код:
Core_Event::attach('shop_cart.onBeforeGetXml', array('Shop_Cart_Observer', 'onBeforeGetXml'));


Правильно понимаю?
#
Re: Признак сопутствующего товара в корзине
Верно. Либо можете полностью код размещать в bootstrap.php
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Признак сопутствующего товара в корзине
llirik, хорошо.
Если я правильно понимаю, внутри класса Shop_Cart_Observer методу onBeforeGetXml в качестве аргумента будет передан объект Shop_Cart_Model.

Да, я могу таким образом к XML-корзины добавить любой свой тег с содержимым. А как мне признак сопутствующего товара или модификатора получить из объекта Shop_Cart_Model? Это пока не могу понять.
#
Re: Признак сопутствующего товара в корзине
По связи к shop_item получаете сам товар. Далее из таблицы shop_item_associated вы можете получить к каким товарам он является сопутствующим.
Как работать со связями и как получать объекты через ORM + queryBuilder
https://www.hostcms.ru/documentation/modules/core/orm/
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Признак сопутствующего товара в корзине
llirik,
позвольте позадавать кучу вопросов, так как эта область CMS для меня пока не изведана.

Внутри класса Shop_Cart_Observer в методе onBeforeGetXml я в виде первого аргумента получаю объект Shop_Cart_Model. Если я делаю это...
static public function onBeforeGetXml($object, $args)
   {
      
      $result = $object->Shop_Item->findAll();
      
   }


...то в переменной $result у меня будет массив с объектами Shop_Item_Model всех товаров, которые были добавлены в корзину?
#
Re: Признак сопутствующего товара в корзине
llirik,
наверное, достаточно так.
static public function onBeforeGetXml($object, $args)
   {
      
      $result = $object->Shop_Item;
      
   }


Если в корзине, допустим, пять товаров, значит этот код будет вызван пять раз. И каждый раз у меня в переменной $result будет объект Shop_Item_Model добавленного в корзину товара. Так я ближе к истине?
#
Re: Признак сопутствующего товара в корзине
Да, так  верно.
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Признак сопутствующего товара в корзине
llirik,
если использовать такой код метода...
class Shop_Cart_Observer
{
   static public function onBeforeGetXml($object, $args)
   {
      // Получить объект Shop_Item (товар)
      $oShop_Item = $object->Shop_Item;
      
      // Узнать, для каких товаров этот товар является сопутствующим
      $oCore_QueryBuilder_Select = Core_QueryBuilder::select( 'shop_item_id' )
         ->from( 'shop_item_associated' )
         ->where( 'shop_item_associated_id', '=', $oShop_Item->id );
      
      // Сохранить идентификатор(ы) такого(их) товара(ов)
      $row = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
      
      // Добавить XML-тег в XML-код товара со значением идентификатора того товара,
      // для которого он является сопутствующим
      $oShop_Item->addEntity(
         Core::factory('Core_Xml_Entity')
            ->name( 'associated_id' )
            ->value($row['shop_item_id'])
         );

   }
}   

...то действительно в XML для корзины по пути /shop/shop_cart/shop_item добавляется тег associated_id со значением полученного идентификатора.

А как быть, если этот товар был добавлен не как сопутствующий, а просто самостоятельный? Например, вентили для бескамерных автомобильных дисков можно приобретать и просто так. Не обязательно их устанавливать в диски. Кто-то вообще их в паяльные лампы ставит или в домашний автоклав.

Ведь если я правильно понимаю, описанным выше образом я просто внутри корзины смогу понять, является ли конкретный товар сопутствующим для каких-либо иных товаров. А вот был ли он добавлен в корзину именно как сопутствующий чему-то... это как определить?
Авторизация