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

Дополнение: Tickets

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

Комментарии (5)

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