Чем различаются события save_before и save_after?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

14.07.2011 19:37

А чем отличается customer_save_after от customer_save_before?

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

14.07.2011 19:40

События с суфиксом before возникают до сохранения модели, а с суффиксом after - после сохранения модели.

#3 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

14.07.2011 19:44

Я так думал, и предположил, что в обработке события с суфиксом before
$observer->getEvent()->getCustomer()
вернет данные до сохранения, а в обработчике события с суфиксом after соответственно новые данные. Но, мои надежды не оправдались. Как отследить изменение email, например?

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

14.07.2011 20:50

Вы плохо понимаете смысл сохранения.
Сохранение в данном контексте - это операция записи данных объекта в базу данных.
При этом сам объект остаётся неизменным.
Если вам нужно отследить изменения в БД, то вам нужно в обработчике before_save загрузить вторую копию объекта из БД и сравнить два объекта друг с другом.

#5 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

14.07.2011 20:59

Более того, можно даже не загружать вторую копию объекта из БД, потому что у моделей помимо метода getData имеется метод getOrigData, который возвращает состояние объекта на момент загрузки из БД.
Сравнивая значения характеристик, полученные методами getData и getOrigData, можно установить, был ли объект изменён в период после загрузки из БД.

#6 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

14.07.2011 22:07

Последовал вашему совету, сначала попробовал следующий вариант
    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');


Второй пример показал более радостные результаты.

#7 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

15.07.2011 03:59

Это потому, что вы невнимательно прочитали моё сообщение.
Я писал, что сравнивать getData и getOrigData надо до сохранения модели, а не после.

#8 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

15.07.2011 10:06

Извините, ввел вас немного в заблуждение. В config.xml следуеющее:
		    <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, может поэтому проблемы?

#9 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

15.07.2011 10:10

Нет.
А вот несогласованность имён (метод subscriberSaveAfter обрабатывает событие newsletter_subscriber_save_before) явно усложнит сопровождение кода.

#10 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

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>

#11 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

15.07.2011 10:25

Это уникальный идентификатор вашего обработчика.

#12 Ярослав Богуцкий 2
  • Группа: Пользователь
  • Сообщений: 75
  • Регистрация: 07.07.2011

15.07.2011 10:26

Такая же (
http://stackoverflow.com/questions/2414610/viewing-magento-model-data-changes-on-before-after-save-event
) ситуация с getOrigData, и пошли они тем же путем, не решив, а обойдя проблему.

Поделиться темой: