Разная почта менеджера в зависимости от варианта доставки

Доброго времени суток, уважаемое сообщество!
Возникла необходимость отправлять письмо о новом заказе на разных менеджеров — разные email-адреса (в зависимости от выбранного клиентом варианта доставки). Облазил казалось бы все, но как внедрить такой функционал так и не понял :(
Упоминание о email менеджера нашел только в файле 'core/components/minishop2/model/minishop2/minishop2.class.php' в этой строке:
$emails = array_map('trim', explode(',',$this->modx->getOption('ms2_email_manager', null, $this->modx->getOption('emailsender'))));
Как сделать правильно без «ковыряния» исходных файлов, к сожалению не хватает знаний.
Очень прошу помощи у сообщества. Заранее благодарен.

Вроде получилось. Выкладываю полностью код плагина, может кому-нибуть пригодится:
switch ($modx->event->name) {
  case 'msOnChangeOrderStatus':
    if ($status==1) { // если заказ в статусе "Новый"
      $delivery_id = $order->get('delivery');
      $order_num = $order->get('num');
      if ($delivery_id == 1) { // если выбран метод доставки "Самовывоз" (ID=1)

        $pls = $order->toArray(); // массив данных заказа

        $tpl = 'tpl.OrderEmail.new.manager'; // чанк шаблона оформления письма о новом заказе для менеджера
        
        
        $email_from = $modx->getOption('emailsender'); // эл.адрес оправителя письма
        $sitename = $modx->getOption('site_name'); // имя/название отправителя письма
        $email_to = 'manager@store.com'; // эл.адрес получателя письма (менеджера)
        $subject = 'У вас новый заказ #' . $order_num; // тема письма
        $body = $modx->runSnippet('msGetOrder', array_merge($pls, array('tpl' => $tpl)));
        
        

        // отправка письма
        if ($email_to != '') {
          $modx->getService('mail', 'mail.modPHPMailer');
          $modx->mail->set(modMail::MAIL_BODY,$body);
          $modx->mail->set(modMail::MAIL_FROM,$email_from);
          $modx->mail->set(modMail::MAIL_FROM_NAME,$sitename);
          $modx->mail->set(modMail::MAIL_SUBJECT,$subject);
          $modx->mail->address('to',$email_to);
          // $modx->mail->address('reply-to','me@xexample.org'); // - раскомментировать и указать email на который хотите отправить копию этого письма
          $modx->mail->setHTML(true);
          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();
        }

      }
      
    }
    break;
}
Незабываем повесить плагин на событие msOnChangeOrderStatus.

P.S. Если кто-то сможет подсказать более правильный/лучший вариант решения данной задачи — буду только благодарен.
Михаил
15 марта 2018, 17:59
modx.pro
5
2 827
0

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

Артур
15 марта 2018, 23:28
0
Вешаем свой плагин на событие msOnChangeOrderStatus.
В нем извлекаете статус и доставку, далее отсылаете письмо.
А в настройках самого minishop для статуса «Новый» убираете галочку с «Письмо менеджеру»
    Михаил
    18 марта 2018, 11:38
    0
    Артур, спасибо что откликнулись. Могли бы подсказать еще немного?
    Я создал плагин с таким содержимиым:
    <?php
    switch ($modx->event->name) {
      case 'msOnChangeOrderStatus':
        if ($status==1) {
          
          $delivery_id = $order->get('delivery'); // получаю ID вида доставки
          
          if ($delivery_id == 1) { // если самовывоз, тогда:
    
                // тут получение чанка для генерации письма менеджеру и его отправка
            
          }
          
        }
        break;
    }
    Блок с генерацией письма менеджеру я попытался взять с файла minishop2.class.php:
    $pls = $order->toArray();
                $pls['cost'] = $this->formatPrice($pls['cost']);
                $pls['cart_cost'] = $this->formatPrice($pls['cart_cost']);
                $pls['delivery_cost'] = $this->formatPrice($pls['delivery_cost']);
                $pls['weight'] = $this->formatWeight($pls['weight']);
                $pls['payment_link'] = '';
    
                if ($status->get('email_manager')) {
                    $subject = $this->pdoTools->getChunk('@INLINE ' . $status->get('subject_manager'), $pls);
                    $tpl = '';
                    if ($chunk = $this->modx->getObject('modChunk', $status->get('body_manager'))) {
                        $tpl = $chunk->get('name');
                    }
                    $body = $this->modx->runSnippet('msGetOrder', array_merge($pls, array('tpl' => $tpl)));
                    $emails = array_map('trim', explode(',',
                            $this->modx->getOption('ms2_email_manager', null, $this->modx->getOption('emailsender')))
                    );
                    if (!empty($subject)) {
                        foreach ($emails as $email) {
                            if (preg_match('#.*?@.*#', $email)) {
                                $this->sendEmail($email, $subject, $body);
                            }
                        }
                    }
                }
    Но, оно начало ругатся на использование пользовательских функций formatPrice() и get().
    Могли бы подсказать как правильно переписать эти запросы, чтобы письмо менеджеру отправлялось по старндартному шаблону указаному в настройках минишопа.
    Буду очень благодарен за помощь.
      Артур
      19 марта 2018, 08:33
      0
      Если вы хотите пользоваться этими методами, тогда нужно обращаться не от $this, а от $minishop.
      Получится что-то вроде такого
      $minishop = $modx->getService('miniShop2');
      $minishop->formatWeight($pls['weight']);
      А
      $status->get('email_manager')
      вам даже не нужен, вы же отключили его, хотя иной раз можно сделать проверку, чтобы переключать функционал оповещения (т.е. при включенном оповещении, основное содержимое плагина не будет выполняться.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3