Обновлено: 11 июня 2015, 00:10
 Marabar

Подписка пользователей при регистрации в MODX.

Обратился заказчик с заданием — подписывать пользователей на рассылку новостей при регистрации. Сайт работает на MODX revolution и используется компонент Sendex. Написал небольшой сниппет — subscription, который подключается через параметр &postHooks сниппета Register, компонента Login. В свою очередь, сниппет subscription, имеет один единственный параметр &idnewsletter, в котором передаётся ID рассылки.

Сам сниппет:
<?php
/**
 *  subscription
 * 
 *  Copyright 2015 by Marat Marabar <marat@marabar.ru>
 *  Site: http://marabar.ru
 *
 * subscription snippet, требуется компонент Sendex
 * 
 *  Сниппет подписывет пользователей на рассылку, во впемя их регистрации.
 * Вызывается через параметр &postHooks сниппета Register, компонента Login.
 * В параметре &idnewsletter, указывается ID рассылки, по умолчанию 1.
 * 
 * [[!Register?
 *          &postHooks=`subscription`
 *          &idnewsletter=`1`
 *          ....
 *          ....
 *          ....
 * ]]
 *  
 */

$Sendex = $modx->getService('sendex','Sendex',$modx->getOption('sendex_core_path',null,$modx->getOption('core_path').'components/sendex/').'model/sendex/');
if (!($Sendex instanceof Sendex)) return '';

$idnewsletter = $modx->getOption('idnewsletter', $scriptProperties, '1');

$username = $hook->getValue('username');

$userarray = $modx->getObject('modUser', array('username' => $username));
$userid = $userarray->get('id');

$profile = $userarray->getOne('Profile');
$email = $profile->get('email');

$duble = $modx->getObject('sxSubscriber', array('email' => $email));
if ($duble) {return;}

if ($userid) {
    $obj = $modx->newObject('sxSubscriber');
    $data = array(
            'user_id' => $userid,
            'email' => $email,
            'newsletter_id' => $idnewsletter,
            );
    
    $obj->fromArray($data);
    $obj->save();
}

return;

Как, уже, выше сказал, да и в коде, в комментариях, есть инструкция, subscription подключается через параметр &postHooks сниппета Register, работает через компонент Sendex
[[!Register?
    &postHooks=`subscription`
    &idnewsletter=`1`
    ....
    ....
    ....
]]
В параметр &idnewsletter, указывается ID рассылки, по умолчанию — 1.

Есть проверка на дубли Email.
   Marabar Готовые решения 0    5 +1

Комментарии ()

  1. Эрик 15 марта 2016, 12:31 # 0
    Здравствуйте, а вы случайно не знаете как переделать этот сниппет под личный кабинет Office?
    1. Marabar 15 марта 2016, 20:35 # 0
      Не совсем понимаю что за Office. Но предполагаю, что компонент от Василия.
      Можно его в плагин запихать на событие OnUserSave
      1. Эрик 16 марта 2016, 01:44 # 0
        Да, от Василия. Нет, не работает. Висит все после регистрации.
        1. Marabar 16 марта 2016, 12:11 # 0
          Ничего там висеть не должно. Плагин срабатывает на системное событие OnUserSave, при сохранении нового пользователя.
          Должно быть что-то типа такого

          if ($modx->event->name == 'OnUserSave') {
                  if ($user && $mode == 'new') {
                          $Sendex = $modx->getService('sendex','Sendex',$modx->getOption('sendex_core_path',null,$modx->getOption('core_path').'components/sendex/').'model/sendex/');
                          if (!($Sendex instanceof Sendex)) return '';
                          
                          // Указать ID рассылки
                          $idNewsletter = 1;
                          
                          $profile = $user->getOne('Profile');
                          $userId = $profile->get('internalKey');
                          $userEmail = $profile->get('email');
                          
                          $duble = $modx->getObject('sxSubscriber', array('email' => $userEmail));
                          if ($duble) {return;}
                          
                          if ($userId) {
                              
                                  $obj = $modx->newObject('sxSubscriber');
                                  
                                  $data = array(
                                          'user_id' => $userId,
                                          'email' => $userEmail,
                                          'newsletter_id' => $idNewsletter,
                                          );
          
                                  $obj->fromArray($data);
                                  $obj->save();
                          }
                  }
                  
                  return;
          }
          
          Отметить системное событие OnUserSave.
          Этот плагин будет добавлять в рассылку всех новых пользователей, даже если пользователь не подтвердил свой email. Скорее всего это и требуется, просто я не знаю по какому принципу работает Office.
          Если требуется добавлять в рассылку после активации, то системное событие OnUserActivate, и нужно будет изменить код плагина.
          1. Эрик 16 марта 2016, 13:40 # 0
            Спасибо огромное, сработало.
            1. Marabar 16 марта 2016, 14:12 # 0
              Отлично!
    2. Cheizer Man 14 июня 2016, 18:38 # 0
      Уважаемый Marabar, спасибо за скрипт, подскажите пожалуйста но имя пользователя не вписывается в рассылку, в таблице Sendexа где хранятся подписчики modx_sendex_subscribers нет поля для имени совсем. Я так понимаю, имена он берет из другой таблицы modx_users, а email как раз из modx_sendex_subscribers. Как можно в сниппете добавить поле ИМЯ для пользователя в таблицу modx_sendex_subscribers? Предварительно создав там столбец name.
      1. Marabar 15 июня 2016, 10:00 # 0
        А смысл? Sendex, во время рассылки, всё-равно имя будет брать из другой таблицы. Без форка компонента смысла нет этим заниматься.
        А так да — псевдоним берёт из modx_users, а полное имя из modx_user_attributes
      2. Штиф Васлер 25 июля 2016, 16:56 # 0
        Что то не работает. После попытки регистрации выбивает 500 ошибку
        1. Штиф Васлер 25 июля 2016, 22:07 # 0
          А, сниппет на работает, а плагин ок. Спасибо)
          1. Штиф Васлер 26 июля 2016, 00:36 # 0
            А не могли бы подсказать в написании плагина? Сделал такой: срабатывает на регистрацию нового юзера. Он отправляет все письма, стоящие в очереди. Но хочется сделать так, что бы он отправлял письмо именно этому новому пользователю (который при регистарции уже автоматически подписался на расслыку). Это будет доп. письмо, с доп. инфой.

            if ($modx->event->name == 'OnUserSave') {
                    if ($user && $mode == 'new') {
                            
            $modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');
            
                        $q = $modx->newQuery('sxQueue');
                        $queue = $modx->getCollection('sxQueue');
                        /** @var sxQueue $email */
                        foreach ($queue as $email) {
                        	$email->send();
                        }
                            
                    }
                    
                return;
            }
            



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

            Marabar 21 сентября 2018, 00:32
            Login в MODX revolution 25
            Marabar 17 мая 2018, 12:22
            Выводим облако тегов в MODX revo 17
            medortex 14 июля 2017, 16:26
            Меню Аккордеон в MODX revo 54
            Madao 16 мая 2017, 18:28
            msMiniCartDynamic 3
            Семён 05 мая 2017, 23:30
            Создание ресурсов из фронтенда 41
            Филитович Владимир 26 февраля 2017, 22:25
            Apache 2.2.22, установка и настройка 41
            valery 30 ноября 2016, 15:51
            phpMyAdmin 3.5.1, установка и настройка 3