为什么magento从管理部分捕获错误的事件?

时间:2013-06-10 20:58:30

标签: magento events dispatch adminhtml

我在本地计算机上设置了magento的默认“无修改”副本,以便在我们的生产计算机上复制结果。

当我尝试在模块中捕获事件'adminhtml_customer_save_after'时,它总是在customer_save_before上返回/停止。对于任何customer_save_after类型事件也是如此。

添加

file_put_contents('/tmp/events.log','Dispatching '. $name. "\n",FILE_APPEND); 

到/var/www/app/Mage.php中的dispatchEvent函数验证它确实在customer_save_before上返回,即使这不是我要求的事件。

请验证这一点,如果这是预期的功能,请告诉我。当我们的呼叫中心/订单团队在站点的管理端创建新客户(用于发出电话订单)以与我们公司的数据库同步时,我必须能够访问magento管理部分中的entity_id。

来自模块的PHP

<?php
class NKI_CustomerSync_Model_Observer
{

public function AddCustomerToQueue($observer)
{

$event = $observer->getEvent();
$customer = $event->getCustomer();

$model=$event->getModel();

echo "<PRE>";
var_dump($event->getName());
var_dump($event->getData());

var_dump($event);
var_dump(get_class_methods($event));
die();
}.....

XML

<config>
<modules>
<NKI_CustomerSync>
<version>0.1.0</version>
</NKI_CustomerSync>
</modules>

<global>
<events>
<adminhtml_customer_save_after>
<observers>
<NKI_customersync_model_observer>
<type>singleton</type>
<class>NKI_CustomerSync_Model_Observer</class>
<method>AddCustomerToQueue</method>
</NKI_customersync_model_observer>
</observers>
</adminhtml_customer_save_after>

2 个答案:

答案 0 :(得分:2)

首先,由于您的帖子背叛了一些关于Magento事件系统如何工作的误解,这反过来导致您错误地诊断问题,这里是对事件系统的快速回顾。

dispatchEvent中的Mage.php方法是错误的地方,可以检查Magento是否“抓住”了您的活动。此方法接收所有事件。直到调用链的更深处,Mage_Core_Model_App的同名dispatchEvent方法

#File: app/code/core/Mage/Core/Model/App.php
public function dispatchEvent($eventName, $args)
{
    foreach ($events[$eventName]['observers'] as $obsName=>$obs) {    
        //...
    }
}

Magento将寻找任何事件观察员(或用你的说法,事件捕手)

Magento在每个请求上发出各种事件。每当保存客户模型对象时,都会发出customer_save_before事件。这包括保存在前端和后端。但是,此处会触发adminhtml_customer_save_after事件

#File: app/code/core/Mage/Adminhtml/controllers/CustomerController.php
public function saveAction()
{
    //...
    $customer->save();
    //...
    Mage::dispatchEvent('adminhtml_customer_prepare_save', array(
        'customer'  => $customer,
        'request'   => $this->getRequest()
    ));        
    //..
}

换句话说,此事件在管理客户控制器的saveAction中触发。换句话说,当用户在查看单个客户时单击Magento管理控制台中的“保存”后,此事件将触发。

因此, customer_save_beforeadminhtml_customer_save_after事件将在客户保存在Magento管理员中时触发。 customer_save_before事件首先触发,然后adminhtml_customer_save_after事件触发。

至于您的具体代码,您展示的内容看起来是正确的。假设您在观察者类上有结束},并且它位于正确的位置。

app/code/community/NKI/CustomerSync/Model/Observer.php

//or, if your module is configured in the local code pool

app/code/local/NKI/CustomerSync/Model/Observer.php    

并且您的模块的config.xml具有结束</config>,是有效的XML,并且位于模块的etc/config.xml文件中。这也假设Magento可以看到你的模块。

我使用你的代码将一个骨架模块放在一起,当我在Magento的后端保存一个客户时你的事件被触发了。那个骨架模块is here。将它与你必须看到的模块可能巧妙地不正确的地方相比较。

答案 1 :(得分:1)

事件应该放在adminhtml中,称为customer_save_after