Как узнать, подписан ли пользователь на новостную рассылку?

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

14.07.2011 14:50

Уже голова идет кругом. Как в функции, работающей по хуку customer_save_after узнать, подписан ли пользователь на новостную рассылку?

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

14.07.2011 15:10

/** @var Mage_Customer_Model_Customer $customer */

/** @var Mage_Newsletter_Model_Subscriber $subscriber */
$subscriber = Mage::getModel ('newsletter/subscriber');

$subscriber->loadByCustomer ($customer);

if (!is_null ($subscriber->getId ())) {
    
    /**
     * Покупатель подписан на рассылку
     */    
}


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

14.07.2011 15:27

Хм, если делать это по customer_save_after в момент подписки, то все равно пользователь не подписан.Я думал какие бы данные о пользователе не редактировались, в событии customer_save_after они будут уже обновлены, но нет...

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

14.07.2011 15:31

Из факта сохранения customer/customer не следует, что newsletter/subscriber уже сохранена.

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

14.07.2011 15:34

Вот и я о том же. Хочу отслеживать изменение данных покупателей,но только тех, которые подписаны на рассылку. Ввиду разного времени сохранения разных интересующих моделей это пока тяжелая задача.

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

14.07.2011 15:38

Отслеживайте newsletter/subscriber

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

14.07.2011 15:43

Это была первая идея, однако тогда при изменении адреса модель newsletter/subscriber не будет задействована, и отследить не получится. Буду думать....

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

14.07.2011 15:48

Вы опишите задачу с точки зрения конечного пользователя, и я скажу, что и как надо отслеживать.

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

14.07.2011 16:06

Нужно переслать контакты, а точнее детали аккаунтов покупателей на сторонний сервер через SOAP, но только подписанных на рассылку покупателей, и отслеживать изменения деталей аккаунта покупателя, не важно, админом он изменен или самим покупателем. Соответственно уведомлять о отписке или удалении покупателя. Вот такая вот задачка. Подписался - перекинули его данные. Изменил что-то - обновили. Удалился, отписался или удалили - удалить и на стороннем сервере.

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

14.07.2011 16:24

Ваша проблема возникла из-за того, что вы пытались обработать все прикладные события одним обработчиком.

На самом деле, вам нужно систематизировать все прикладные события которые вам нужно обрабатывать (события не в терминах Magento, а в терминах предметной области).
Для каждого события предметной области вам нужно запрограммировать свой обработчик.

Как я вижу ситуацию, у вас будет 2 основных обработчика: after_save для customer/customer и after_save для newsletter/subscriber.
В большинстве случаев будет работать обработчик after_save для customer/customer.
Как вы сами заметили, этот обработчик не будет обрабатывать свежеподписавшихся покупателей (потому что модуль newsletter/subscriber ещё не обновлена).

Для свежеподписавшихся будет работать обработчик newsletter/subscriber.

Возможно, вам понадобятся ещё какие-нибудь обработчики.
Можно, например, выполнять какие-либо действия на after_dispatch контроллера.

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

14.07.2011 16:30

Обратите внимание, что это - типовой приём решения подобных ситуаций: не пытаться всё сделать в одном обработчике, а вместо этого систематизировать прикладные события (самостоятельная подписка, подписка администратором, самостоятельная отписка, удаление учетной записи и т.п.) и затем аккуратно обработать каждое из них индивидуальным обработчиком, отслеживая при этом факты обработки и избегая повторных обработок.

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