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
gtsAPI 1.1.7 — таблицы на TanStack, инлайн-редактирование как в Excel Prime Vue datatable тупит на 200+ строк и в виртуальном скролинге высота полей фиксирована. Вот нам в итоге и не подошло. Директор сказал расчет должен сразу показываться без пагин...
mxApi — быстрый внешний API для MODX Revolution • зафиксировать публичный контракт EndpointInterface / метаданных по semver, чтобы наш провайдер не ломался на обновлениях;Фактически это уже так, beta стоит просто на всякий случа...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс Вообще не понял о чем речь) В системной настройке service_js сейчас указана ссылка smartcaptcha.cloud.yandex.ru/captcha.js Я предложил очистить эту настройку, тогда компонент н...
mxBackup — обезличенные копии MODX в пару кликов Ещё нет, я там разом почти полтора десятка пакетов выложил модератор, вероятно, а шоке.
Gallery3x 3.4.0 - вставка галерей прямо из визуального редактора (CKEditor и TinyMCE RTE) Здравствуйте. Есть консольный скрипт Вот почитайте: docs.ivan345.com/books/gallery3x/page/import-ms2galleryphp
[mSync] Новая версия синхронизации с 1С Всем привет. В какой то момент начали сыпаться ошибки: Error 23000 executing statement: INSERT INTO `modx_msync_products` (`product_id`, `uuid_1c`) VALUES ...
на следующий код
Плагин настроен так:
Чанк tpl.msOrder.custom