将额外项目添加到购物车(观察员)

时间:2013-02-13 15:28:01

标签: magento

我尝试在购物车中添加额外的商品。我为此创建了一个观察者。

<?php
class WP_Plugadapter_Model_Observer
{

    public function hookToControllerActionPostDispatch($observer)
    {
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add')
        {
            Mage::dispatchEvent("add_to_cart_after", array('request' => $observer->getControllerAction()->getRequest()));
        }
    }

    public function hookToAddToCartAfter($observer)
    {

        $request                = $observer->getEvent()->getRequest()->getParams();
        $_product               = Mage::getModel('catalog/product')->load($request['product']);
        $extra_functions        = $_product->getExtra_functions();

        if(!empty($extra_functions)){

            $extra_functions    = explode(',', $extra_functions);
            if(array_search('121', $extra_functions)){

                $cart           = Mage::getSingleton('checkout/cart'); 
                $cart->addProduct(10934, 1);
                $cart->save();

                if (!$cart->getQuote()->getHasError()){
                   Mage::log("Product ADD TO CART is added to cart.");
                }else{
                   Mage::log("BOEM");
                }

            }  

        }

    }

}

当我检查我的系统日志时,我看到以下日志消息。 产品添加到购物车已添加到购物车。

我不知道我做错了什么。当脚本独立加载时,它运行正常。 例如:

<?php

include_once '../app/Mage.php';

Mage::app();
umask(0);

$session        = Mage::getSingleton('core/session', array('name'=>'frontend'));        
$cart           = Mage::getSingleton('checkout/cart'); 
$cart->addProduct(10934, 1);
$cart->save();

在观察者中你是否有可能以不同的方式做到这一点?

1 个答案:

答案 0 :(得分:5)

问题是购物车的报价对象没有保存到数据库中,稍后在请求处理中会被会话中的报价对象覆盖。为什么没有保存购物车报价是相当混乱的。引用模型的save方法期望内部属性_hasDataChanges设置为 true 。但是,即使已将产品添加到报价中,此属性仍保留在 false

您可以使用setData方法向引号添加一些数据(任何属性都可以),强制将该属性设置为 true

                $cart = Mage::getSingleton('checkout/cart'); 
                $cart->addProduct(10934, 1);
                //force _hasDataChanges to true
                $cart->getQuote()->setData('updated', true);
                $cart->save();

或者,您可以使用结帐会话报价对象将产品添加到购物车

 if(array_search('121', $extra_functions)){

            $cart           = Mage::getSingleton('checkout/cart'); 
            $qty = 1;
            $quote =  Mage::getSingleton('checkout/session')->getQuote()
                ->addProduct(
                    Mage::getModel('catalog/product')->load(10934),
                    $qty)
                ->save();
            $cart->save();

            if (!$cart->getQuote()->getHasError()){
               Mage::log("Product ADD TO CART is added to cart.");
            }else{
               Mage::log("BOEM");
            }

        }