2

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

<?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();

是否有可能在观察者中您可以以不同的方式进行操作?

4

1 回答 1

5

问题是购物车的报价对象没有保存到数据库中,稍后在请求处理中被会话中的报价对象覆盖。为什么不保存购物车报价非常令人困惑。报价模型的save方法期望内部属性_hasDataChanges设置为true。但是,即使产品已添加到报价单中,此属性仍保持为false 。

您可以通过使用以下方法将一些数据(任何属性都可以)添加到引用中来强制将该属性设置为truesetData

                $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");
            }

        } 
于 2013-02-13T16:39:41.630 回答