[msTelegram] Уведомления о заказе в telegram
        Небольшой плагин на уведомление о новом заказе в телеграм, отличная замена сервисам смс рассылки.
Сделано на основе гайда от Михаила.
Как получить токен, узнать айди чата и тд так же отлично расписано в гайде.
 
Плагин вешается на событие msOnCreateOrder.
    
    
                                                                                
            Сделано на основе гайда от Михаила.
Как получить токен, узнать айди чата и тд так же отлично расписано в гайде.
Плагин вешается на событие 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().    Комментарии: 72
                Опубликовали в modstore            
                    
                Спасибо! пригодится)            
                    
                Добрый день. 
Помогите настроить плагин на работу с Shopkeeper 3? Кто нибудь знает как это сделать?
                    Помогите настроить плагин на работу с Shopkeeper 3? Кто нибудь знает как это сделать?
                День добрый.
Подскажите почему может не отображаться почта в сообщении, которую указывает клиент?
                    Подскажите почему может не отображаться почта в сообщении, которую указывает клиент?
// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
-----
{$products}
-----
Клиент: {$contacts->receiver}
-----
Телефон: {$contacts->phone}
-----
Почта: {$contacts->email}
-----
Комментарий: {$contacts->comment}";            
                если посмотреть сюда github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L337-L352
то видно что там нет поля email.
нужно получить профиль пользователя и оттуда взять email
                    то видно что там нет поля email.
нужно получить профиль пользователя и оттуда взять email
$profile = $msOrder->getOne('UserProfile')
{$profile->email}            
                Теперь знаю куда смотреть) Спасибо за помощь            
                    
                А как получить варианты доставки и оплаты? 
Подскажите пожалуйста, что-то не разберусь.
                    Подскажите пожалуйста, что-то не разберусь.
if ($msOrder->delivery == '1') {
    $deli = "Способ доставки: Самовывоз";
    } else {
      
   $deli = "Способ доставки: Доставка";
}
if ($msOrder->payment == '1') {
    $pay = "Способ оплаты: Оплата в магазине";
    } else {
        
   $pay = "Способ оплаты: Онлайн картой";
}Сделал так, кривовато конечно, но логика такая — подстроите под себя            
                Можете подсказать, как правильно это логику написать? Где она пишется?
Вот, если сюда эту логику добавить, то как это сделать?
// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
Оплата: {$msOrder->payment}
— {$products}
— Имя: {$contacts->receiver}
Телефон: {$contacts->phone}
Email: {$profile->email}
Улица: {$contacts->street}
Дом: {$contacts->building}
Квартира: {$contacts->room}
Комментарий: {$contacts->comment}";
                    Вот, если сюда эту логику добавить, то как это сделать?
// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
Оплата: {$msOrder->payment}
— {$products}
— Имя: {$contacts->receiver}
Телефон: {$contacts->phone}
Email: {$profile->email}
Улица: {$contacts->street}
Дом: {$contacts->building}
Квартира: {$contacts->room}
Комментарий: {$contacts->comment}";
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}            
                Огромнейшее спасибо. Получилось, все работает            
                    
                А изображение продукта можно как-то получить? Не подскажете?            
                    
                Приветствую! Плагин работает отлично! Не подскажете, как добавить адрес доставки?            
                    
                Вопрос про добавление адреса доставки решен.            
                    
                Добрый день, а не поделитесь решением?            
                    // Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
Оплата: {$msOrder->payment}
-----
{$products}
-----
Имя: {$contacts->receiver}
Телефон: {$contacts->phone}
Email: {$profile->email}
Улица: {$contacts->street}
Дом: {$contacts->building}
Квартира: {$contacts->room}
Комментарий: {$contacts->comment}";            
                Простите, что отвлёк, не туда комментарий оставил. Искал варианты оплаты и доставки. Спасибо!            
                    
                Как изменить текст сообщения? Создал сниппет, хотел изменить текст сообщения, сохраняю, но в телеграмму приходит старый            
                    
            
                Спасибо большое            
                    
                Добрый день! Все настроил по инструкции. Но при заказе отправка в телегу не идет.
Как можно отладить? и проверить?
                    Как можно отладить? и проверить?
                Добрый день! Может кто подсказать, как еще достать артикул товара? 
При этом
                    $product->article не проходитПри этом
$product->product_idработает, но это не является решением            $product->Product->get('article')            
                Был близок пробуя что-то подобное :D
                    $product->get('article')Спасибо за Ваш ответ, Николай! Всё работает            
                Всем привет!
Может кто-нибудь подскажет, как можно в телеграм отправлять в том числе опции товара, которые заданы через msOptionsPrice2?
                    Может кто-нибудь подскажет, как можно в телеграм отправлять в том числе опции товара, которые заданы через msOptionsPrice2?
                Добрый вечер! Нужна помощь.
Как получить значение (https://prnt.sc/11vqy4a) size из заказа в формате:Размер: AirPods 1/2
Пробовал {$product['size']}, {$product->size}, $product->Product->get('size')} ничего не работает (
                    Как получить значение (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);
}            
                В вашем случае size из заказа нужно вытаскивать примерно так 
                    $options = $product->get('options');
$size = $options['size'];            
                Спасибо, работает ))
Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
                    Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
                Ровно так же как и родные поля таблицы адреса, через get
                    $properties = $msOrder->get('properties');            
                У меня в 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} )?
                    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} )?
                Да нет же
                    $extfld_delivery_shop = $msOrder->get('extfld_delivery_shop');            
                Спасибо огромное, чет затупил )))            
                    
                Нет, я тоже затупил. Неверно подсказал. У вас данные хранятся не в заказе, а в адресе, это другая таблица. Нужно добавить ссылку. 
                    $extfld_delivery_shop = $msOrder->Address->get('extfld_delivery_shop');            
                Спасибо большое ))            
                    
                Не подскажете еще как получить цену именно из Модификации (msOptionsPrice2)?
$sizePrice = $options['price'];
Выводит цену минишопа, а нужно цену модификации. И сумма тоже считается с минишопа а не с модификации
https://prnt.sc/12331c2
                    $sizePrice = $options['price'];
Выводит цену минишопа, а нужно цену модификации. И сумма тоже считается с минишопа а не с модификации
https://prnt.sc/12331c2
                Примерно вот так
                    $mod = $modx->getObject('msopModification', array(
    'rid' => $product->product_id,
    'id' => $option['modification_id'],
));
$price = $mod->get('price')            
                Чего то не работает, пишет в консоле 500 ошибку у action.php когда пытаешься сделать заказ(            
                    
                Возможно у вас в данном месте переменная $product не определена. Там должен быть объект товара из заказа.            
                    
                Так пробовал
 
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} грн";
}
                    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} грн";
}
                Ну чтобы ошибки не было нужно написать вот так
Скорее всего неверно $option['modification_id'] написал.
Навскидку не помню как номер модификации в заказе хранится.
Распечатайте посмотрите — и скорректируйте этот момент.
                    $price = 0;
if($mod) {
$price = $mod->get('price');
}У вас почему то запрос к модификации не происходит. Ошибки не будет, но и цену не получите. Скорее всего неверно $option['modification_id'] написал.
Навскидку не помню как номер модификации в заказе хранится.
Распечатайте посмотрите — и скорректируйте этот момент.
                Чего то не получается никак получить (((            
                    
                Печально (            
                    
                У меня проблема. добавляю руками в опции: mstelegram_recipients — id пользователей. и при отправке все пользователи перечисленные в настройках видят уведомления. Это ведь явно не должно быть. 
И очень неудобно добавлять постоянно в mstelegram_recipients пользователей. можно ведь как-то автоматизировать процесс.
Кто-то решал такую задачу?
                    И очень неудобно добавлять постоянно в mstelegram_recipients пользователей. можно ведь как-то автоматизировать процесс.
Кто-то решал такую задачу?
                Я добавляю через запятую всех, но уведомление приходит только первому из списка. Это только у меня так?            
                    
                Добрый день. Подскажите пожалуйста (сам совсем не разбираюсь). Настроил уведомления о заказе в телеграмм. приходит в таком формате:
Новый заказ #2111/95
на сумму 560 р.
Оплата: 1
— 1. Товар (1 шт.)2. Товар (1 шт.)
— Телефон: 000000000000
Улица: xxxxxxxxxx
Дом: xxxxxx
Квартира: xxxxxx
Комментарий:
1. Способ оплаты пишет не как надо (например оплата картой), а id.
2. И как добавить что бы показывал вариант доставки.
Вот так у меня:
                    Новый заказ #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);
}            
                Попробуйте заменить 
Та же история с доставкой
                    {$msOrder->payment}На{$msOrder->Payment->name}Обратите внимание, что Payment теперь с большой буквы. Та же история с доставкой
{$msOrder->Delivery->name}            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 можно посмотреть в настройках доставки и оплаты
                Это некорректно — к объекту заказа через связи привязаны и доставка и оплата и другие связные объекты. Я выше показал как можно обращаться к ним. 
Кроме того у вас ошибка еще и в написании — там не строка, а число. И работало у вас вся эта конструкция только потому что нестрогое сравнение. Корректное написание будет такое:
                    Кроме того у вас ошибка еще и в написании — там не строка, а число. И работало у вас вся эта конструкция только потому что нестрогое сравнение. Корректное написание будет такое:
if ($msOrder->delivery === 1) {            
                Спасибо большое! Все заработало!            
                    
                Спасибо)            
                    
                Приветствую. У кого-то получилось вывести отделение из msNovaPoshta в сообщение телеграм?
Остальные поля (область, город, улица, дом, квартира) выводятся по стандарту.
                    Остальные поля (область, город, улица, дом, квартира) выводятся по стандарту.
                До обновы дополнения работало так, после обновы у меня так не работает ( поэтому закомментировал 
                    <?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'];
//   }
// }
// Список товаров в заказе            
                Вот так получил отделение
                    $properties = $msOrder->get('properties');
Отделение: {$properties['msnovaposhta']['warehouse']['Description']}            
                Добрый, подскажите, в новой версии минишоп не приходит телефон в сообщение телеграма. не подскажите, на что нужно теперь заменить {$contacts->phone}?            
                    
                Откройте плагин msTelegram и попробуйте заменить строчку
                    $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));на следующий код$contacts = $msOrder->Address;            
                Спасибо, в 4 минишопе поменялось. Сам не разобрался            
                    
                Тот код, что я вам написал — был всегда. Он не поменялся и является более корректным. 
А вот старый код более не работает, начиная с 4 да. По идее его вообще не нужно было использовать в компоненте, так как мой вариант проще, быстрее в написании и до сих пор работает.
                    А вот старый код более не работает, начиная с 4 да. По идее его вообще не нужно было использовать в компоненте, так как мой вариант проще, быстрее в написании и до сих пор работает.
                Друзья, а не подскажете как в уведомление в Телеграм запихнуть ссылку на оплату payment_link?            
                    
                Здрвсвуйте.
Подскажите как сделать перенос строк в сообщении.
Т.е., например, я хочу что бы каждый товар в заказе отображался с новой строки (сейчас все в одну строчку).
Пробовал добавлять br, r/n — что-то не получается.
                    Подскажите как сделать перенос строк в сообщении.
Т.е., например, я хочу что бы каждый товар в заказе отображался с новой строки (сейчас все в одну строчку).
Пробовал добавлять br, r/n — что-то не получается.
                в продуктс в конце \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";
}            
                Спасибо, разобрался            
                    
                В Телеграм приходят сообщения в таком виде (без адреса и контактных данных) и все попытки тщетны
                    Новый заказ #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>            
                Решился вопрос
                    $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));на следующий код$contacts = $msOrder->Address;            
                Мое решение с исправлениями номера телефона, разделением суммы и проверкой на пустые формы
                    <?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);
}            
                Я тоже немного доработал, чтобы приходило больше полей, а также способ и вариант доставки текстом:
                    <?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);
}            
                Не приходит информация: phone, street, comment
Остальные приходят. В чём может быть причина?
                    Остальные приходят. В чём может быть причина?
<?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->id));
$_products = $msOrder->getMany('Products');
$profile = $msOrder->getOne('UserProfile');
// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    $i++;
    $products .= "*{$i}. {$product->name}* \n    `↳ ". round($product->price) ." х {$product->count} шт. = ". round($product->price * $product->count)."` \n";
}
if ($msOrder->delivery == '1') {
    $deli = "Сами заберут \n---------- \nТелефон: {$contacts->phone} \nКомментарий: {$contacts->comment}\n";
    } else if ($msOrder->delivery == '2') {
        $deli = "Доставка {$contacts->city} `{$msOrder->delivery_cost} р.` \n---------- \nТелефон: {$contacts->phone} \nАдрес: {$contacts->city}, {$contacts->street} \nКомментарий: {$contacts->comment}\n";
    }
// Текст сообщения
$message = "
Новый заказ #{$msOrder->id}
на сумму: {$msOrder->cart_cost} р.
----------
{$products}
----------
{$deli}
_Статус заказа придёт повторно_";
$message = urlencode($message);
foreach($recipients as $id){
    $id = trim($id);
    if(!$id) continue;
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&parse_mode=markdown&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true,));
    $result = curl_exec($ch);
    curl_close($ch);
}            
                Вопрос решён            
                    
                А как-то можно это реализовать, для уведомления клиента, а не менеджера?
К примеру, сменился статус у заказа, а бот в тг клиенту пишет об этом…
Буду признателен если разъясните, как такое можно реализовать!
                    К примеру, сменился статус у заказа, а бот в тг клиенту пишет об этом…
Буду признателен если разъясните, как такое можно реализовать!
                Ваш бот не сможет написать вашему клиенту сообщение. Сначала клиент должен первым, что-то написать боту)) только после этого бот сможет писать клиенту. Так устроен телеграм, чтобы угомонить спамеров.            
                    
                какая досада, а может есть подобная тема с ватсапом?            
                    
                У вацап вообще нет открытого апи            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.