2010-03-10 76 views
5

我一直在努力做一些事情,似乎应该是简单的:在保存事件之前/之后查看Magento模型数据更改?

  • 钩MODEL_save_after事件(或MODEL_save_before如果这是更合适)
  • 检查的getData()VS getOrigData(),看看有什么改变了用户所做的

现在,在'customer_address'模型的示例中,通过后端编辑,我发现两个保存事件都被触发了两次。

第一次'customer_address_save_before'被触发,后面跟着'customer_address_save_after'。在这两种情况下getOrigData()和getData()都是相同的,除了getData()有一个新的'updated_at'值,并有一个'store_id'集(这是一个错误?)。因此,该模型尚未提供用户提交的数据。这些事件都是在输入用户数据或验证之前,所以这是没有用的。

'customer_address_save_before'被触发,第二次触发'customer_address_save_after'。这次(在两种情况下),getOrigData()都是空的,并且getData()现在具有来自用户的所有提交的数据。所以我无法比较这些事件!看来这是经过验证,保存,很多!

我也不确定保存过程为什么会出现两次?

Magento v1.3.2.4正在使用中。

我错过了什么吗?

+0

什么是你正在勾选的事件的名称? – 2010-03-10 05:17:00

+0

customer_address_save_after或customer_address_save_before。 有趣的是,两种情况下模型中的数据是相同的! – KingJackaL 2010-03-10 21:08:34

回答

6

我清盘挂钩customer_address_save_before,结果比较什么是在数据库中,像这样:

<?php 
customer_address_save_before_listener ($event) 
{ 
    $address = $event->getCustomerAddress(); 

    $database_address = Mage::getModel('customer/address')->load($address->getId()); 
} 
?> 

而且比较的getData()从两个返回。有三个我遇到的疑难杂症:

  • 在$地址上使用getEntityTypeId()并检查它。尽管挂上了'customer_address_save_before',你也会得到OrderAddress模型被发送给你的监听器(这对我来说似乎是错误的,但是啊)。
  • 检查$ address-> getData()值中的数组。例如,'street'作为单个字符串从数据库中返回,而您的侦听器通过的地址将在末尾展开。
  • 您的侦听器传递的CustomerAddress有'store_id'。即使CustomerAddress不存储'store_id',也不会保存(或加载)数据库。
+1

感谢您指出了问题 - OrderAddress是一个令人讨厌的问题!对于那些正在寻找如何验证EntityTypeId的人来说,这段代码应该返回正确的值:'$ iAddressTypeId = Mage :: getSingleton('eav/config') - > getEntityType('customer_address') - > getEntityTypeId();' – 2011-05-05 07:25:46

+0

Very很有帮助,谢谢! - 通常情况下,您无法在管理员中编辑订单地址,因此我假设这是在创建订单时被解雇的?你看到发生了什么Magento版本? - 我现在使用这个(https://gist.github.com/theloveofcode/75f0ad9b9fafde523bee)来检测更改,让我通知管理员特别是哪个字段发生了变化。 – 2014-07-26 02:14:03

相关问题