Как реализовать массовую рассылку через FormIt?

Всем привет.

Имеется форма: Город (select из 5ти городов), Имя, Email, Телефон, Сообщение, кнопка «Отправить».
Всё передается в параметры GET.

Эта форма работает в качестве формы поиска для фильтрации ресурсов:
{var $filterSnippet = $_modx->runSnippet('@FILE snippets/getFiltersFields.php')}

{$_modx->runSnippet('pdoResources', [
	'parents' => $_modx->resource.id,
	'depth' => 2,
	'where' => ['template' => 3, $filterSnippet],
	'showLog' => 0,
])}
«Города» — это коллекция, в которой содержатся ресурсы филиалов (в городе по несколько филиалов), у каждого филиала разные email и хранятся в TV.

Вот так реализовано на страничке филиала:
'emailTo' => $_modx->resource.filial_email,

Как реализовать персональную рассылку данных из этой формы всем филиалам, кто попал под критерий «Города»?
Anton
12 апреля 2021, 19:13
modx.pro
530
0

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

Артур Шевченко
13 апреля 2021, 17:49
+1
Код формы? Как выглядит вывод AjaxForm? Форма для поиска и форма, данные из которой нужно рассылать, это разные формы?
    Anton
    13 апреля 2021, 18:32
    0
    Всего 1 форма, в ней в списке (select) выбираем город (например, Москва), заполняем поля Имя, Ваш email, Запрос, ждем Отправить.
    После этого надо отправить по всем email'ам, кто находится внутри коллекции Москва (всем дочерним ресурсам — филиалам), у которых в ТВ хранятся разные email'ы.

    Вызов:
    {$_modx->runSnippet('!AjaxForm', [
        'snippet' => 'FormIt',
        'form' => '@FILE chunks/forms/emailForm.tpl',
        'preHooks' => '',
        'hooks' => 'setEmails,email',
        'emailTo' => '[[+parsedEmails]]',
        'emailTpl' => '@FILE chunks/forms/emailFormReport.tpl',
        'emailSubject' => 'Test Message',
        'validate' => '',
    ])}
    Простейшая форма для тестов:
    <form action="{$_modx->resource.id | url}" method="post" id="callbackform" class="ajax_form">
    
        <div class="form-group">
            <label for="callbackform_location">location:</label>
            <input type="text" class="form-control" id="callbackform_location" name="location"
                   placeholder="location">
        </div>
    
        <div class="form-group">
            <label for="callbackform_name">name:</label>
            <input type="text" class="form-control" id="callbackform_name" name="name"
                   placeholder="name">
        </div>
    
        <div class="form-group">
            <label for="callbackform_email">email:</label>
            <input type="email" class="form-control" id="callbackform_email" name="email"
                   placeholder="email">
        </div>
    
        <div class="form-group">
            <label for="callbackform_text">message:</label>
            <textarea class="form-control" name="message" id="callbackform_text"
                      placeholder="message"
                      required></textarea>
        </div>
    
        <button type="submit" class="btn btn-blue">Send</button>
    
    </form>

    Сам сниппет setEmails:
    <?php
    
    $array_ids = $modx->getChildIds(2, 1, array('context' => 'web',));
    
    $docs = $modx->getCollection('modResource', array(
        'id:IN' => $array_ids,
        'template' => 2,
    ));
    
    foreach ($docs as $doc) {
        if ($doc->getTVValue('email_req')) {
            $parsedEmails = $doc->getTVValue('email_req') . ',';
            $hook->setValue('parsedEmails', $parsedEmails);
        }
    }
    
    return true;
    Кроме того проблема в том, что я не знаю как отправить письма через FormIt персонально, а не в таком виде «mail1@mail.com,mail3@mail.com,mail3@mail.com,». Чтобы бы другие получатели не видели кому еще отправлено письмо.
      Артур Шевченко
      13 апреля 2021, 18:43
      0
      Кроме того проблема в том, что я не знаю как отправить письма через FormIt персонально, а не в таком виде «mail1@mail.com,mail3@mail.com,mail3@mail.com,». Чтобы бы другие получатели не видели кому еще отправлено письмо.
      Учитывая это, пиши свой хук, который будет в цикле рассылку делать.
        Anton
        13 апреля 2021, 18:59
        0
        Можешь пример набросать, пожалуйста?
        Не могу представить в какую сторону копать. Циклы могу, но не понимаю, как сделать именно персональную рассылку.
          Артур Шевченко
          13 апреля 2021, 19:47
          +1
          Пишешь обычный сниппет, в котором из глобального массива $_POST получаешь поле в котором у тебя выбранный город, это если он указан в отправляемой форме, если нет, то бери из массива get, в общем тебе нужен город. Учитывая, что Город это ресурс-коллекция, то лучше чтобы ты получал не название, а id. Потом через getIterator получаешь доверие ресурсы и по ним запускаешь цикл, в котором делаешь отправку писем, в modx есть для этого встроенные средства. Когда закончишь верни из сниппета true. И потом в вызов поставь вместо стандартного хука email название своего сниппета.
    Артур Шевченко
    13 апреля 2021, 19:58
    +1
    Отправку можно делать так
    <?php
    if(!isset($chunk)){
        $modx->log(1, 'Письмо не отправлено. Не передеан чанк');
        return false;
    }
    
    if(!isset($to)){
        $modx->log(1, 'Письмо не отправлено. Не передеан email получателя');
        return false;
    }else{
        $to = explode (',',$to);
    }
    
    if(!isset($subject)){$subject = 'noreply@'.$_SERVER['HTTP_HOST'];}
    if(!isset($from)){$from = 'noreply@'.$_SERVER['HTTP_HOST'];}
    if(!isset($reply)){$reply = $from;}
    if(!isset($fromName)){$fromName = $modx->getOption('site_name');}
    if(!isset($params)){
        $params = array();
    }elseif(!is_array($params)){
        $params = json_decode($params, 1);
    }
    $modx->getService('mail', 'mail.modPHPMailer');
    $pdoTools = $modx->getService('pdoTools');
    $modx->getService('mail', 'mail.modPHPMailer');
    
    $message = $pdoTools->getChunk($chunk, $params);
    $modx->mail->set(modMail::MAIL_BODY,$message);
    $modx->mail->set(modMail::MAIL_FROM, $from);
    $modx->mail->set(modMail::MAIL_FROM_NAME, $fromName);
    $modx->mail->set(modMail::MAIL_SUBJECT, $subject);
    foreach($to as $t){
        $modx->mail->address('to',$t);
    }
    $modx->mail->address('reply-to', $reply);
    if(isset($attachment)){
        $modx->mail->attach($attachment);
    }
    
    $modx->mail->setHTML(true);
    if (!$modx->mail->send()) {
        $modx->log(1,'При отправке письма произошла ошибка: '.$modx->mail->mailer->ErrorInfo);
    }
    
    $modx->mail->reset();
    НО всё что я написал это лишь моё предположение, возможно в цикле отправлять и не получится.
      Anton
      16 апреля 2021, 13:32
      0
      Спасибо.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      7