[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, а предпочитаете обрабатывать формы используя собственные сниппеты.

// Вызываем класс 
$modsendpulse = $modx->getService('modsendpulse');
//Инициируем (получаем токен для запросов к 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
7
2 196
+9

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

Никита
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 руб) — если не получится — покупай, пиши в поддержку — поковыряем вместе уже более подробно