Константин Ильин

Константин Ильин

Был в сети 22 октября 2025, 18:41
Заказы принимаю
Ого, вот я первым делом полез в плагин и он был пустой(!).
Прошелся до самого файла он тоже оказался пустым.

Подскажите почему плагин Статичный «очищается»? как так вообще происходит? или это только с CKEditor

Вот сейчас переустановил CKEditor, код в плагине есть.
Спасибо за решение, сделал, буду проверять-тестировать.
Реализация возможно не совсем понятная, но сама идея довольно популярная.

Не так давно делал сайт, там много посадочный страниц и обираются из блоков, менеджеру, сеошнику, достаточно загрузить блоки и страница собрана.
Тоже через MIGX реализовал.

Вот пример позиции блоков:
prnt.sc/buLcskvS_nBr

Если редактировать запись, внутри каждой есть выпадашка с готовыпи блоками и Кодом блока.
prnt.sc/dBuQ7WP6N2Qu
Выбираешь, загружаешь код кнопкой в редактор и уже там можно что-то поменять если оно надо(Например заголовок блока или какой то текст), а так просто нажал сохранить и все — блок готов.
Спасибо!
Так и сделал, погуглил седня хорошенько, но только щас увидел ваш комментарий)

Установил стандартный CKEditor из репозитория
Первое что надо сделать — включить codemirorr
Системные настройки->CKEditor
Прописываем настройке ckeditor.extra_plugins значение codemirror

Далее
Открываем файл: manager/assets/components/ckeditor/ckeditor/config.js
Добавляем 
config.startupMode = 'source';

Еще одно действие, но возможно только у меня так, файлы как то кешируются, так что надо в браузере надо открыть manager/assets/components/ckeditor/ckeditor/config.js и обновить.
Убедится, что изменения появились и должно заработать.
Если я правильно понял о поиске языковой версии в урл, то вот
<?
// Массив допустимых язоковые версий, можно сделать настройку в модх и через getOption() получить, но это лишний запрос к БД
$allowLanguages = ['en','es'];

// Разбор урла
$queryArray = parse_url($_SERVER['HTTP_REFERER']);


// Разбор пути запроса 
$urlArray = explode('/',  $queryArray['path']);

// Если первый сегмент пути есть в массиве допустимых языков, соответственно урл содержит языковую версию
if(in_array($urlArray[1], $allowLanguages)){
    
    // Тут ищем контекст с языковой версией и делаем переключение на него или что-то другое

}
Спасибо всем за отзывы и Спасибо за пояснение Евгению! И спасибо за исправления заголовка, чет косячнул.

Подмечу.
В комментах верно написали, что домены реализованы без контекстов, поэтому сделал по другому.
Домены прописаны у ресурсов в отдельном контексте, в доп поле скрин прикладываю.
prnt.sc/iN53u16cimo8

Получилось повесить плагин на событие OnMODXInit. Код на коленке, но думаю смысл понятен.
if ($modx->event->name != "OnMODXInit" || $modx->context->key == 'mgr') {
    return;
}
$host = $_SERVER['HTTP_HOST'];
$SMTParr = [];
$pos = strripos($host, 'site.ru');
if ($pos === false) {
   /* тут основной домен или же ничего не делать*/
} else {
    $SMTParr = [
        'mail_smtp_helo' => 'smtp.mail.ru', //тут меняем на яндекс если надо
        'mail_smtp_hosts' => 'smtp.mail.ru', //тут меняем на яндекс если надо
        'mail_smtp_user' => 'info@site.ru',
        'mail_smtp_pass' => 'парольпароль',
        'mail_smtp_single_to' => 1,
        'mail_smtp_prefix' => 'ssl',
        'mail_smtp_port' => 465,
        'mail_smtp_auth' => 1,
        'mail_use_smtp' => 1,
    ];
}

if(!empty($SMTParr)){
    foreach ($SMTParr as $k => $v){
        //Тут как раз переназначаем настройки
        $modx->setOption($k, $v);
        $modx->config[$k] = $v;
    }
}
Попробовал отправить форму через ajaxForm все прошло ок. Грубо говоря в яндекс почте куда пришло письмо горит зеленый замочек.

А так резюмируя:
Смотрим что за домен, из условно базы(оно может быть ресурсами отдельными или в тупую массивами прописано) берем данные для сравнения и данные SMTP, и меняем в цикле данные.
www.mail-tester.com/ показывает нормально.

Готов выслушать другие решения.
С pdoMenu проблемы.
В документации написано
&tplOuter — Чанк оформления всего блока меню. По умолчанию: @INLINE <ul [[+classes]]>[[+wrapper]]
При указании tplOuter работает неверно, он начинает использовать его для всех подменю.
prnt.sc/239rcei

Попробовал указать tplParentRow и у него указал ul, помогло.

Решил сделать тест на модхосте, тоже самое
s28405.h8.modhost.pro/

Не могу утверждать данная проблема связана с последними изменениями, но она как видно есть либо в документации неверно написано.
<ul class="test">
    {'!pdoMenu' | snippet : [
        'parents' => 0,
        'level' => 2,
        'tplOuter' => '@INLINE {$wrapper}',
        '-tplParentRow' => '@INLINE <li class="submenu_wrapp {$classnames}"><a href="{$link}" {$attributes}>{$menutitle}</a><ul>{$wrapper}<ul></li>'
    ]}
    <li>
        <a href="#">Заказ звонка</a>
    </li>
</ul>

п.с. Раньше использовал такой «прием» и норм было.
Есть ли ссылки примеры?

Я просто не совсем понимаю, если у меня скрипт будет автоматически логинится, то будет получать права. Он доступен через урл, напрямую. Т.е. «Иван» зайдет по адресу и получит сессию с правами?
и будет ли работать этот прием для CRON
Тоже про все это подумал, решил не рисковать с правами. Создавать процессоры и т.п.
Сделал через newObject. Думал проблема будет с опциями, а там все просто оказалось.

Кому пригодится
// Нестандартные опции, cтандартные опции товара записываются вместе с полями товара
$options['idads'] = $idADS;
$options['floor'] = $floor;

$newProduct = $modx->newObject('msProduct');
$alias = $newProduct->cleanAlias($pagetitle);

//Поля товара(ресурса)
$arrRes = [
    'pagetitle' => $pagetitle,
    'published' => 1,
    'alias' => $alias,
    'content' => $ADS['description'] ?: '',
    'parent' => $parent,
    'show_in_tree' => 0,
    'template' => 20,

    //Стандартные опции товара
    'color' => ['синий', 'красный']
    'old_price' => 0,
    'price' => $ADS['price']['value'] ?: 0,
];

// Можно было использовать fromArray()
foreach ($arrRes as $field => $v){
    $newProduct->set($field,$v);
}

// Собственно, запись нестандартных опций, простая передача массива
$newProduct->set('options', $options);

// сохраняем
$newProduct->save();
Сейчас проблема с загрузкой изображений gallery/upload, там тоже через процессор, видимо тоже права, разбираться надо
21 октября 2021 писал вопрос на modx.pro. Написал отправил, вроде ок. Но потом тоже началось такое же, что сайт недоступен. Иногда проскакивало и открывался. Хотел посмотреть ответили ли мне, захожу и недоступно.
За день до этого тоже, заходил и условно через раз недоступен.
ВПН или прочим не пользуюсь, в тот день все стабильно работало кроме modx.pro.

Может это чем-то поможет… может проблемы глобальнее))
Ребят, не в первый раз ошибка при установке минишопа
prnt.sc/1gnp58t

Последние релизы модх ставятся не с той кодировкой
prnt.sc/1gnq1kd

Даже если ставишь свежий модх с кодировкой которая была раньше, все равно при установке минишопа ошибка.

Приходится устанавливать сначала версию модх 2.7.3(т.е. все ок с кодировкой), установить минишоп, потом повышать модх до последней.

хостинг Таймвеб, версия MySQL 5.6
Супер!

Я делал подобный функционал через MIGX, проблема вставала когда использовал msPromocode2 там пересчет цены он сбивал все надбавки к цене, (не утверждаю, но видимо берет цену у продукта, а не из корзины), хотелось бы узнать совместимость с подобными компонентами которые пересчитывают цену
У меня Контексты это города. У каждого города свой каталог.
Есть еще общие страницы которые не стоило(не хотелось) дублировать во всех контекстах, например корзина или статьи, отсюда и переключение контекста

Вроде автор кода Илья Уткин
// Поиск Страницы в другом контексте
        if ($_SERVER['REQUEST_URI'] != '/') {
            $uri = substr($_SERVER['REQUEST_URI'],1);
            if (substr($uri,-5) != '.html' && substr($uri,-1) != '/') {
              //$uri .= '/';
            }
            $resource = $modx->getObject('modResource', array('uri' => $uri, 'context_key' => $placeholders['cityContext']));
            if (!empty($resource)) {
                $ctx = $resource->get('context_key');
            } else{
                return '';
            }
        } else {
            $ctx = 'web';
        }
        
        if ($ctx != $modx->context->key){
        	$modx->switchContext($ctx);
        }
например я добавил товар в контексте kazan, если я переду на «общую» страницу будет контекст web, и он ничего не отобразит в миникорзине и в корзине самой.

В целом я решил вопрос по другому, написал на событие добавления, чтобы он присваивал пустой контекст в корзине. По умолчанию там присваивался текущий. Для чего хранится контекст хз, отсюда как и на что это повлияет хз, но я заказы делал — полет нормальный.
case 'msOnAddToCart': 
        $tmp = $cart->get();
        $tmp[$key]['ctx'] = '';
        $cart->set($tmp);
    break;