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

собсно… сабж… Сделал премодерацию на сайте с фронта, но не получаю письма при добавлении в черновик. Как победить? Уровень уведомления админов стоит «2», админ для уведомлений указан и получает их если тикет опубликован. Но для черновиков — нет.
Pavel
14 июля 2017, 20:18
modx.pro
2
1 392
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' ее вызывать. Но моих знаний недостаточно ) если кто знает как улучшить данный костыль — напишите сюда)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5