我想使用观察者将自定义选项添加到QuoteEtem中,观察者CheckoutcartCartProductAddafter事件并在将产品添加到购物车中。

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

我的观察者正在工作,但我无法为添加的产品添加自定义选项。请提供帮助,以使用观察者添加产品添加产品来添加自定义选项。

有帮助吗?

解决方案

@Tim在周末就此问题发表了讨论: https://docs.google.com/presentation/d/1efpznqsvtrt1had1had1xqvcvcpc-tgvr8jyok4jyok4x7zejhm9je/edit

您想要的是方法2:在config.xml中添加以下事件

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

在observer.php中添加以下方法

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

这是关于此主题的更多信息:

https://stackoverflow.com/questions/9334115/magento-change-custom-option-value-before-aidding-it-it-t-t-to-cart/9344336#9344336

和更多:

https://stackoverflow.com/questions/9412074/magento-quote-queote-order-product-product-item-attribute-lasion-natibute-mate-on-user-input/94962666666666666

其他提示

即时添加自定义选项的适当活动是 catalog_product_type_prepare_full_options, ,在产品具有自定义选项的产品之前触发,将其转换为报价项目。

如果自己的BuyRequest数据对产品属性或选项有影响,则观察者 catalog_product_type_prepare_{$processMode}_options 是一个不错的选择,哪里 $processMode 是验证模式,可以是“完整”或“ lite”。当产品定期添加到购物车中时,使用“完整”模式并验证是否设置了所有必需的选项并且整个配置都是有效的。在“ lite”模式中,仅验证了请求中包含的选项,在将产品添加到愿望清单中时使用,但在从后端创建订单时也可以使用。要处理任何情况下,您可以为两个事件注册观察者。如果有验证,您应该区分事件。

这些事件是在mage_catalog_model_product_type_abstract :: _ preparoptions()中触发的,并且可用以下参数:

  • transport: :用于所有自定义选项的传输对象(但没有其他选项,例如捆绑选项),因此您可以在观察者中更改它们。传输 - >选项是表单option_id => option_value中的数组。注意,运输本身是一个stdclass对象,而不是您可能期望的Varien_Object的实例。因此,没有用于运输 - >选项的GETTER和设置方法。
  • 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);
    }
}
许可以下: CC-BY-SA归因
scroll top