Переход с неудачного решения по смене контекста И по определению версии (моб/десктоп.) на ModHelpers

Добрый день.
Хотела бы попросить помощи еще раз.

Преамбула
1я проблема-MobileDetect
Установлена стороннаяя библиотека через композер. Шаблоны разбиты на пары для Мобильной и Десктопной версии (разный набор чанков). «Моб»- дефолт (прикреплен к ресурсу), «десктоп» получаем плагином в случае is_Desktop=1.
Такая конструкция вполне себе работает. Но когда я стала добавлять возможность ручного переключения версии по кнопке, у меня ничего не получилось.

2я проблема-BABEL
Уже пройдены варианты отдельной папки, обмусоливания htaccess'a, перебор нескольких версий плагинов для контекста, отключения вообще всех плагинов, попытки написания плагина самостоятельно. Одно время я добилась работы- по крайней мере, могла хотя бы страницу др. контекста открыть. Сейчас идет зацикливание.

ИТОГО
В итоге нашла здесь на сайте, что сейчас проще всего решить это с пом. модуля Сергея Шлокова (modHelpers).
.
Я нашла там не только swich_context для варианта поддиректории, но также сессии и Mob.Det. Поэтому и описала эти проблемы вместе.

Суть вопроса
Мне нужно добиться функционирования смены версии (мобильный/десктоп) и смены языков, через Babel и Mob.Detect. С сохранением результата в сессии, чтобы не определять это для каждой страницы, а также с возможностью выбрать правильный вариант вручную (переключатель), если автоматически определится неверно.
Пожалуйста, посмотрите, правильно ли я представляю саму логику. Пока даже код писать не стала, потому что сильно не уверена насчёт своего видения процесса.
Если всё не так, хотя бы скажите, про какой объект подробнее почитать.


MODX 3.1.2
php 8.4
Все версии плагинов последние.
htaccess стадартный +ЧПУ и переадресация https

ПРОЦЕСС (привожу в порядке очередности исполнения event`ов)

1. ОСНОВНОЙ ФУНКЦИОНАЛ И ЕГО СОХРАНЕНИЕ В СЕССИЯХ:


2. РУЧНОЕ ПЕРЕКЛЮЧЕНИЕ
Будет реализовано на сниппетах, а не плагинах. И срабатывать при изенении положения ползунков, с дальнейшей заменой значения в сессии.
У Babel я даже видела специальный чанк для «кнопки», но мне не подходит их оформление.

Спасибо.
Даша
17 сентября 2025, 19:08
modx.pro
1
472
0

Комментарии: 2

Даша
17 сентября 2025, 19:21
0
Вот таблица из вопроса в текстовом виде на случай, если ее неудобно читать или открывать:

Этап:
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. Ресурсы не кешируются.

Доп. учесть:
— Конфликт сессий
Функционал:
Код / Действие:
Примечания:?
    Артур Шевченко
    17 сентября 2025, 19:47
    0
    Делай всё, что связано с контекстами и языками и мобильной версией на событие OnHandleRequest, на OnMODXInit это просто бессмысленно. А в остальном логика верная.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2