22 октября 2023, 15:04 Мое решение с исправлениями номера телефона, разделением суммы и проверкой на пустые формы <?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); } Готовые решения / [msTelegram] Уведомления о заказе в telegram 72 0
22 октября 2023, 14:20 Решился вопрос $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));на следующий код $contacts = $msOrder->Address; Готовые решения / [msTelegram] Уведомления о заказе в telegram 72 0
22 октября 2023, 13:09 В Телеграм приходят сообщения в таком виде (без адреса и контактных данных) и все попытки тщетны Новый заказ #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> Готовые решения / [msTelegram] Уведомления о заказе в telegram 72 0
Возможно ли реализовать возможность предоплаты за доставку на сайте? Так ради этого мне и нужно это все, чтобы клиент платил сразу при оформлении заказа, чтобы избавить себя от мусорных заявок (когда человек оставляет заявку, а предоплату делать не ...
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 18 px. Да и текст комментариев можно таким сделать. Для меня лично 16 — мелковато на больших экранах (в комментариях вообще 15 ...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
на следующий код
Плагин настроен так:
Чанк tpl.msOrder.custom