2010-03-10 31 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

相關問題