Просмотр изменений данных модели Magento до / после события сохранения?

#php #magento

#php #magento

Вопрос:

Это должно быть просто:

  • Перехватите MODEL_save_after событие (или MODEL_save_before , если это более уместно).
  • Проверьте getData() vs g etOrigData() , чтобы увидеть, какие изменения внес пользователь.

В модели 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.

Комментарии:

1. Как называется событие, к которому вы подключаетесь?

2. customer_address_save_after или customer_address_save_before. Интересно, что данные в модели в двух случаях идентичны!

Ответ №1:

В итоге я подключил 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() для $address и проверьте его. Несмотря на подключение ‘customer_address_save_before’, вы также получаете модели OrderAddress, отправляемые вашему слушателю (мне это кажется неправильным, ну да ладно).
  • Проверьте наличие массивов в значениях $address->getData(). Например, ‘street’ возвращается из базы данных в виде одной строки, в то время как адрес, переданный вашему слушателю, содержит это разнесенное по конечным строкам.
  • Пользовательский адрес, который передается вашему слушателю, имеет ‘store_id’. Несмотря на то, что CustomerAddress не хранит ‘store_id’, и он не сохраняется (или не загружается из) базы данных.

Комментарии:

1. спасибо, что указали на ошибки — адрес заказа — неприятная ошибка! Для тех, кто ищет, как проверить EntityTypeId, этот фрагмент должен возвращать правильное значение: $iAddressTypeId = Mage::getSingleton('eav/config')->getEntityType('customer_address')->getEntityTypeId();

2. Очень полезно, спасибо! — Обычно вы не можете редактировать адрес заказа в admin, поэтому я предполагаю, что это было запущено при создании заказа? В каких версиях Magento вы видели, что это происходит? — Сейчас я использую это ( gist.github.com/theloveofcode/75f0ad9b9fafde523bee ) чтобы обнаружить изменения, позвольте мне уведомить администраторов о том, какое поле, в частности, изменилось.