Magento事件调度/观察/修改调度对象

时间:2011-10-28 01:57:41

标签: php magento

我正在尝试解决问题,但没有取得任何成功。我需要使用Magento API订单信息请求发送一些其他信息。不幸的是,Magento似乎没有任何与此相关的事件,因此我覆盖了该类并发送了一个事件。当我使用新信息修改$result数组时,这一切都很好。但是,不合适的部分是被修改的数组永远不会在原始调度代码中显示备份。

这是派遣:

class Company_Module_Model_Order_Api extends Mage_Sales_Model_Order_Api {

    public function info($orderIncrementId) {
        $result = parent::info($orderIncrementId);
        $order = $this->_initOrder($orderIncrementId);

        Mage::dispatchEvent("company_api_order_info_add", 
                    array('result' => &$result, 'order' => &$order));
    // - I've tried with and without the ampersand

        Mage::log($result['affiliate_text']); // Debugging

        return $result;
    }
}

以下是观察者代码:

class Company_Other_Model_Api
{
    public function hookToSetAffiliate ($observer) {
        $result = $observer->getResult();
        $order = $observer->getOrder();

        if ($order->getAffiliateCode()) {
            $affiliate = Mage::getModel('affiliates/info')
                    ->load($order->getAffiliateCode());
            if (is_object($affiliate))
                $result['affiliate_text'] = $affiliate->getCode();
            }

            Mage::log($result['affiliate_text']); // Shows up here

            return $observer;
        }
    }
}

您有什么想法$result未正确进入的原因吗?在钩子中,它正确显示,但是,当调度方法的下一行发生时,'affiliate_text'不可见。

谢谢,

JMAX

2 个答案:

答案 0 :(得分:4)

我建议你采取与Magento相同的路线。

// Wrap array in an object
$result = new Varien_Object($result);

// Dispatch - No need for & as $result and $order are both objects and passed by ref
Mage::dispatchEvent("company_api_order_info_add", array('result'=>$result, 'order'=>$order));

// Unwrap array from object
$result = $result->getData();

Varien_Object仍然允许数组访问,因此您的侦听器代码根本不需要更改。

答案 1 :(得分:0)

仅供您参考,我明白了。以下是发生的事情:当我将它分配给hookToSetAffiliate中的变量时,数组引用中断了。因此,我更改了代码以直接引用数组(并且不使用变量来提供更容易的访问),并修复了它。

JMAX