Уведомления о новых Тикетах добавленных в черновик

собсно… сабж… Сделал премодерацию на сайте с фронта, но не получаю письма при добавлении в черновик. Как победить? Уровень уведомления админов стоит «2», админ для уведомлений указан и получает их если тикет опубликован. Но для черновиков — нет.
Pavel
14 июля 2017, 20:18
2
343
0

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

Pavel
15 июля 2017, 02:09
0
Вообщем написал свой плагин, подписался на OnDocFormSave, проверяю, если он новый и еще не опубликован — то отправляю смс в телеграмм. Если кому надо — пишите.
    Михаил
    17 июля 2017, 13:32
    +1
    Так сюда выложи.
      Pavel
      17 июля 2017, 14:07
      0
      ок
Pavel
17 июля 2017, 14:03
+3
Я не 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();
}
    Pavel
    17 июля 2017, 15:37
    0
    по хорошему, тут нужно отправку на почту засунуть в отдельную функцию, которая будет принмать значения почты и имя чанка, а потом уже внутри case 'OnDocFormSave' ее вызывать. Но моих знаний недостаточно ) если кто знает как улучшить данный костыль — напишите сюда)