[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(). Комментарии: 66
Опубликовали в 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);
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.