0

我开发了一个自定义 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 有点陌生。知道为什么这个购物车对象在我的观察者中是空的吗?

4

2 回答 2

3

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

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

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

  1. 报价对象的引用

  2. 报价项集合的引用

报价对象包含有关潜在订单和订购者的信息(客户信息、地址信息、运输方式等)

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

要从购物车中获取报价,您可以使用这样的代码

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

要从购物车中获取报价项目,您可以使用这样的代码

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

报价对象是(或应该是)您从订单中获得的相同报价参考。

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

于 2013-06-11T13:25:00.240 回答
1

你不是在获取一个单例,你所做的是产生一个新对象

Mage::getModel()

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

于 2013-06-11T13:01:33.843 回答