Nikita

Nikita

Был в сети 27 января 2026, 10:22
Заказы не принимаю
Андрей
Андрей
Не приходит информация: 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);
}
Кушнеров Александр
Кушнеров Александр
Я тоже немного доработал, чтобы приходило больше полей, а также способ и вариант доставки текстом:
<?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);
}
Дмитрий
Дмитрий
Павел Романов
Павел Романов
Сделайте сниппет:
<?php
$cities = $modx->runSnippet('pdoResources', array(
    'parents'=> 8,
    'includeTVs'=> 'city',
    'limit' =>0, 
    'tpl'=>'@INLINE [[+tv.city]]',
    'outputSeparator' => '--'
));
$cities = explode('--', $cities);
$cities = array_unique($cities);
natsort($cities);
foreach($cities as $city){
   $out .= '<option value="'.$city.'">'.$city.'</option>';
}
return '<select name="city">'.$out.'</select>';
Баха Волков
Баха Волков
switch($modx->event->name) {
      case 'OnDocFormPrerender':
                $classes = ['msProduct', 'msCategory'];
                if (in_array($resource->get('class_key'), $classes)) {
                    $template = $resource->get('template');
                    $templates = [1,2]; // Список шаблонов в которых нужно скрыть поле Содержимое

                    if (in_array($template, $templates)) {
                        $modx->regClientStartupHTMLBlock('
                        <script type="text/javascript">
                            Ext.onReady(function() {
                                var content = Ext.getCmp("ta");
                                content.hide();
                            });
                        </script>');
                    }
                }
                break;
}
Сергей
Сергей
Благодарю, но такой вариант не подошёл бы наверно, так как будет много запросов к базе, вкладки и товары должны автоматом же формироваться и их может быть n-е количество, но нашёл решение с билдером запросов, много времени потратил правда, в документации неточность была.

Вот решение моей задачи если кому-то пригодится:

$json = $modx->runSnippet('pdoResources', array(
'parents'   => $parent_id,
'select' => array(
        'modResource' => $select,
        'msProductData' => 'price'),
'class' => 'modResource',
    'leftJoin' => array(
        'msProductData' => array(
        'class' => 'msProductData',
        'on' => 'msProductData.id = modResource.id')
),
'includeTVs'=> $includeTVs,
'return'    => 'json'
));
Павел Гвоздь
Павел Гвоздь
условие where перестает работать.
Ещё бы!
'where'=>'{"id:!=":"[[*id]]"}'
Что это за колдунство?) Запишите нормально, по-человечески, массивом!
Вот тоже самое:
'where' => [
    'id:!=' => $_modx->resource['id'],
],
Konstantin B
Konstantin B
В общем и целом решение нашел, странно что в документации написано объект $order, меня честно говоря это ввело в заблуждение.

Оставлю это тут, вдруг кому-то пригодится!

Как оказалось достаточно такой конструкции:

<?php
switch ($modx->event->name) {
    case 'msOnCreateOrder':
        
	    if($newStatus == true)
	    {
            $msOrder->set("status","5");
            $msOrder->save();
        }
	break;
}