Önce / sonra Magento modeli veri değişikliklerini görüntülenen olay kaydetmek?

1 Cevap php

Ben basit olması gerektiği gibi görünüyor şey yapmak çalışıyorum:

  • (Bu daha uygun ise ya MODEL_save_before) bir MODEL_save_after olay kanca
  • değişiklikleri görmek için getData () getOrigData vs () kontrol kullanıcı yaptı

Şimdi, arka uç aracılığıyla düzenlenen 'customer_address' modelinin örnek olarak, ben kurtarmak olaylar hem de iki kez tetiklenir bulabilirsiniz.

'Customer_address_save_before' ilk kez 'customer_address_save_after' ardından tetiklenir. Her iki olgu getOrigData () ve getData () in getData dışında, aynıdır () değer 'updated_at' Yeni vardır, vardır ve bir set 'store_id' (bu bir hata mı?). Yani, modeli henüz kullanıcıdan gönderilen veri yok. Olaylar kullanıcı verilerini veya doğrulama girmeden önce hem de, bu nedenle bu hiçbir faydası yoktur.

'Customer_address_save_before' tetiklenen 'customer_address_save_after' ile ikinci kez takip edilir. (Her iki durumda da) bu kez, getOrigData () boş ve getData () artık kullanıcının tüm gönderilen veri var. Yani ya bu olaylar karşılaştırmak olamaz! Bu, çok tasarruf, doğrulama peşinde görünür!

Kaydetme işlemi iki kez ortaya görünüyor neden ben de emin değilim?

Kullanılan Magento v1.3.2.4.

Ben bir şey eksik?

1 Cevap

Ben customer_address_save_before çengel, ve bu yüzden gibi veritabanında ne kadar sonuçlarını karşılaştırarak yara:

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

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

Ve ikisinden getData () döner karşılaştırarak. Üç yakaladım Diyelim ki geldi o vardı:

  • $ Adresine getEntityTypeId () kullanın ve kontrol edin. 'Customer_address_save_before' çengel rağmen, siz de dinleyici gönderilen OrderAddress modelleri (bu iyi ah bana yanlış geliyor, ama) olsun.
  • $ Adres-> getData () değerleri diziler için kontrol edin. Dinleyici geçirilen adres bu Dip ve kenar çizgilerden patladı vardır Örneğin, 'sokak', tek bir dize olarak DB döndürülür.
  • Dinleyici geçirilen CustomerAddress bir 'store_id' vardır. Rağmen CustomerAddress 'store_id' saklamaz, ve kaydedilen (veya yüklenen) veritabanına almaz.