我在本地计算机上设置了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>
答案 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_before
和adminhtml_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