Как получить объект товара, измененный вручную при помещении в корзину?

[16 июля 2019 г.]    Российская сборка Magento 2.52.2
Magento 2: модули и услуги
magereport.com: составление перечня необходимых для установки заплаток SUPEE
#1 Хыиуду
  • Группа: Пользователь
  • Сообщений: 56
  • Регистрация: 05.07.2012

25.07.2012 18:40

При добавлении товара в корзину отрабатывает событие:
Mage::dispatchEvent($eventName, array(
'transport' => $transport,
'buy_request' => $buyRequest,
'product' => $product
));
(скрипт app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php)
Здесь $eventName имеет вид catalog_product_type_prepare_%s_options. Например, в моем случае catalog_product_type_prepare_full_options
Я отлавливаю это событие обсервером, смотрю, есть ли в buy_request некий параметр (в моем случае size), и если есть - записываю его в $product.
Как можно получить доступ к этому объекту $product уже на странице корзины? $this->getItem()->getProduct() и $this->getItem()->getData() возвращают совершенно иные наборы свойств, среди которых нет нужного size

#2 Хыиуду
  • Группа: Пользователь
  • Сообщений: 56
  • Регистрация: 05.07.2012

26.07.2012 16:48

Путем копания кода было выяснено, что сохранять-то как раз надо не в $product, а в $transport->options. Скажите, как можно создать вменяемый объект класса Mage_Catalog_Model_Product_Option и передать в нем опцию с именем size и значением 18? И возможно ли это вообще, если в админке Мадженты у этого продукта нет такой опции? Или имеет смысл ее создать - но для нескольких тысяч товаров создавать список выбора вручную это убиться. В общем, можно ли как-то подсунуть в корзину опцию, созданную на лету?

#3 Хыиуду
  • Группа: Пользователь
  • Сообщений: 56
  • Регистрация: 05.07.2012

30.07.2012 15:04

В итоге вышло так: template/checkout/cart/item/default.phtml (шаблон вывода предмета в корзине)
$_item = $this->getItem();
//        Mage_Sales_Model_Quote_Item $_item
        $data=$_item->getOptions();
//       Mage_Sales_Model_Quote_Item_Option[] $data
        $data=$data[0]->getData();
        $data=  unserialize($data['value']);
        $size=$data['size']; // А вот и нужная нам опция

Следующий вопрос - как провернуть такой же фокус в template/email/order/items/order/default.phtml (проще говоря, отсылка письма о совершении заказа), где вместо Mage_Sales_Model_Quote_Item у нас $_item относится к классу Mage_Sales_Model_Order_Item?

Поделиться темой: