Сергей Шлоков

Сергей Шлоков

Был в сети 06 ноября 2025, 19:54
Заказы не принимаю
А если все домены в разных доменных зонах? И новые домены будут добавляться непонятно каких зон? Как автоматизировать этот момент?
Админ для начала должен будет создать контекст со всеми настройками и это никак не автоматизируешь. А уж добавить за 2 секунды еще одну зону я думаю он будет в состоянии.
В конце концов можно регулярку сделать более универсальной — убрать зоны.
Ну, справедливости ради, хотел бы заметить, что я предлагал другое решение, попроще и с минимальным количеством запросов к БД.
Создаем контексты для все языков с ключами host-language — site1-ru (для site1.ru), site1-en (для site1.ru/en/), site2-ru (для site2.ru), site2-en (для site2.ru/en/). Контекст web не рабочий. В нем одна страница 404.
Вот плагин.
<?php
// Работаем только на фронтенде
if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr') {return;}

$alias = $modx->getOption('request_param_alias', null, 'alias', true);
$request = &$_REQUEST[$alias];

// Определяем язык папки из URL
preg_match('|/(.*)/|', $_SERVER['REQUEST_URI'], $m);
$lang = trim($m[1]);
//Сравниваем с языками из массива. Языки указывает админз, он знает какие, незачем делать запрос к БД
if (! in_array($lang,array('en','de','sp'))) $lang = 'ru';

// Определяем домен
preg_match('/(.+)(\.com|ru)/', $_SERVER['HTTP_HOST'], $m);
$host = trim($m[1]);
//Формируем ключ контекста
$context = $host.'-'.$lang;
//Проверяем наличие контекста, если есть, переключаем
if ($modx->getCount('modContext', $context)) {
    $modx->switchContext($context);
    $request = preg_replace('/^'.$lang.'\//', '', $request);
}
//Если контекст не найден, то остаемся в контексте web, у которого страница 404 (заглушка).
Проблема во внимательности. Главное не перепутать сайты, когда работаешь. :)
Иногда от усталости при копировании с локалки на рабочий сайт ошибаешься и копируешь наоборот, а потом мучаешься, почему не работает.
Ну логика может быть такая: у каждого контекста указываешь ключ в стиле host_language, т.е. site1_ru,site1_en.
А в плагине разбираешь запрос и формируешь ключ контекста.
<?php
// Работаем только на фронтенде
if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr') {return;}
// Определяем запрашиваемый хост (отрезаем <b>.ru</b>)
preg_match('/(\S+)\.ru/',$_SERVER['HTTP_HOST'],$matches);
$host = $matches[1];

//Определяем папку  /ru/ или /en/ из запроса (через preg_match или типа того)
$lang = ...;
//Получаем ключ контекста
$context = $host.'_'.$lang;
//Переключаемся.
$modx->switchContext($context);
А как с этим будет справляться админка и админ, это вопрос.