0

我已经在本地机器上设置了一个默认的“无修改”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>
4

2 回答 2

2

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

dispatchEvent方法 inMage.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 管理控制台中单击“保存”后会触发此事件。

因此,当客户在 Magento 管理员中保存时, 和事件都会触发。事件首先触发,然后事件触发。customer_save_beforeadminhtml_customer_save_aftercustomer_save_beforeadminhtml_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有一个 close </config>,是有效的 XML,并且在您的模块etc/config.xml文件中。这也假设 Magento 可以看到您的模块。

当我在 Magento 的后端保存客户时,我使用您的代码将骨架模块组合在一起并触发了您的事件。那个骨架模块就在这里。将其与您必须查看的模块进行比较,以了解您的模块可能存在细微的错误。

于 2013-06-11T01:53:34.780 回答
1

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

于 2013-06-10T21:11:55.257 回答