使用观察者创建自定义选项和奖品以将产品添加到购物车


15

我想使用观察者将自定义选项添加到quoteitem,该观察者具有checkoutCartProductAddAfter事件,并在产品添加到购物车后触发。

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;

}

我的观察器正在工作,但是我无法向添加的产品添加自定义选项。请提供帮助,以使用观察者将自定义选项添加到刚刚添加的产品中。


还提供我在观察者中更改产品的自定义价格。我想将自定义价格添加到零。在此先感谢
Keyur Patel 2013年

Answers:


19

@Tim在周末就此问题进行了讨论:https ://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/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),
                )
            );
        }
    }

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

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

和更多:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266


1
第一:请使用注释,而不是新答案。然后在循环中插入针对您产品的支票,这样只有您所需的产品才可以选择。
Fabian Blechschmidt

1
请看一下这个很棒的调试答案,然后回击:magento.stackexchange.com/a/429/217
Fabian Blechschmidt

1
通过上述步骤可以实现
Fabian Blechschmidt

2
谢谢您的建议当我添加到购物车中时,我得到了两项,因为我使用的是可配置产品,并且我已经通过更新最后一个报价项目解决了该问题。
Milople Inc

1
我都没有,但是我更新了链接。谢谢!
Fabian Blechschmidt,2015年

3

即时添加自定义选项的适当事件是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);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.