2010-03-10 13 views
5

que he estado tratando de hacer algo que parece que debería ser simple:Viendo los cambios de datos del modelo de Magento en el evento antes/después de guardar?

  • gancho de un evento MODEL_save_after (o MODEL_save_before si eso es más apropiado)
  • cheque getData() vs getOrigData() para ver qué cambios que el usuario ha realizado

Ahora, en el ejemplo del modelo 'dirección_de_cliente', editado a través del servidor, encuentro que ambos eventos guardados se desencadenan dos veces.

La primera vez que se desencadena 'customer_address_save_before', seguido de 'customer_address_save_after'. En ambos casos, getOrigData() y getData() son idénticos, excepto que getData() tiene un nuevo valor 'updated_at', y tiene un conjunto 'store_id' (¿esto es un error?). Entonces, el modelo aún no tiene los datos enviados por el usuario. Los eventos son antes de ingresar datos de usuario o validación, por lo que esto no sirve de nada.

'customer_address_save_before' se activa, seguido de 'customer_address_save_after' por segunda vez. Esta vez (en ambos casos), getOrigData() está vacío y getData() ahora tiene todos los datos enviados por el usuario. ¡Así que no puedo comparar estos eventos tampoco! ¡Parece que esto es después de la validación, el ahorro, el lote!

Tampoco estoy seguro de por qué el proceso de guardar aparece dos veces?

Magento v1.3.2.4 en uso.

¿Echo de menos algo?

+0

¿Cuál es el nombre del evento al que te estás conectando? –

+0

customer_address_save_after o customer_address_save_before. Curiosamente, ¡los datos en el modelo en los dos casos son idénticos! – KingJackaL

Respuesta

6

terminé enganchando customer_address_save_before, y comparar los resultados con lo que estaba en la base de datos de este modo:

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

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

y comparar la getData() devuelve a los dos. Hubo tres gotcha que encontré:

  • Use getEntityTypeId() en $ address y verifíquelo. A pesar de conectar 'customer_address_save_before', también obtienes los modelos OrderAddress que se envían a tu oyente (esto me parece incorrecto, pero ah bien).
  • Compruebe matrices en $ dirección-> getData() valores. Por ejemplo, se devuelve 'calle' desde el DB como una cadena única, mientras que la dirección a la que se pasa su oyente ha explotado en las líneas finales.
  • El CustomerAddress que su oyente ha pasado tiene un 'store_id'. A pesar de que CustomerAddress no almacena 'store_id', y no se guarda (o se carga desde) la base de datos.
+1

gracias por señalar los inconvenientes: ¡OrderAddress es una sorpresa desagradable! Para aquellos que buscan cómo validar el EntityTypeId, este fragmento debe devolver el valor correcto: '$ iAddressTypeId = Mage :: getSingleton ('eav/config') -> getEntityType ('customer_address') -> getEntityTypeId();' –

+0

Very servicial, gracias! - Normalmente, no puede editar una dirección de pedido en el administrador, por lo que supongo que esto se produjo en la creación del pedido. ¿En qué versiones de Magento viste que sucedía? - Ahora estoy usando esto (https://gist.github.com/theloveofcode/75f0ad9b9fafde523bee) para detectar cambios, lo que me permite notificar a los administradores qué campo en particular ha cambiado. –

Cuestiones relacionadas