#php #magento
#php #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.
Комментарии:
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 ) чтобы обнаружить изменения, позвольте мне уведомить администраторов о том, какое поле, в частности, изменилось.