Даша

Даша

Был в сети 17 сентября 2025, 19:45
Заказы не принимаю
Вот таблица из вопроса в текстовом виде на случай, если ее неудобно читать или открывать:

Этап:
OnMODXInit — Проверка сессии
Функционал: Проверка наличия данных в сессии
Код / Действие:
if (!session('device.type')) { ... }
if (!session('user.lang')) { ... }
Примечания: На случай, если в сессию была вручную положена смена устройства или языка.

<cut/>
Этап
OnMODXInit — MobileDetect
Функционал: Определение типа устройства
Код / Действие:
$detect = new MobileDetect(); $isDesktop = !$detect->isMobile() && !$detect->isTablet(); session('device.type', $isDesktop ? 'desktop' : 'mobile');
Примечания: Определяется при инициализации MODX, чтобы не делать это на каждой странице. Если не удалось определить — ставим «mobile» как дефолт. Значение в сессии нужно для ручного переключения.

Этап:
OnMODXInit — Язык браузера
Функционал: Получение языка из заголовка
Код / Действие:
lang=substr(_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); session('user.lang', $lang);
Примечания: Используется тот же плагин, что и выше.

Этап:
OnMODXInit — Плейсхолдеры
Функционал: Установка плейсхолдеров
Код / Действие:
pls('device', session('device.type')); pls('lang', session('user.lang'));
Примечания: Нужно ли использовать session_write_close();?

Этап:
OnHandleRequest — Babel / Контекст
Функционал: Переключение контекста по URL
Код / Действие:
switch_context(['base_url' => request()->segment(1)]);
Примечания:
Нужно исключить mgr:
if ($modx->context->key !== 'mgr')
Применяется сразу, т.к. сессия без перезагрузки не даст данные
Событие может меняться местами с другим — нужно повесить на оба
Номер сегмента — это порядковый номер контекста в URL

Этап:
OnLoadWebDocument — Переключение шаблона
Функционал: Установка шаблона в зависимости от устройства
Код / Действие:
if (session('device.type') == 'desktop') {  $modx->resource->set('template', $newTemplateId); }
Примечания: Меняем шаблон через специальный плагин, где заданы соответствия для mobile/desktop. Ресурсы не кешируются.

Доп. учесть:
— Конфликт сессий
Функционал:
Код / Действие:
Примечания:?
Хм… Тогда есть пара вопросов… для свежего MODX'а рекомендуется использовать не ниже 8.2, при этом, вы написали, что обычно Admin Tools себя так не ведет, значит, у вас он установлен. Т.е., многие каким-то образом нашли баланс, подходящий для ядра и др. дополнений, так и для Tools'а. У вас какая версия?
Логов самого хостинга вообще нет. В кэше нашла что-то про доступ (по не буду приводить здесь), а из интересного — у меня выставлены настройки этого сайта php 8.3 в настройках хостинга, а версия в БД определяется 7.4. Но, опять же, только если Админ Тулс каким-то образом это проверяет или меняет, т.к. если это критическая ошибка, то оно бы и раньше не работало, ИМХО.