购物车在自定义观察器中为空

时间:2013-06-11 12:34:34

标签: magento magento-1.7 cart observers

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

2 个答案:

答案 0 :(得分:3)

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

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

您认为购物车项目(衬衫,鞋子等)的项目实际上是报价项目。您可以使用购物车对象上的方法获取

  1. 引用对象的引用

  2. 引用项集合的引用

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

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

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

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

    要从购物车中获取报价项,您可以使用此类代码

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

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

    希望能够指引你。祝你的项目好运!

答案 1 :(得分:1)

你没有获取单身,你所做的是用

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

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