将多余的产品添加到购物车(观察员)

问题描述:

我尝试添加额外的产品到购物车。我为此创建了一个观察者。将多余的产品添加到购物车(观察员)

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

是否有可能在一个观察者,你把它做它用不同的方式?

+0

日志消息是不是表示一切都确实正常?当购物车没有错误时记录它。 – 2013-02-13 15:44:51

+0

是的。但没有任何反应:(。 – Lexperts 2013-02-13 15:50:51

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

您可以强制该属性通过使用setData方法添加一些数据(任何财产会做)的报价被设置为

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

     } 
+0

感谢您的好信息:)。它的工作。 – Lexperts 2013-02-14 08:23:35