Уведомления о новых Тикетах добавленных в черновик
собсно… сабж… Сделал премодерацию на сайте с фронта, но не получаю письма при добавлении в черновик. Как победить? Уровень уведомления админов стоит «2», админ для уведомлений указан и получает их если тикет опубликован. Но для черновиков — нет.
Комментарии: 5
Вообщем написал свой плагин, подписался на OnDocFormSave, проверяю, если он новый и еще не опубликован — то отправляю смс в телеграмм. Если кому надо — пишите.
Так сюда выложи.
ок
Я не php программист, написал как смог… можете улучшать на свое усмотрение. Плагин отправляет месадж в телеграмм и на почту админу/юзеру. Можно создать разные чанки для писем админу и юзеру. Сам плагин нужно включить для события OnDocFormSave. Для отправки на телеграмм нужно создать своего бота и получить токен + узнать ИД чата — как это сделать гуглите, инфы полно.
<?php
// указать id шаблонов, для которых будет работать плагин.
$template = array(7,13,14);
if (!in_array($resource->get('template'), $template)) {
return;
}
$user = $modx->getObject('modUser', $resource->get('createdby'));
$profile = $user->getOne('Profile');
$usermail = $profile->get('email');
$username = $profile->get('fullname');
$manger = $modx->getObject('modUser', $resource->get('editedby'));
$page_id = $resource->get('id');
$res = $modx->getObject('modResource', $page_id);
$title = $resource->get('pagetitle');
$pub = $resource->get('published');
$txt ='';
$url = 'https://site.ru/manager/index.php?a=resource/update&id='.$page_id;
$front_url = 'https://site.ru/'.$resource->get('uri');
function sendTelegram($msg = '', $chat = '') {
$msg = urlencode($msg);
$token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$tele="https://api.telegram.org/bot".$token."/sendMessage?disable_web_page_preview=true&chat_id=".$chat."&text=".$msg." ";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$tele");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
switch ($modx->event->name) {
case 'OnDocFormSave':
if ($resource->get('class_key') == 'Ticket' ) {
if ($mode == 'new') { // если это новый тикет
if($pub == 1) {
// ничего не отправляем, т.к. тикет опубликован
} else {
$txt = 'Новый тикет! '.$title.'. URL: '.$url.' Ожидает модерации!';
}
} else { // Если тикет обновили
if ($manger->isMember(array('Administrator','Moderator')) ) {
if (!$resource->get('published')) {
$txt = 'Модератор снял с публикации - '.$title.'. URL: '.$url.'';
} else {
$txt = 'Модератор опубликовал - '.$title.'. URL: '.$front_url.'';
}
} else if ($pub == 1) {
// Если юзер обновил тикет - снимаем с публикации.
$txt = 'Страницу каталога обновили! '.$title.'. URL: '.$url.' Ожидает модерации!';
$res->set('published', 0);
$res->save();
}
}
sendTelegram($msg = $txt, $chat = 'ХХХХХХХХ'); // указываем ID чата и отправляем сообщение в телеграмм
}
break;
}
// отправка email
if(!$pub) {
$pub = 0;
}
// добавляем плейсхолдеры для чанка. Используем как [[+my.title]]
$modx->setPlaceholders(array(
'username' => $username,
'usermail' => $usermail,
'title' => $title,
'pub' => $pub, // статус публикации - 0/1
'mode' => $mode, // статус тикета - new/upd
'url' => $url, // урл тиката в админке
'front_url' => $front_url, // урл тикета на фронте
),'my.');
// в массиве указываем почту и чанк шаблон для отправки
$notify = array(
'admin@site.ru' => 'notifyTplToAdmin',
$usermail => 'notifyTplToUser'
);
foreach ( $notify as $k => $v ) {
/*Активируем почтовый сервис MODX*/
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
/*Адрес получателя нашего письма*/
$modx->mail->address('to', $k);
$modx->mail->set(modMail::MAIL_SUBJECT, 'Тут тема письма');
/*Подставляем чанк с телом письма*/
$modx->mail->set(modMail::MAIL_BODY, $modx->getChunk($v));
// Отправляем письмо
$modx->mail->setHTML(true);
if ($mode == 'new') {
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
} else {
// не отправляем письма при каждом обновлении, только если опубликовано или снято с публикации
if ($manger->isMember(array('Administrator','Moderator')) ) {
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
} else if ($resource->get('published') == 1) {
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
}
}
$modx->mail->reset();
}
по хорошему, тут нужно отправку на почту засунуть в отдельную функцию, которая будет принмать значения почты и имя чанка, а потом уже внутри case 'OnDocFormSave' ее вызывать. Но моих знаний недостаточно ) если кто знает как улучшить данный костыль — напишите сюда)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.