Тодор

Тодор

Был в сети 29 июня 2026, 13:05
Заказы не принимаю
1. если указать пустой emailTpl — прийдет от такой емейл:

2. И все таки стандарным хуком email невозможно обработать переменную типа array — так как в field будут передан не масив со значениями, а строка «ArrayArrayArray», надо либо изменить нейми инпутам или сделать свой хук
Абсолютно все данные о заказе (вроде):
$order = $modx->getObject('msOrder', $orderID);
$output = array(
    'order' => $order->toArray(),
    'user' => $order->User->toArray(),
    'profile' => $order->UserProfile->toArray(),
    'address' => $order->Address->toArray(),
    'delivery' => $order->Delivery->toArray(),
    'payment' => $order->Payment->toArray(),
    'status' => $order->Status->toArray(),
    'products' => []
);
foreach($order->Products as $product){
    $output['products'][] = $product->toArray();
}

print_r($output);
Не такое естетическое решение как у вас, но можно воспользоваться стандарными полями MODX

В результате можно обращаться к этим полям вот так:
$profile = $modx->getObject('modUserProfile', $userID);
print_r($profile->get('extended'));
/*
array(
    [2021-11-09] => array(
        [0] => +10
        [1] => -7
        [2] => -3
    )

    [2021-11-09 16:05:56] => -7
    [2021-11-09 18:59:03] => -3
    [2021-11-09 22:18:32] => +10
)
*/
У твоих инпутов очень странные нейми.
Должно быть чтото типа:
Name: [[+field.0.name.0]]
Email: [[+field.1.email.0]]
Phone 1: [[+field.2.phone.0]]
Phone 2: [[+field.3.phone.0]]
Data Start: [[+date_start]]
Date End: [[+date_end]]
Не уверен что все правильно, но date_start и date_end точно должно работать (если они конечно не пустые).
Еще можно попробовать в emailTpl поставить несущесвующий чанк і посмотреть на то что прийдет на почту, там должны быть все доступные в чанке переменные
Можно удалить все локализации и создать их заново в той последовательности которой тебе надо, либо изменить немножко код:
<?php
$pdo = $modx->getService('pdoTools');

$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
    $uri = mb_substr($uri, 1);
    $tmp = explode('/', $uri);
    if($path = $tmp[0]) {
        $tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
        if($tmp) {
            $uri = str_replace("{$path}/", "", $uri);
        }
    }
}

$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
$output = [];
foreach($languages as $language) {
    if(mb_substr($language->http_host, -1) == '/') {
        $placeholders = array(
            'cultureKey' => $language->key,
            'active' => $language->key == $modx->localizator_key? 'active': '',
            'url' => $protocol. $language->http_host. $uri,
        );
    } else {
        $placeholders = array(
            'cultureKey' => $language->key,
            'active' => $language->key == $modx->localizator_key? 'active': '',
            'url' => $protocol. $language->http_host. '/'. $uri,
        );
    }
    
    $output[$language->key] = $pdo->getChunk($tpl, $placeholders);
}

uksort($output, function($a, $b) {
    $order = array(
        "ru", "uk", 'en', 'it', 'fr' //Твоя последовательность языков
    );
    return array_search($a, $s) > array_search($b, $order);
});
return implode('', $output);
Есть предложение на счет сниппета msOrder. Для авторизованных пользователей при заходе на страницу с msOrder подтягиваются поля из личного кабинета — это все очень хорошо, но если пользователь изменил какое-то поле например city то после перезагрузки страницы, данные перезаписуться на те которые сохранены в кабинете. Предлагаю переделать 152 срока на:
$value = $order[$value] ?: $profile[$value];