自定义观察者中的购物车是空的



我开发了一个自定义Magento模块,带有一个观察者:

<?xml version="1.0"?>
    <config>
        <modules>
            <ADF_Evoucher>
                <version>1.0.0</version>
            </ADF_Evoucher>
        </modules>
        <frontend>
            [...]
            <events>
                [...]
                <sales_order_save_before>
                    <observers>
                        <ADF_Evoucher_Model_Observer>
                            <class>evoucher/observer</class>
                            <method>salesOrderSaveBeforeObserve</method>
                        </ADF_Evoucher_Model_Observer>
                    </observers>
                </sales_order_save_before>
            </events>
        </frontend> 
        [...]
    </config>

和我的观察者:

<?php
class ADF_Evoucher_Model_Observer extends Varien_Event_Observer
{
    public function __construct()
    {
    }
    public function salesOrderSaveBeforeObserve($observer) 
    {
        $order = $observer->getEvent()->getOrder();
        $quote = $order->getQuote();
        $cart = Mage::getModel('checkout/cart');
        Zend_Debug::dump($quote);
        Zend_Debug::dump($cart);
        die();
    }
}
?>

问题是我的购物车是空的,而我确实在里面添加了一些项目:

object(Mage_Checkout_Model_Cart)[458]
  protected '_summaryQty' => null
  protected '_productIds' => null
  protected '_data' => 
    array (size=0)
      empty
  protected '_hasDataChanges' => boolean false
  protected '_origData' => null
  protected '_idFieldName' => null
  protected '_isDeleted' => boolean false
  protected '_oldFieldsMap' => 
    array (size=0)
      empty
  protected '_syncFieldsMap' => 
    array (size=0)
      empty

我不明白为什么。也许我做错了什么,我对Magento不太熟悉。

在购物车结帐代码中很容易混淆—这里使用的模式与Magento的其他部分略有不同。

checkout/cart对象(Mage_Checkout_Model_Cart)不直接存储数据。它更像是一个服务模型,用于对与签出相关的逻辑进行分组,并管理在PHP会话中存储某些信息。

您认为是购物车中的商品(一件衬衫、一双鞋等)实际上是报价商品。使用cart对象上的方法获取

  1. 引用对象

  2. 报价项集合的引用

报价对象包含有关潜在订单和订货人的信息(客户信息、地址信息、送货方法等)

报价项的集合包含有关可能订购的项的信息。

要从购物车中获取报价,您可以使用如下代码

$quote = $cart->getQuote();
var_dump(
    $quote->getData()
);

要从购物车中获取报价项目,可以使用如下代码

$items = $cart->getItems();
foreach($items as $item)
{
    var_dump(
        $item->getData()
    );
}

引用对象是(或应该是)您从订单中获得的相同引用。

希望这能指引你正确的方向。祝你的项目好运!

你不是在获取一个单例,你所做的是用

生成一个新对象
Mage::getModel()

这个对象显然是一个干净/空/新对象

最新更新