[modSendPulse] - Рассылки через SendPulse

Компонент modSendPulse предоставляет возможность интеграции с популярным русскоязычным сервисом Email рассылки SendPulse.

Основная задача текущей версии компонента — управление подписной базой.

Состав компонента:
  1. Хук для Formit или ajaxForm
  2. Компактный сниппет для ручной работы
  3. Плагин срабатывающий при регистрации пользователя на сайте


Предварительная настройка компонента
  1. Разумеется у Вас должен быть активный аккаунт в сервисе SendPulse и заведена хотя бы одна адресная книга
  2. Открываем системные настройки, раздел modsendpulse и заполняем три обязательных параметра
  3. modsendpulse_addressbook_user_create — Номер вашей адресной книги, куда по умолчанию будут добавляться email адреса. Номер можно посмотреть в адресной строке, открыв книгу в сервисе SendPulse
  4. modsendpulse_client_id — ID из раздела API вашего аккаунта в системе SendPulse
  5. modsendpulse_client_secret — Secret из раздела API вашего аккаунта в системе SendPulse
Хук для formIt

  1. Создайте собственную подписную/контактную форму с уникальным дизайном, и графой E-mail.
  2. По умолчанию хук ищет поля name и emai. Убедитесь что в форме поля названы именно так.l
  3. Вызовите форму при помощи FormIt или AjaxForm
  4. Добавьте к вызову хук modSendPulseHook
  5. При обработке формы — отправитель добавится в вашу адресную книгу на сервисе SendPulse.
Пример вызова
[[!ajaxForm?
    &form=`tpl.podpiska`
    &hooks=`modSendPulseHook`
    &validate=`name:required,email:required:email`
]]

Сниппет-Хук легко адаптировать под собственные нужды, если Вы не пользуетесь FormIt, а предпочитаете обрабатывать формы используя собственные сниппеты.

// Вызываем класс 
if (!$modsendpulse = $modx->getService(
    'modsendpulse',
    'modsendpulse',
    MODX_CORE_PATH . 'components/modsendpulse/model/modsendpulse/'
)) {
    $modx->log(modX::LOG_LEVEL_ERROR, '[modSendPulseHook] - Not found class modsendpulse');
    return;
}

//Инициируем (получаем токен для запросов к API)
$modsendpulse->initialize($modx->context->key);
// Получаем email любым удобным способом, по вкусу проводим валидацию
$email = 'test@text.ru';
//Опционально добавляем Имя адресата любым удобным для Вас способом
$name = 'Петя Иванов';
//Получаем номер адресной книги из системных настроек компонента или указываем вручную
$book = $modx->getOption('addressbook_user_create');
// Вызываем метод добавления email в адресную книгу
$params['emails'] = array(
    array(
        'email' => $email,  
        'variables' => array(
            'name' => $name  
        )
    )
);
$modsendpulse->sendPulseAddEmailsToBook($params, $book);

Плагин, добавляющий пользователя в адресную книгу при регистрации
Срабатывает на событие OnUserSave. Плагин по умолчанию отключен. Если Вы хотите чтобы пользователь автоматически добавлялся в адресную книгу при регистрации на Вашем сайте — плагин нужно активировать.

Сервис предоставляет возможность отправки подписчику приветственного письма сразу же при добавлении в адресную книгу.
Также можно настроить цепочку писем с целой кучей тригеров, статистикой открываемости и прочей аналитикой.
Причем письмо можно оформить в виде крутого адаптивного шаблона. Нам достаточно лишь добавить подписчика в нужную адресную книгу.

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

Все это вы можете подробнее прочитать на сайте сервиса. Ссылку думаю найдете.
Николай Савин
20 апреля 2017, 10:05
modx.pro
8
5 669
+9
Поблагодарить автора Отправить деньги

Комментарии: 34

Никита
24 мая 2017, 12:12
0
добрый день,
а как сделать так, чтоб еще и на почту уведомление приходило?
    Николай Савин
    24 мая 2017, 12:14
    0
    Здравствуйте. Уведомление о чем?
      Никита
      24 мая 2017, 12:16
      0
      что была сделана подписка. Чтоб менеджеру на почту еще приходило
        Николай Савин
        24 мая 2017, 12:34
        0
        Ну в приведенных выше примерах подписка срабатывает на какое либо стороннее событие. Например на регистрацию пользователя или заполнение формы. Подписка тут является дополнительным действием, менеджер по идее и так должен получить уведомление по основному действию.
        На крайний случай вы можете дописать сниппет или плагин (смотря что используется) и настроить отправку почты посредством встроенных в MODX средств отправки почты modMail
    Никита
    24 мая 2017, 12:37
    0
    к примеру если в форму добавить &emailTo, то она отправит на send и на почту?
    сори, за тупые вопросы))
      Николай Савин
      24 мая 2017, 14:31
      0
      Программа сделает все, что вы сами предусмотрите. Я не понимаю Вас.
      Каким образом вы отправляете рассылку? Через что? Через Formit?
        Никита
        24 мая 2017, 14:40
        0
        [[!ajaxForm?
        &form=`tpl.podpiska`
        &hooks=`modSendPulseHook`
        &validate=`email:email:required`
        &validationErrorMessage=`В форме содержатся ошибки!`
        &successMessage=`Подписка успешно оформлена!`
        ]]
        вот так))
          Николай Савин
          24 мая 2017, 14:45
          0
          Вы можете добавить в параметр hooks Хук email, а также добавить параметр emailTo и письма будут отправляться по указанному адресу. Все просто. ПО вкусу также можно добавить чанк с текстом письма.
          Смотрите типовые настройки FormIt
            Николай Савин
            24 мая 2017, 14:46
            0
            &hooks=`modSendPulseHook,email`
               &emailTpl=`CentralizedDebtObligationEmailTpl`
               &emailSubject=`Some Sucker Bought Another CDO`
               &emailTo=`sales@mortgagemoney.com`
              Никита
              24 мая 2017, 15:40
              0
              Спасибо большое
        Andreykus
        06 июля 2017, 17:27
        0
        Спасибо, все работает. А есть ли возможность помещать пользователей в разные адресные книги при отправке формы с разных страниц через Formit?
          Николай Савин
          06 июля 2017, 20:02
          +1
          Вполне
          На каждой странице в вызов Formit вставляйте номер нужной книги в параметр &book.
          Не забудьте применить хук sendpulse (это будет сниппет, который нужно создать)
          Содержимое примерно такое

          // Вызываем класс 
          $modsendpulse = $modx->getService('modsendpulse');
          // Получаем email любым удобным способом, по вкусу проводим валидацию
          $email = 'test@text.ru';
          //Опционально добавляем Имя адресата любым удобным для Вас способом
          $name = 'Петя Иванов';
          //Номер адресной книги уже есть в параметре $book
          
          // Вызываем метод добавления email в адресную книгу
          $params['emails'] = array(
              array(
                  'email' => $email,  
                  'variables' => array(
                      'name' => $name  
                  )
              )
          );
          $modsendpulse->sendPulseAddEmailsToBook($params, $book);

          По идее такая конструкция должна решить ваш вопрос.
            Andreykus
            07 июля 2017, 10:07
            0
            Чего-то не сработало. Вроде сделал так же, как вы указали.
            [[!AjaxForm?
                                            &snippet=`FormIt`
                                            &form=`form-tpl`
                                            &hooks=`email,FormItSaveForm,modSendPulseHook,sendpulse`
                                            &book=`1XXXXX6`
                                            &emailSubject=`Сообщение с сайта [[++site_url]]`
                                            &emailTo=`info@site.ru`
                                          	&emailFrom=`info@site.ru`
                                            &emailTpl=`emailFormTpl`
                                            &formFields=`name,email,message,page`
                                            &successMessage=`Сообщение успешно отправлено`
                                            &validate=`name:required,email:email:required,check:required`
                                                &validationErrorMessage=`В форме содержатся ошибки!`
                                                &fiarSubject=`Спасибо за ваш вопрос!`
                                                &successMessage=`<h6>Ваше сообщение отправлено</h6><p style="width: 400px;">Наши специалисты свяжутся с вами в ближайшее время.</p>
            
            `
                                                &name.vTextRequired=`Напишите, как к вам обращаться`
                                                &email.vTextRequired=`На какую почту нам писать ответ`
                                                &check.vTextRequired=`Вы должны дать разрешение на обработку своих персональных данных`
                                        ]]
            Отдельно создал и скопировал ваш сниппет и дал ему имя sendpulse. При отправке формы указывал разные email, в том числе пробовал Петю Иванова и мыло test@text.ru, однако все равно данные добавляются в основную книгу
              Николай Савин
              07 июля 2017, 18:14
              0
              Ну для начала вы используете сразу два хука для sendPulse (modSendPulseHook,sendpulse)
              Первый уберите, либо уберите второй, а первый подкорректируйте.
                Andreykus
                07 июля 2017, 19:13
                0
                Удалил новый хук. А в старом как я понимаю, надо подправить строчку:
                if(!$book = $modx->getOption('modsendpulse_addressbook_user_create')){
                    $modx->log(1, '[modSendPulseHook] - No book number');
                }
                Что именно там править? Вот весь код сниппета:
                <?php
                if (!$modsendpulse = $modx->getService('modsendpulse')) {
                    $modx->log(1, '[modSendPulseHook] - Not found class modsendpulse');
                    return;
                }
                $modsendpulse->initialize($modx->context->key);
                
                $email = $hook->getValue('email');
                $name = $hook->getValue('name');
                
                if(!$email OR empty($email)){
                    $modx->log(1, '[modSendPulseHook] - No Email');
                }
                
                if(!$book = $modx->getOption('modsendpulse_addressbook_user_create')){
                    $modx->log(1, '[modSendPulseHook] - No book number');
                }
                
                $params['emails'] = array(
                    array(
                        'email' => $email,  
                        'variables' => array(
                            'name' => $name  
                        )
                    )
                );
                
                $modsendpulse->sendPulseAddEmailsToBook($params, $book);
                  Andreykus
                  07 июля 2017, 19:31
                  0
                  Я так понимаю, что надо просто убрать вот эту строчку?

                  if(!$book = $modx->getOption('modsendpulse_addressbook_user_create')){
                  $modx->log(1, '[modSendPulseHook] — No book number');
                  }
                    Иван Кизименко
                    15 августа 2017, 23:20
                    0
                    if(!$book = $modx->getOption('modsendpulse_addressbook_user_create')){
                    $modx->log(1, '[modSendPulseHook] — No book number');
                    }

                    Замени на такой вариант
                    if(!$book){
                    $book = $modx->getOption('modsendpulse_addressbook_user_create');
                    }

                    Это если у тебя в форме нету номера книги, тогда он возьмет стандартную книгу что у тебя в настройках введена.

                    В стандартном сниппете оно этой строчкой присваивает значение книги из системных настроек и проверяет не пустое ли оно, поэтому и не работает тк оно перезаписывает постоянно значение твое.
            Сергей Малышев
            03 сентября 2017, 15:20
            0
            Настроил рассылку. Но вот проблема — так как бесплатный аккаунт SendPulse и компонент modSendPulse не предлагают подтверждение через письмо, то это облегчает ботам подписаться на рассылку. После размещения формы рассылки на сайте сразу же начали регистрироваться подписчики с именами типа a7jf8kd79 — похоже это боты.
            Подскажите как от этого избавиться, хотя бы в основном, если не полностью. Например, как сделать валидацию имени, чтобы имена с цифрами не пропускались?
              Николай Савин
              03 сентября 2017, 21:07
              0
              Сами принципы валидации и проверки данных по шаблонам в PHP Вам понятны? Без использования каких либо компонентов?
                Сергей Малышев
                03 сентября 2017, 22:08
                0
                Спасибо за вопрос. Хотя пока ждал ответа — сам разобрался:
                В вызове Formit указываем параметры
                &customValidators=`isUserName`
                &validate=`name:required:isUserName,email:required,message:required:stripTags,workemail:blank`
                Сниппет валидации isUserName:
                <?php
                if (!preg_match('/^[a-zа-яё-]{2,30}$/iu', $value)) {
                    $validator->addError($key,'В имени могут содержаться только буквы и дефис - исправьте!');
                    return false;
                }
                return true;  //<-- if you omit this or return false, your form won't validate
                Может кому пригодится.
                  Николай Савин
                  03 сентября 2017, 22:31
                  0
                  Похоже на правду.
                    Bor
                    Bor
                    15 октября 2018, 23:09
                    0
                    А можно ли сделать, чтобы летело в несколько адресных книг?
                    &book=`201xxx2,2017xxx1`
                      Николай Савин
                      16 октября 2018, 05:12
                      1
                      +1
                      // Вызываем класс 
                      $modsendpulse = $modx->getService('modsendpulse');
                      // Получаем email любым удобным способом, по вкусу проводим валидацию
                      $email = 'test@text.ru';
                      //Опционально добавляем Имя адресата любым удобным для Вас способом
                      $name = 'Петя Иванов';
                      //Получаем номера адресной книги из параметров сниппета или указываем вручную
                      $books = '201xxx2,2017xxx1';
                      //Делаем из строки массив
                      $books = explode(',', $books);
                      //В цикле отправляем в каждую книгу отдельно
                      foreach($books as $book){
                      // Вызываем метод добавления email в адресную книгу
                      $params['emails'] = array(
                          array(
                              'email' => $email,  
                              'variables' => array(
                                  'name' => $name  
                              )
                          )
                      );
                      $modsendpulse->sendPulseAddEmailsToBook($params, $book);
                      }
                      //Если книг много, и ждать перебора с отправкой долго - пишем параметры в промежуточную таблицу задач, потом по крону вызываем таблицу и по порядку отправляем данные в книги
                        Bor
                        Bor
                        16 октября 2018, 19:13
                        0
                        Супер, спасибо!
                          Bor
                          Bor
                          22 октября 2018, 20:26
                          0
                          Можно еще момент уточнить.
                          Я делаю, чтобы юзер сам выбирал, в какие книги рассылки его добавлять.
                          В вызове формы добавил &books, куда по идее должны подставляться выбранные книги:
                          [[!AjaxForm?
                          	&snippet=`FormIt`
                          	&form=`podpiskaMailForm`
                          	&hooks=`mymodSendPulseHook`
                              &books=`[[+check-auto]]`
                              &emailSubject=`Новый подписчик`
                          ]]
                          Сама форма
                          <form action="[[~[[*id]]]]" method="post">
                          <input type="text" value="" placeholder="Email" name="email" >
                          <input type="text" value="" placeholder="auto" name="auto" >
                          <label class="checkbox"><input type="checkbox" name="check-auto[]" value="20172xx">	Машина 1</label>
                          <label class="checkbox"><input type="checkbox" name="check-auto[]" value="20282xx">	Машина 2</label>
                          <label class="checkbox"><input type="checkbox" name="check-auto[]" value="20172xx">	Машина 3</label>
                          <input type="submit" value="Получить скидку" name="send-podpis" class="send-promo">
                          </form>
                          Если в вызове Ajaxform вручную прописываю
                          &books=`20172xx,20282xx` = улетает все, как нужно.
                          Если же через чек боксы выбираю (хоть одну, хоть две) ничего не появляется.
                            Bor
                            Bor
                            24 октября 2018, 17:14
                            0
                            Решил проблему по другому.
                            Все выбранные чекбоксы просто загоняю в input hidden и уже его передаю в сниппет на обработку, может кому пригодится.

                            <!-- Подстановка номеров книг -->
                            <script>
                                jQuery(function($) {
                              var $text = $('#text-input'),
                                  $box = $('.check-a');
                                  $box.on('click change', function() {
                                var values = [];
                                $box.filter(':checked').each(function() {
                                  values.push(this.value);
                                });
                                $text.val(values.join(','));
                              });
                            });
                            </script>
                Eiry
                01 ноября 2018, 16:33
                0
                Кто-нибудь пробовал связать этот компонент с minishop2? Так чтобы по кнопке отправления заказа добавлялись сведения о покупателе в адресную книгу?
                Мне думается, что надо поправить класс-обработчик msOrderHandler, добавив в него что-то на тему:
                $modsendpulse = $modx->getService('modsendpulse');
                    $params['emails'] = array(
                    array(
                        'email' => $email,  
                        'variables' => array(
                            'name' => $name  
                        )
                    )
                );
                $modsendpulse->sendPulseAddEmailsToBook($params, $book);
                Сработает или лучше не пытаться?
                  Николай Савин
                  01 ноября 2018, 18:46
                  0
                  Это кардинально неправильный подход.
                  Нужно использовать систему плагинов. Попробуй создать плагин на событие onUserSave (не уверен, что это событие сработает). Как вариант можно создать плагин на событие msOnCreateOrder, там тоже есть доступ к данным заказчика. И уже оттуда отправлять данные в адресную книгу
                    Eiry
                    01 ноября 2018, 18:50
                    0
                    Да, я уже сам понял, что так делать нельзя. Сейчас дописываю плагин, он включается по событию msOnSubmitOrder.
                    Не разобрался пока как в адресную книгу телефон передать.
                      Николай Савин
                      01 ноября 2018, 18:52
                      0
                      Как передать, или где его взять?
                        Eiry
                        01 ноября 2018, 18:57
                        0
                        Как передать.
                        switch ($modx->event->name) {
                            case 'msOnSubmitOrder':
                            	$modx->log(MODX_LOG_LEVEL_ERROR, "1");
                            	$modsendpulse = $modx->getService('modsendpulse','modsendpulse',MODX_CORE_PATH.'/components/modsendpulse/model/modsendpulse/');
                            	if(!$modsendpulse) $modx->log(MODX_LOG_LEVEL_ERROR, "2");
                        		$email = $data['email'];
                        		$modx->log(MODX_LOG_LEVEL_ERROR, $email);
                        		$name = $data['receiver'];
                        		$modx->log(MODX_LOG_LEVEL_ERROR, $name);
                        		$books = $modx->getOption('modsendpulse_addressbook_user_create');
                        		$modx->log(MODX_LOG_LEVEL_ERROR, $books);
                        		$books = explode(',', $books);
                        		foreach($books as $book){
                        			$params['emails'] = array(
                        			    array(
                        			        'email' => $email,
                        			        'variables' => array(
                        			            'name' => $name  
                        			        )
                        			    )
                        			);
                        			$modsendpulse->sendPulseAddEmailsToBook($params, $book);
                        		}
                            break;
                        }
                        Сделал так, но почему-то в адресной книге запись не создалась.
                          Николай Савин
                          01 ноября 2018, 19:11
                          0
                          Не помню точно, возвращается ли ошибка от sendPulse, но Попробуй так.
                          $response = $modsendpulse->sendPulseAddEmailsToBook($params, $book);
                          $modx->log(1, print_r($response, 1));

                          Компонент с некоторого времени платный (290 руб) — если не получится — покупай, пиши в поддержку — поковыряем вместе уже более подробно
                  Олег
                  24 апреля 2019, 19:30
                  0
                  Добрый день! Идея вероятно из области фантастики, но все же:
                  Реально ли публикуя на сайте новость (отметив ее к примеру чекбоксом) при сохранении запускать плагин, который отправит в Send Puls команду на рассылку контента и картинки (картинка из TV поля) из этой статьи всем подписчикам?
                    Николай Савин
                    24 апреля 2019, 20:01
                    0
                    Насколько я знаю, шаблоны рассылок sendPulse никак от сайта не зависят и формируются ТОЛЬКО внутри интерфейса sendPulse. Никаким образом они не принимают контент извне, в том числе из сайта.

                    Для твоей задачи — думаю лучше воспользоваться отдельным компонентом, вроде sendex. Но тут в качестве минуса можно отметить то, что не будет возможности отслеживать доставку, открытие писем, как в SendPulse.

                    Возможно есть решения для сочетания всех идей и преимуществ — я не особо вникал в тему рассылок
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    34