2010-03-10 18 views
5

Ho cercato di fare qualcosa che sembra che dovrebbe essere semplice:Visualizzazione delle modifiche ai dati del modello Magento prima o dopo l'evento di salvataggio?

  • gancio un evento MODEL_save_after (o MODEL_save_before se questo è più appropriato)
  • controllo getData() vs getOrigData() per vedere cosa modifiche apportate dall'utente

Ora, nell'esempio del modello "customer_address", modificato tramite il backend, trovo che entrambi gli eventi di salvataggio vengono attivati ​​due volte.

La prima volta che viene attivato "customer_address_save_before", seguito da "customer_address_save_after". In entrambi i casi getOrigData() e getData() sono identici, tranne che getData() ha un nuovo valore 'updated_at' e ha un set 'store_id' (si tratta di un bug?). Quindi, il modello non ha ancora i dati inviati dall'utente. Gli eventi sono entrambi prima di inserire i dati dell'utente o la convalida, quindi questo è inutile.

"customer_address_save_before" viene attivato, seguito da "customer_address_save_after" una seconda volta. Questa volta (in entrambi i casi), getOrigData() è vuoto e getData() ha ora tutti i dati inviati dall'utente. Quindi non posso nemmeno confrontare su questi eventi! Sembra che questo sia dopo la convalida, il salvataggio, il lotto!

Non sono sicuro del motivo per cui il processo di salvataggio sembra verificarsi due volte?

Magento v1.3.2.4 in uso.

Mi manca qualcosa?

+0

Qual è il nome dell'evento in cui ti stai collegando? –

+0

customer_address_save_after o customer_address_save_before. È interessante notare che i dati nel modello nei due casi sono identici! – KingJackaL

risposta

6

Finii aggancio customer_address_save_before, e confrontando i risultati di quello che era nel database in questo modo:

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

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

e confrontando i getData() restituisce dai due. C'erano tre cose che ho trovato:

  • Utilizzare getEntityTypeId() sull'indirizzo $ e controllarlo. Nonostante l'aggancio 'customer_address_save_before', ottieni anche i modelli OrderAddress inviati al tuo ascoltatore (questo mi sembra sbagliato, ma ah bene).
  • Controllare gli array nei valori $ address-> getData(). Ad esempio, "street" viene restituito dal DB come una singola stringa, mentre l'indirizzo che il listener è passato è esploso nelle linee di trasmissione.
  • L'indirizzo cliente il cui listener è passato ha un 'store_id'. Anche se CustomerAddress non memorizza 'store_id', e non viene salvato (o caricato dal) database.
+1

grazie per aver segnalato i segreti: l'OrderAddress è un brutto scherzo! Per coloro che cercano come convalidare EntityTypeId, questo snippet dovrebbe restituire il valore corretto: '$ iAddressTypeId = Mage :: getSingleton ('eav/config') -> getEntityType ('customer_address') -> getEntityTypeId();' –

+0

Molto utile, grazie! - Normalmente non è possibile modificare l'indirizzo di un ordine nell'amministratore, quindi presumo che questo sia stato sparato al momento della creazione dell'ordine? In quali versioni di Magento stavi vedendo accadere ciò? - Ora sto usando questo (https://gist.github.com/theloveofcode/75f0ad9b9fafde523bee) per rilevare le modifiche, permettendomi di notificare agli amministratori di quale campo è stato modificato in particolare. –

Problemi correlati