Как реализовать массовую рассылку через FormIt?
Всем привет.
Имеется форма: Город (select из 5ти городов), Имя, Email, Телефон, Сообщение, кнопка «Отправить».
Всё передается в параметры GET.
Эта форма работает в качестве формы поиска для фильтрации ресурсов:
Вот так реализовано на страничке филиала:
Как реализовать персональную рассылку данных из этой формы всем филиалам, кто попал под критерий «Города»?
Имеется форма: Город (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,
Как реализовать персональную рассылку данных из этой формы всем филиалам, кто попал под критерий «Города»?
Комментарии: 7
Код формы? Как выглядит вывод AjaxForm? Форма для поиска и форма, данные из которой нужно рассылать, это разные формы?
Всего 1 форма, в ней в списке (select) выбираем город (например, Москва), заполняем поля Имя, Ваш email, Запрос, ждем Отправить.
После этого надо отправить по всем email'ам, кто находится внутри коллекции Москва (всем дочерним ресурсам — филиалам), у которых в ТВ хранятся разные email'ы.
Вызов:
Сам сниппет setEmails:
После этого надо отправить по всем 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,». Чтобы бы другие получатели не видели кому еще отправлено письмо. Кроме того проблема в том, что я не знаю как отправить письма через FormIt персонально, а не в таком виде «mail1@mail.com,mail3@mail.com,mail3@mail.com,». Чтобы бы другие получатели не видели кому еще отправлено письмо.Учитывая это, пиши свой хук, который будет в цикле рассылку делать.
Можешь пример набросать, пожалуйста?
Не могу представить в какую сторону копать. Циклы могу, но не понимаю, как сделать именно персональную рассылку.
Не могу представить в какую сторону копать. Циклы могу, но не понимаю, как сделать именно персональную рассылку.
Пишешь обычный сниппет, в котором из глобального массива $_POST получаешь поле в котором у тебя выбранный город, это если он указан в отправляемой форме, если нет, то бери из массива get, в общем тебе нужен город. Учитывая, что Город это ресурс-коллекция, то лучше чтобы ты получал не название, а id. Потом через getIterator получаешь доверие ресурсы и по ним запускаешь цикл, в котором делаешь отправку писем, в modx есть для этого встроенные средства. Когда закончишь верни из сниппета true. И потом в вызов поставь вместо стандартного хука email название своего сниппета.
Отправку можно делать так
<?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();
НО всё что я написал это лишь моё предположение, возможно в цикле отправлять и не получится.
Спасибо.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.