[msTelegram] Уведомления о заказе в telegram

Небольшой плагин на уведомление о новом заказе в телеграм, отличная замена сервисам смс рассылки.

Сделано на основе гайда от Михаила.
Как получить токен, узнать айди чата и тд так же отлично расписано в гайде.




Плагин вешается на событие msOnCreateOrder.

if($modx->event->name != 'msOnCreateOrder') return;

$token = '<token>';
$contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
$_products = $msOrder->getMany('Products');

// Список получателей, у меня их много, если будет один можно обойтись одной переменной и убрать foreach
$recipients = array(
    '<chat id>'
);

// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    $i++;
    $products .= "{$i}. {$product->name} ({$product->count} шт.)";
}

// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
-----
{$products}
-----
Телефон: {$contacts->phone}";

$message = urlencode($message);
foreach($recipients as $id){
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
    $result = curl_exec($ch);
    curl_close($ch);
}
p.s. fopen заменил на curl т.к. на некоторых устройствах получал сообщение в виде urlencode().
but1head
18 сентября 2016, 23:26
modx.pro
21
10 226
+18

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

but1head
20 сентября 2016, 19:08
+5
Опубликовали в modstore
Александр
26 сентября 2016, 14:12
0
Добрый день.
Помогите настроить плагин на работу с Shopkeeper 3? Кто нибудь знает как это сделать?
    Константин
    02 июля 2017, 12:44
    0
    День добрый.
    Подскажите почему может не отображаться почта в сообщении, которую указывает клиент?
    // Текст сообщения
    $message = "
    Новый заказ #{$msOrder->num}
    на сумму {$msOrder->cost} р.
    -----
    {$products}
    -----
    Клиент: {$contacts->receiver}
    -----
    Телефон: {$contacts->phone}
    -----
    Почта: {$contacts->email}
    -----
    Комментарий: {$contacts->comment}";
      Володя
      02 июля 2017, 12:51
      +1
      если посмотреть сюда github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L337-L352
      то видно что там нет поля email.

      нужно получить профиль пользователя и оттуда взять email
      $profile = $msOrder->getOne('UserProfile')
      {$profile->email}
        Константин
        02 июля 2017, 13:11
        0
        Теперь знаю куда смотреть) Спасибо за помощь
          Алексей
          17 октября 2020, 22:40
          0
          А как получить варианты доставки и оплаты?
          Подскажите пожалуйста, что-то не разберусь.
            Александр
            18 ноября 2020, 12:17
            0
            if ($msOrder->delivery == '1') {
                $deli = "Способ доставки: Самовывоз";
                } else {
                  
               $deli = "Способ доставки: Доставка";
            }
            
            if ($msOrder->payment == '1') {
                $pay = "Способ оплаты: Оплата в магазине";
                } else {
                    
               $pay = "Способ оплаты: Онлайн картой";
            }
            Сделал так, кривовато конечно, но логика такая — подстроите под себя
              Денис Мижеревич
              21 апреля 2021, 19:16
              0
              Можете подсказать, как правильно это логику написать? Где она пишется?

              Вот, если сюда эту логику добавить, то как это сделать?
              // Текст сообщения
              $message = "
              Новый заказ #{$msOrder->num}
              на сумму {$msOrder->cost} р.
              Оплата: {$msOrder->payment}
              — {$products}
              — Имя: {$contacts->receiver}
              Телефон: {$contacts->phone}
              Email: {$profile->email}
              Улица: {$contacts->street}
              Дом: {$contacts->building}
              Квартира: {$contacts->room}
              Комментарий: {$contacts->comment}";
                Sergey
                21 апреля 2021, 19:20
                +1
                if ($msOrder->delivery == '1') {
                    $deli = 'Способ доставки: Самовывоз';
                    } else if ($msOrder->delivery == '2') {
                        $deli = 'Курьерская доставка Деливери';
                    } else {
                   $deli = 'Самовывоз из Новой Почты';
                }
                
                if ($msOrder->payment == '2') {
                    $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                    } else {
                   $pay = 'Способ оплаты: Оплата при получении';
                }
                // Текст сообщения
                $message = "
                Новый заказ #{$msOrder->num}
                на сумму {$msOrder->cost} грн.
                --------------------------------------
                {$pay}
                {$deli}
          Александр
          30 ноября 2020, 11:12
          0
          А изображение продукта можно как-то получить? Не подскажете?
        Александр
        19 июня 2018, 08:05
        0
        Приветствую! Плагин работает отлично! Не подскажете, как добавить адрес доставки?
          Александр
          23 июля 2018, 12:25
          0
          Вопрос про добавление адреса доставки решен.
            Александр
            18 ноября 2020, 11:40
            0
            Добрый день, а не поделитесь решением?
              Александр
              18 ноября 2020, 11:50
              0
              // Текст сообщения
              $message = "
              Новый заказ #{$msOrder->num}
              на сумму {$msOrder->cost} р.
              Оплата: {$msOrder->payment}
              -----
              {$products}
              -----
              Имя: {$contacts->receiver}
              Телефон: {$contacts->phone}
              Email: {$profile->email}
              Улица: {$contacts->street}
              Дом: {$contacts->building}
              Квартира: {$contacts->room}
              Комментарий: {$contacts->comment}";
                Александр
                18 ноября 2020, 11:52
                0
                Простите, что отвлёк, не туда комментарий оставил. Искал варианты оплаты и доставки. Спасибо!
          Sergey
          10 сентября 2019, 09:39
          0
          Как изменить текст сообщения? Создал сниппет, хотел изменить текст сообщения, сохраняю, но в телеграмму приходит старый
            Ishvan
            11 сентября 2019, 11:17
            +1
              Sergey
              11 сентября 2019, 11:21
              0
              Спасибо большое
            Rodion
            21 октября 2019, 12:47
            0
            Добрый день! Все настроил по инструкции. Но при заказе отправка в телегу не идет.
            Как можно отладить? и проверить?
              Влад
              30 декабря 2020, 13:28
              0
              Добрый день! Может кто подсказать, как еще достать артикул товара?
              $product->article
              не проходит
              При этом
              $product->product_id
              работает, но это не является решением
                Николай Савин
                30 декабря 2020, 15:03
                +1
                $product->Product->get('article')
                  Влад
                  30 декабря 2020, 15:57
                  0
                  Был близок пробуя что-то подобное :D
                  $product->get('article')
                  Спасибо за Ваш ответ, Николай! Всё работает
                PlanB
                21 апреля 2021, 22:55
                0
                Всем привет!
                Может кто-нибудь подскажет, как можно в телеграм отправлять в том числе опции товара, которые заданы через msOptionsPrice2?
                  Sergey
                  22 апреля 2021, 20:06
                  0
                  Добрый вечер! Нужна помощь.

                  Как получить значение (https://prnt.sc/11vqy4a) size из заказа в формате:Размер: AirPods 1/2

                  Пробовал {$product['size']}, {$product->size}, $product->Product->get('size')} ничего не работает (

                  <?php
                  if($modx->event->name != 'msOnCreateOrder') return;
                  
                  $token = $modx->getOption('mstelegram_token', null, false);
                  $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                  
                  $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                  $_products = $msOrder->getMany('Products');
                  $profile = $msOrder->getOne('UserProfile');
                  $properties = $msOrder->get('properties');
                  
                  // Список товаров в заказе
                  $i = 0;
                  $products = '';
                  foreach ($_products as $product) {
                      $i++;
                      $products .= "{$i}. {$product->name} ({$product->count} шт.) - {$product->Product->get('price')} грн";
                  }
                  
                  if ($msOrder->delivery == '1') {
                      $deli = 'Способ доставки: Самовывоз';
                      } else if ($msOrder->delivery == '2') {
                          $deli = 'Курьерская доставка Деливери';
                      } else {
                     $deli = 'Самовывоз из Новой Почты';
                  }
                  
                  if ($msOrder->payment == '2') {
                      $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                      } else {
                     $pay = 'Способ оплаты: Оплата при получении';
                  }
                  // Текст сообщения
                  $message = "
                  Новый заказ #{$msOrder->num}
                  на сумму {$msOrder->cost} грн.
                  --------------------------------------
                  {$pay}
                  {$deli}
                  --------------------------------------
                  Данные доставки:
                  
                  Имя: {$contacts->receiver}
                  Телефон: {$contacts->phone}
                  --------------------------------------
                  Товары:
                  
                  {$products}
                  --------------------------------------
                  Email: {$profile->email}";
                  
                  
                  
                  $message = urlencode($message);
                  foreach($recipients as $id){
                  	$id = trim($id);
                  	if(!$id) continue;
                      $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                      $ch = curl_init();
                      curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                      $result = curl_exec($ch);
                      curl_close($ch);
                  }
                    Николай Савин
                    22 апреля 2021, 21:04
                    +1
                    В вашем случае size из заказа нужно вытаскивать примерно так
                    $options = $product->get('options');
                    $size = $options['size'];
                      Sergey
                      22 апреля 2021, 21:54
                      0
                      Спасибо, работает ))

                      Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
                        Николай Савин
                        23 апреля 2021, 08:12
                        +1
                        Ровно так же как и родные поля таблицы адреса, через get
                        $properties = $msOrder->get('properties');
                          Sergey
                          23 апреля 2021, 12:13
                          0
                          У меня в msOrder поле для самовывоза
                          select id=«delivery_shop» name=«extfld_delivery_shop» value="{$form['extfld_delivery_shop']}" class=«form-control»

                          Нужно вот так?
                          $properties = $msOrder->get('properties');
                          $delshop = $properties['extfld_delivery_shop'];


                          И просто вывод {$delshop} )?
                            Николай Савин
                            23 апреля 2021, 12:15
                            +1
                            Да нет же
                            $extfld_delivery_shop = $msOrder->get('extfld_delivery_shop');
                              Sergey
                              23 апреля 2021, 12:17
                              0
                              Спасибо огромное, чет затупил )))
                                Николай Савин
                                23 апреля 2021, 12:19
                                +1
                                Нет, я тоже затупил. Неверно подсказал. У вас данные хранятся не в заказе, а в адресе, это другая таблица. Нужно добавить ссылку.
                                $extfld_delivery_shop = $msOrder->Address->get('extfld_delivery_shop');
                                  Sergey
                                  23 апреля 2021, 12:20
                                  0
                                  Спасибо большое ))
                                    Sergey
                                    26 апреля 2021, 12:05
                                    0
                                    Не подскажете еще как получить цену именно из Модификации (msOptionsPrice2)?

                                    $sizePrice = $options['price'];
                                    Выводит цену минишопа, а нужно цену модификации. И сумма тоже считается с минишопа а не с модификации

                                    https://prnt.sc/12331c2
                                      Николай Савин
                                      26 апреля 2021, 12:09
                                      0
                                      Примерно вот так
                                      $mod = $modx->getObject('msopModification', array(
                                          'rid' => $product->product_id,
                                          'id' => $option['modification_id'],
                                      ));
                                      
                                      $price = $mod->get('price')
                                        Sergey
                                        26 апреля 2021, 12:17
                                        0
                                        Чего то не работает, пишет в консоле 500 ошибку у action.php когда пытаешься сделать заказ(
                                        Николай Савин
                                        26 апреля 2021, 12:20
                                        0
                                        Возможно у вас в данном месте переменная $product не определена. Там должен быть объект товара из заказа.
                                        Sergey
                                        26 апреля 2021, 12:22
                                        0
                                        Так пробовал

                                        foreach ($_products as $product) {
                                        $i++;
                                        $mod = $modx->getObject('msopModification', array(
                                        'rid' => $product->product_id,
                                        'id' => $option['modification_id'],
                                        ));
                                        $price = $mod->get('price');
                                        $products .= "{$i}. {$product->name} ({$product->count} шт.) — {price} грн";
                                        }
                                        Николай Савин
                                        26 апреля 2021, 12:27
                                        0
                                        Ну чтобы ошибки не было нужно написать вот так
                                        $price = 0;
                                        if($mod) {
                                        $price = $mod->get('price');
                                        }
                                        У вас почему то запрос к модификации не происходит. Ошибки не будет, но и цену не получите.
                                        Скорее всего неверно $option['modification_id'] написал.
                                        Навскидку не помню как номер модификации в заказе хранится.
                                        Распечатайте посмотрите — и скорректируйте этот момент.
                                        Sergey
                                        27 апреля 2021, 14:08
                                        0
                                        Чего то не получается никак получить (((
                                        Николай Савин
                                        27 апреля 2021, 14:10
                                        0
                                        Печально (
                    pobnpolk
                    18 мая 2021, 09:32
                    0
                    У меня проблема. добавляю руками в опции: mstelegram_recipients — id пользователей. и при отправке все пользователи перечисленные в настройках видят уведомления. Это ведь явно не должно быть.
                    И очень неудобно добавлять постоянно в mstelegram_recipients пользователей. можно ведь как-то автоматизировать процесс.
                    Кто-то решал такую задачу?
                      Дмитрий
                      08 октября 2021, 09:33
                      0
                      Я добавляю через запятую всех, но уведомление приходит только первому из списка. Это только у меня так?
                      Петр
                      26 ноября 2021, 05:25
                      0
                      Добрый день. Подскажите пожалуйста (сам совсем не разбираюсь). Настроил уведомления о заказе в телеграмм. приходит в таком формате:
                      Новый заказ #2111/95
                      на сумму 560 р.
                      Оплата: 1
                      — 1. Товар (1 шт.)2. Товар (1 шт.)
                      — Телефон: 000000000000
                      Улица: xxxxxxxxxx
                      Дом: xxxxxx
                      Квартира: xxxxxx
                      Комментарий:
                      1. Способ оплаты пишет не как надо (например оплата картой), а id.
                      2. И как добавить что бы показывал вариант доставки.
                      Вот так у меня:
                      <?php
                      if($modx->event->name != 'msOnCreateOrder') return;
                      
                      $token = $modx->getOption('mstelegram_token', null, false);
                      $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                      
                      $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                      $_products = $msOrder->getMany('Products');
                      
                      // Список товаров в заказе
                      $i = 0;
                      $products = '';
                      foreach ($_products as $product) {
                          $i++;
                          $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                      }
                      
                      // Текст сообщения
                      $message = "
                      Новый заказ #{$msOrder->num}
                      на сумму {$msOrder->cost} р.
                      Оплата: {$msOrder->payment}
                      -----
                      {$products}
                      -----
                      Телефон: {$contacts->phone}
                      Улица: {$contacts->street}
                      Дом: {$contacts->building}
                      Квартира: {$contacts->room}
                      Комментарий: {$contacts->comment}";
                      
                      $message = urlencode($message);
                      foreach($recipients as $id){
                      	$id = trim($id);
                      	if(!$id) continue;
                          $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                          $ch = curl_init();
                          curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                          $result = curl_exec($ch);
                          curl_close($ch);
                      }
                        Николай Савин
                        26 ноября 2021, 10:03
                        0
                        Попробуйте заменить
                        {$msOrder->payment}
                        На
                        {$msOrder->Payment->name}
                        Обратите внимание, что Payment теперь с большой буквы.
                        Та же история с доставкой
                        {$msOrder->Delivery->name}
                          Sergey
                          26 ноября 2021, 10:06
                          -1
                          if ($msOrder->delivery == '1') {
                              $deli = 'Способ доставки: Самовывоз';
                              } else if ($msOrder->delivery == '2') {
                                  $deli = 'Курьерская доставка Деливери';
                              } else {
                             $deli = 'Самовывоз из Новой Почты';
                          }
                          
                          if ($msOrder->payment == '2') {
                              $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                              } else {
                             $pay = 'Способ оплаты: Оплата при получении';
                          }
                          // Текст сообщения
                          $message = "
                          Новый заказ #{$msOrder->num}
                          на сумму {$msOrder->cost} грн.

                          Я делал так, id можно посмотреть в настройках доставки и оплаты
                            Николай Савин
                            26 ноября 2021, 15:44
                            0
                            Это некорректно — к объекту заказа через связи привязаны и доставка и оплата и другие связные объекты. Я выше показал как можно обращаться к ним.
                            Кроме того у вас ошибка еще и в написании — там не строка, а число. И работало у вас вся эта конструкция только потому что нестрогое сравнение. Корректное написание будет такое:
                            if ($msOrder->delivery === 1) {
                              Петр
                              03 декабря 2021, 08:49
                              0
                              Спасибо большое! Все заработало!
                              Петр
                              03 декабря 2021, 08:50
                              0
                              Спасибо)
                            Oleg
                            05 января 2023, 15:31
                            0
                            Приветствую. У кого-то получилось вывести отделение из msNovaPoshta в сообщение телеграм?

                            Остальные поля (область, город, улица, дом, квартира) выводятся по стандарту.
                              Sergey
                              05 января 2023, 15:40
                              0
                              До обновы дополнения работало так, после обновы у меня так не работает ( поэтому закомментировал

                              <?php
                              if($modx->event->name != 'msOnCreateOrder') return;
                              
                              $token = $modx->getOption('mstelegram_token', null, false);
                              $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                              
                              $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                              $_products = $msOrder->getMany('Products');
                              $profile = $msOrder->getOne('UserProfile');
                              // $properties = $msOrder->get('properties');
                              
                              
                              // if (isset($properties['msnovaposhta']) && isset($properties['msnovaposhta']['warehouse_ref'])) {
                              //  $np = $modx->getService('msnovaposhta', 'MsNovaPoshta'); 
                              //  $warehouse = $np->getWarehouse($properties['msnovaposhta']['city_ref'], $properties['msnovaposhta']['warehouse_ref']);
                              //   if($warehouse) {
                              //      $officeNumber = $warehouse['Description'];
                              //      $officeNumberOblast = $warehouse['SettlementAreaDescription'];
                              //      $officeNumberRayon = $warehouse['SettlementRegionsDescription'];
                              //      $officeNumberGorod = $warehouse['SettlementDescription'];
                              //   }
                              // }
                              // Список товаров в заказе
                                Oleg
                                06 января 2023, 10:17
                                0
                                Вот так получил отделение

                                $properties = $msOrder->get('properties');
                                
                                Отделение: {$properties['msnovaposhta']['warehouse']['Description']}
                                Александр
                                10 января 2023, 17:54
                                0
                                Добрый, подскажите, в новой версии минишоп не приходит телефон в сообщение телеграма. не подскажите, на что нужно теперь заменить {$contacts->phone}?
                                  Николай Савин
                                  11 января 2023, 08:24
                                  0
                                  Откройте плагин msTelegram и попробуйте заменить строчку

                                  $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                  на следующий код

                                  $contacts = $msOrder->Address;
                                    Александр
                                    17 января 2023, 11:07
                                    0
                                    Спасибо, в 4 минишопе поменялось. Сам не разобрался
                                      Николай Савин
                                      17 января 2023, 11:22
                                      0
                                      Тот код, что я вам написал — был всегда. Он не поменялся и является более корректным.
                                      А вот старый код более не работает, начиная с 4 да. По идее его вообще не нужно было использовать в компоненте, так как мой вариант проще, быстрее в написании и до сих пор работает.
                                  Александр
                                  02 февраля 2023, 10:31
                                  0
                                  Друзья, а не подскажете как в уведомление в Телеграм запихнуть ссылку на оплату payment_link?
                                    Игорь
                                    26 сентября 2023, 08:28
                                    0
                                    Здрвсвуйте.
                                    Подскажите как сделать перенос строк в сообщении.
                                    Т.е., например, я хочу что бы каждый товар в заказе отображался с новой строки (сейчас все в одну строчку).
                                    Пробовал добавлять br, r/n — что-то не получается.
                                      Sergey
                                      26 сентября 2023, 10:21
                                      0
                                      в продуктс в конце \n

                                      foreach ($_products as $product) {
                                          $i++;
                                          $options = $product->get('options');
                                          $size = $options['size'];
                                          $products .= "{$i}. {$product->name} ({$product->count} шт.) за {$product->Product->get('price')} грн \n Модель: {$size} \n \n";
                                      }
                                        Игорь
                                        26 сентября 2023, 13:52
                                        0
                                        Спасибо, разобрался
                                      YanaShine
                                      22 октября 2023, 13:09
                                      0
                                      В Телеграм приходят сообщения в таком виде (без адреса и контактных данных) и все попытки тщетны

                                      Новый заказ #2310/22
                                      на сумму 24650 ₽.
                                      Оплата: Оплата наличными
                                      Доставка: Доставка до подъезда

                                      1. Кровать Рондо (1 шт.)

                                      Имя:
                                      Телефон:
                                      Email:
                                      Улица:
                                      Дом:
                                      Квартира:
                                      Комментарий:
                                      Плагин настроен так:
                                      <?php
                                      if($modx->event->name != 'msOnCreateOrder') return;
                                      
                                      $token = $modx->getOption('mstelegram_token', null, false);
                                      $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                      
                                      $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                      $_products = $msOrder->getMany('Products');
                                      $delivery = $msOrder->getOne('Delivery');
                                      $payment = $msOrder->getOne('Payment');
                                      
                                      // Список товаров в заказе
                                      $i = 0;
                                      $products = '';
                                      foreach ($_products as $product) {
                                          $i++;
                                          $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                      }
                                      
                                      // Текст сообщения
                                      $message = "
                                      Новый заказ #{$msOrder->num}
                                      на сумму {$msOrder->cost} ₽.
                                      Оплата: {$payment->name}
                                      Доставка: {$delivery->name}
                                      - - - - - - -
                                      {$products}
                                      - - - - - - -
                                      Имя: {$contacts->receiver}
                                      Телефон: {$contacts->phone}
                                      Email: {$contacts->email}
                                      Улица: {$contacts->street}
                                      Дом: {$contacts->building}
                                      Квартира: {$contacts->room}
                                      Комментарий: {$contacts->comment}
                                      ";
                                      
                                      $message = urlencode($message);
                                      foreach($recipients as $id){
                                      	$id = trim($id);
                                      	if(!$id) continue;
                                          $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                          $ch = curl_init();
                                          curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                          $result = curl_exec($ch);
                                          curl_close($ch);
                                      }
                                      Чанк tpl.msOrder.custom
                                      <form class="ms2_form" id="msOrder" method="post">
                                          <div class="row">
                                              <div class="col-12 col-md-6">
                                                  <h4>{'ms2_frontend_credentials' | lexicon}:</h4>
                                                  {foreach ['email','receiver','phone'] as $field}
                                                      <div class="form-group row input-parent">
                                                          <label class="col-md-4 col-form-label" for="{$field}">
                                                              {('ms2_frontend_' ~ $field) | lexicon} <span class="required-star">*</span>
                                                          </label>
                                                          <div class="col-md-8">
                                                              <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}" name="{$field}" value="{$form[$field]}" class="form-control{($field in list $errors) ? ' error' : ''}">
                                                          </div>
                                                      </div>
                                                  {/foreach}
                                                  <div class="form-group row input-parent">
                                                      <label class="col-md-4 col-form-label" for="comment">
                                                          {'ms2_frontend_comment' | lexicon} <span class="required-star">*</span>
                                                      </label>
                                                      <div class="col-md-8">
                                                          <textarea name="comment" id="comment" placeholder="{'ms2_frontend_comment' | lexicon}"
                                                              class="form-control{('comment' in list $errors) ? ' error' : ''}">{$form.comment}</textarea>
                                                      </div>
                                                  </div>
                                              </div>
                                              <div class="col-12 col-md-6" id="payments">
                                                  <h4>{'ms2_frontend_payments' | lexicon}:</h4>
                                                  <div class="form-group row">
                                                      <div class="col-12">
                                                          {foreach $payments as $payment index=$index}
                                                              {var $checked = !($order.payment in keys $payments) && $index == 0 || $payment.id == $order.payment}
                                                              <div class="checkbox">
                                                                  <label class="col-form-label payment input-parent">
                                                                      <input type="radio" name="payment" value="{$payment.id}" id="payment_{$payment.id}"{$checked ? 'checked' : ''}>
                                                                      {if $payment.logo?}
                                                                          <img src="{$payment.logo}" alt="{$payment.name}" title="{$payment.name}" class="mw-100"/>
                                                                      {else}
                                                                          {$payment.name}
                                                                      {/if}
                                                                      {if $payment.description?}
                                                                          <p class="small">{$payment.description}</p>
                                                                      {/if}
                                                                  </label>
                                                              </div>
                                                          {/foreach}
                                                      </div>
                                                  </div>
                                              </div>
                                          </div>
                                          <div class="row">
                                              <div class="col-12 col-md-6" id="deliveries">
                                                  <h4>{'ms2_frontend_deliveries' | lexicon}:</h4>
                                                  <div class="form-group row">
                                                      <div class="col-12">
                                                          {foreach $deliveries as $delivery index=$index}
                                                              {var $checked = !($order.delivery in keys $deliveries) && $index == 0 || $delivery.id == $order.delivery}
                                                              <div class="checkbox">
                                                                  <label class="col-form-label delivery input-parent">
                                                                      <input type="radio" name="delivery" value="{$delivery.id}" id="delivery_{$delivery.id}"
                                                                          data-payments="{$delivery.payments | json_encode}"
                                                                          {$checked ? 'checked' : ''}>
                                                                      {if $delivery.logo?}
                                                                          <img src="{$delivery.logo}" alt="{$delivery.name}" title="{$delivery.name}"/>
                                                                      {else}
                                                                          {$delivery.name}
                                                                      {/if}
                                                                      {if $delivery.description?}
                                                                          <p class="small">
                                                                              {$delivery.description}
                                                                          </p>
                                                                      {/if}
                                                                  </label>
                                                              </div>
                                                          {/foreach}
                                                      </div>
                                                  </div>
                                              </div>
                                              <div class="col-12 col-md-6">
                                                  <h4>{'ms2_frontend_address' | lexicon}:</h4>
                                                  {foreach ['index','region','city', 'street', 'building', 'entrance','floor', 'room'] as $field}
                                                      <div class="form-group row input-parent">
                                                          <label class="col-md-4 col-form-label" for="{$field}">
                                                              {('ms2_frontend_' ~ $field) | lexicon} <span class="required-star">*</span>
                                                          </label>
                                                          <div class="col-md-8">
                                                              <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
                                                                  name="{$field}" value="{$form[$field]}"
                                                                  class="form-control{($field in list $errors) ? ' error' : ''}">
                                                          </div>
                                                      </div>
                                                  {/foreach}
                                                  <div class="form-group row input-parent">
                                                      <label class="col-md-4 col-form-label" for="text_address">
                                                          {'ms2_frontend_text_address' | lexicon} <span class="required-star">*</span>
                                                      </label>
                                                      <div class="col-md-8">
                                                          <textarea name="text_address" id="text_address" placeholder="{'ms2_frontend_text_address' | lexicon}"
                                                              class="form-control{('text_address' in list $errors) ? ' error' : ''}">{$form.text_address}</textarea>
                                                      </div>
                                                  </div>
                                              </div>
                                          </div>
                                          <button type="button" name="ms2_action" value="order/clean" class="btn btn-danger ms2_link">{'ms2_frontend_order_cancel' | lexicon} </button>
                                          <hr class="mt-4 mb-4"/>
                                          <div class="d-flex flex-column flex-md-row align-items-center justify-content-center justify-content-md-end mb-5">
                                              <h4 class="mb-md-0">{'ms2_frontend_order_cost' | lexicon}:</h4>
                                              <h3 class="mb-md-0 ml-md-2">
                                                  <span id="ms2_order_cart_cost">{$order.cart_cost ?: 0}</span> {'ms2_frontend_currency' | lexicon} +
                                                  <span id="ms2_order_delivery_cost">{$order.delivery_cost ?: 0}</span> {'ms2_frontend_currency' | lexicon} =
                                                  <span id="ms2_order_cost">{$order.cost ?: 0}</span> {'ms2_frontend_currency' | lexicon}
                                              </h3>
                                              <button type="submit" name="ms2_action" value="order/submit" class="btn btn-lg btn-primary ml-md-2 ms2_link">
                                                  {'ms2_frontend_order_submit' | lexicon}
                                              </button>
                                          </div>
                                      </form>
                                        YanaShine
                                        22 октября 2023, 14:20
                                        0
                                        Решился вопрос

                                        $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                        на следующий код
                                        $contacts = $msOrder->Address;
                                        YanaShine
                                        22 октября 2023, 15:04
                                        0
                                        Мое решение с исправлениями номера телефона, разделением суммы и проверкой на пустые формы

                                        <?php
                                        if($modx->event->name != 'msOnCreateOrder') return;
                                        
                                        $token = $modx->getOption('mstelegram_token', null, false);
                                        
                                        $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                        $contacts = $msOrder->Address;
                                        $_products = $msOrder->getMany('Products');
                                        $delivery = $msOrder->getOne('Delivery');
                                        $payment = $msOrder->getOne('Payment');
                                        
                                        // Преобразование суммы с разделением тысяч
                                        $formattedCost = number_format($msOrder->cost, 0, '.', ' ');
                                        
                                        // Проверка и преобразование телефона
                                        $phone = $contacts->phone;
                                        if (!empty($phone) && !preg_match('/^\+7/', $phone)) {
                                            // Заменяем "8" на "+7"
                                            $phone = str_replace("8", "+7", $phone);
                                        }
                                        
                                        // Список товаров в заказе
                                        $i = 0;
                                        $products = '';
                                        foreach ($_products as $product) {
                                            if (!empty($product->count)) { // Проверка, что количество товара не пустое
                                                $i++;
                                                if ($i > 1) {
                                                    $products .= "\n"; // Добавляем разделитель только после первого товара
                                                }
                                                $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                            }
                                        }
                                        
                                        // Текст сообщения
                                        $message = "
                                        Новый заказ #{$msOrder->num}
                                        на сумму {$formattedCost} ₽.
                                        Оплата: {$payment->name}
                                        Доставка: {$delivery->name}
                                        - - - - - - -
                                        {$products}
                                        - - - - - - -
                                        Имя: {$contacts->receiver}
                                        ";
                                        if (!empty($phone)) { // Добавляем телефон только если он не пустой
                                            $message .= "Телефон: {$phone}\n";
                                        }
                                        if (!empty($contacts->email)) { // Добавляем Email только если он не пустой
                                            $message .= "Email: {$contacts->email}\n";
                                        }
                                        if (!empty($contacts->street)) { // Добавляем Улица только если он не пустой
                                            $message .= "Улица: {$contacts->street}\n";
                                        }
                                        if (!empty($contacts->building)) { // Добавляем Дом только если он не пустой
                                            $message .= "Дом: {$contacts->building}\n";
                                        }
                                        if (!empty($contacts->room)) { // Добавляем Квартиру только если она не пуста
                                            $message .= "Квартира: {$contacts->room}\n";
                                        }
                                        if (!empty($contacts->comment)) { // Добавляем Комментарий только если он не пустой
                                            $message .= "Комментарий: {$contacts->comment}";
                                        }
                                        
                                        $message = urlencode($message);
                                        foreach($recipients as $id){
                                            $id = trim($id);
                                            if(!$id) continue;
                                            $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                            $ch = curl_init();
                                            curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                            $result = curl_exec($ch);
                                            curl_close($ch);
                                        }
                                          Кушнеров Александр
                                          30 августа 2024, 01:32
                                          0
                                          Я тоже немного доработал, чтобы приходило больше полей, а также способ и вариант доставки текстом:
                                          <?php
                                          if($modx->event->name != 'msOnCreateOrder') return;
                                          
                                          $token = $modx->getOption('mstelegram_token', null, false);
                                          $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                          
                                          $contacts = $msOrder->getOne('Address');
                                          $_products = $msOrder->getMany('Products');
                                          
                                          // Список товаров в заказе
                                          $i = 0;
                                          $products = '';
                                          foreach ($_products as $product) {
                                              $i++;
                                              $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                          }
                                          
                                          // Текст сообщения
                                          $message = "
                                          Новый заказ #{$msOrder->num}
                                          на сумму {$msOrder->cost} р.
                                          -----
                                          {$products}
                                          -----
                                          E-mail: {$contacts->email}
                                          Имя: {$contacts->receiver}
                                          Телефон: {$contacts->phone}
                                          Комментарий: {$contacts->comment}";
                                          
                                          $deliveryMethod = $modx->getObject('msDelivery', $msOrder->delivery);
                                          if ($deliveryMethod) {
                                              $deliveryMethodTitle = $deliveryMethod->get('name');
                                              $message .= "\nСпособ доставки: {$deliveryMethodTitle}";
                                          }
                                          
                                          $paymentMethod = $modx->getObject('msPayment', $msOrder->payment);
                                          if ($paymentMethod) {
                                              $paymentMethodTitle = $paymentMethod->get('name');
                                              $message .= "\nСпособ оплаты: {$paymentMethodTitle}";
                                          }
                                          
                                          $message = urlencode($message);
                                          foreach($recipients as $id){
                                          	$id = trim($id);
                                          	if(!$id) continue;
                                              $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                              $ch = curl_init();
                                              curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                              $result = curl_exec($ch);
                                              curl_close($ch);
                                          }
                                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                            66