А чем отличается customer_save_after от customer_save_before?
Чем различаются события save_before и save_after?
14.07.2011 19:40
События с суфиксом before возникают до сохранения модели, а с суффиксом after - после сохранения модели.
14.07.2011 19:44
Я так думал, и предположил, что в обработке события с суфиксом before
$observer->getEvent()->getCustomer()вернет данные до сохранения, а в обработчике события с суфиксом after соответственно новые данные. Но, мои надежды не оправдались. Как отследить изменение email, например?
14.07.2011 20:50
Вы плохо понимаете смысл сохранения.
Сохранение в данном контексте - это операция записи данных объекта в базу данных.
При этом сам объект остаётся неизменным.
Если вам нужно отследить изменения в БД, то вам нужно в обработчике before_save загрузить вторую копию объекта из БД и сравнить два объекта друг с другом.
Сохранение в данном контексте - это операция записи данных объекта в базу данных.
При этом сам объект остаётся неизменным.
Если вам нужно отследить изменения в БД, то вам нужно в обработчике before_save загрузить вторую копию объекта из БД и сравнить два объекта друг с другом.
14.07.2011 20:59
Более того, можно даже не загружать вторую копию объекта из БД, потому что у моделей помимо метода getData имеется метод getOrigData, который возвращает состояние объекта на момент загрузки из БД.
Сравнивая значения характеристик, полученные методами getData и getOrigData, можно установить, был ли объект изменён в период после загрузки из БД.
Сравнивая значения характеристик, полученные методами getData и getOrigData, можно установить, был ли объект изменён в период после загрузки из БД.
14.07.2011 22:07
Последовал вашему совету, сначала попробовал следующий вариант
в итоге переменная $oldvar пуста, т.е. getOrigData('subscriber_status') не возвращает желаемого результата.
Потом сделал по первоначальной вашей идее
Второй пример показал более радостные результаты.
public function subscriberSaveAfter($observer) { $subscriber = $observer->getEvent()->getSubscriber(); $newvar = $subscriber->getData('subscriber_status'); $oldvar = $subscriber->getOrigData('subscriber_status'); }
в итоге переменная $oldvar пуста, т.е. getOrigData('subscriber_status') не возвращает желаемого результата.
Потом сделал по первоначальной вашей идее
public function subscriberSaveAfter($observer) { $subscriber = $observer->getEvent()->getSubscriber(); $customer = Mage::getSingleton('customer/customer')->load($subscriber->getData('customer_id')); $subscribe = Mage::getModel ('newsletter/subscriber'); $subscribe->loadByCustomer ($customer); $oldvar = $subscribe->getData('subscriber_status'); $newvar = $subscriber->getData('subscriber_status');
Второй пример показал более радостные результаты.
15.07.2011 03:59
Это потому, что вы невнимательно прочитали моё сообщение.
Я писал, что сравнивать getData и getOrigData надо до сохранения модели, а не после.
Я писал, что сравнивать getData и getOrigData надо до сохранения модели, а не после.
15.07.2011 10:06
Извините, ввел вас немного в заблуждение. В config.xml следуеющее:
Это всё в разделе global, может поэтому проблемы?
<newsletter_subscriber_save_before> <observers> <newsletter_subscriber_save_after> <type>singleton</type> <class>mynamespace_mymodule/observer</class> <method>subscriberSaveAfter</method> </newsletter_subscriber_save_after> </observers> </newsletter_subscriber_save_before>
Это всё в разделе global, может поэтому проблемы?
15.07.2011 10:10
Нет.
А вот несогласованность имён (метод subscriberSaveAfter обрабатывает событие newsletter_subscriber_save_before) явно усложнит сопровождение кода.
А вот несогласованность имён (метод subscriberSaveAfter обрабатывает событие newsletter_subscriber_save_before) явно усложнит сопровождение кода.
15.07.2011 10:17
Я знаю. Уже исправил, просто вчера пока копал, не успевал названия функции менять, менял только событие для неё, чтобы быстрее получить результат. А для чего вообше в описании события в вот этот выделенный код?
<newsletter_subscriber_save_before>
<observers>
<newsletter_subscriber_save_before>
<type>singleton</type>
<class>mynamespace_mymodule/observer</class>
<method>subscriberSaveBefore</method>
</newsletter_subscriber_save_before>
</observers>
</newsletter_subscriber_save_before>
<newsletter_subscriber_save_before>
<observers>
<newsletter_subscriber_save_before>
<type>singleton</type>
<class>mynamespace_mymodule/observer</class>
<method>subscriberSaveBefore</method>
</newsletter_subscriber_save_before>
</observers>
</newsletter_subscriber_save_before>
15.07.2011 10:26
Такая же (
http://stackoverflow.com/questions/2414610/viewing-magento-model-data-changes-on-before-after-save-event) ситуация с getOrigData, и пошли они тем же путем, не решив, а обойдя проблему.