即时添加自定义选项的适当事件是catalog_product_type_prepare_full_options
,它在具有自定义选项的产品转换为报价项目之前触发。
如果自己的buyRequest数据对产品属性或选项有影响,那么事件观察者catalog_product_type_prepare_{$processMode}_options
是一个不错的选择,$processMode
验证模式在哪里,可以是“完整”或“精简”。当将产品定期添加到购物车时,将使用“完全”模式,并验证是否设置了所有必需的选项并且整个配置有效。在“精简版”模式下,仅验证请求中包含的选项,将产品添加到心愿单时可以使用该选项,但从后端创建订单时也可以使用。为了在任何情况下都可以处理数据,您可以注册两个事件的观察者。应该进行验证,您当然应该区分事件。
事件在Mage_Catalog_Model_Product_Type_Abstract :: __ prepareOptions()中触发,并且以下参数可用:
transport
:传输所有自定义选项(但不包含其他选项,例如捆绑包选项)的对象,因此您可以在观察器中进行更改。transport-> options是一个数组,格式为option_id => option_value。注意,传输本身是一个stdClass对象,而不是您所期望的Varien_Object实例。因此,对于transport-> options没有getter和setter方法。
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);
}
}