Событие подходящее для добавления пользовательских параметров на лету - это событие catalog_product_type_prepare_full_options
, которое инициируется непосредственно перед преобразованием продукта с его пользовательскими параметрами в элемент предложения.
Если собственные данные buyRequest влияют на атрибуты или опции продукта, наблюдатель на событии catalog_product_type_prepare_{$processMode}_options
является хорошим выбором, где $processMode
режим проверки и может быть «полным» или «облегченным». «Полный» режим используется, когда продукт регулярно добавляется в корзину и проверяет, установлены ли все необходимые параметры и действительна ли вся конфигурация. В режиме «lite» проверяются только параметры, содержащиеся в запросе, это используется при добавлении товара в список желаний, но также возможно при создании заказа из бэкэнда. Для обработки данных в любом случае вы можете зарегистрировать наблюдателя для обоих событий. Если есть проверка, вы должны разграничить события, конечно.
События запускаются в Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions (), и доступны следующие параметры:
transport
: Транспортный объект для всех пользовательских параметров (но без других параметров, например, параметров пакета), поэтому вы можете изменить их в обозревателе. transport-> options - это массив в виде option_id => option_value. Внимание, транспорт сам по себе является объектом stdClass, а не экземпляром Varien_Object, как вы могли ожидать. Так что нет никаких методов get и set для transport-> options.
buy_request
: Объект buyRequest, вы можете прочитать его здесь и по-прежнему изменять его.
product
: Продукт, который будет преобразован в элемент цитаты позже. Здесь вы можете управлять атрибутами или добавлять их динамически. Но вам все равно нужно учитывать их в процессе конвертации. Событие, используемое для этого, sales_quote_product_add_after
запускается только позже.
Источник: Объект Magento buyRequest - Ссылка
Таким образом, наблюдатель может выглядеть так:
public function addCustomOption(Varien_Event_Observer $observer)
{
$transport = $observer->getTransport();
if (this_item_should_be_free()) { // implement your condition here
$transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
}
}
Вы не можете установить цену для этой динамически добавленной пользовательской опции, но вы можете изменить цену элемента цитаты с помощью второго наблюдателя, catalog_product_get_final_price
например:
public function adjustFinalPrice($observer) {
$product = $observer->getProduct();
// Set price to "0" if custom option "Free Gift" has been set
if ($product->getCustomOption('Free Gift')) {
$product->setFinalPrice(0);
}
}