Настройка контекстов MODX для мультисайтовости
Контексты MODX позволяют управлять несколькими сайтами из одной установки или разделить сайт по языкам, поддоменам, протоколам. Каждый контекст имеет свои настройки, корневые ресурсы и ключи для переключения.
Сценарии использования контекстов
Мультисайтовость: ru.company.com и en.company.com — два контекста с разными корневыми ресурсами.
Мультиязычность: один домен, разные URL-префиксы /ru/ и /en/.
Мобильная версия: m.company.com — отдельный контекст с упрощёнными шаблонами.
Admin vs Public: контекст mgr (встроенный) — менеджер. Контекст web — публичный сайт.
Создание нового контекста
Система → Контексты → Создать → ключ en (только латиница, краткий).
После создания настроить параметры контекста:
Ключ: en
Имя: English Version
Настройки (Settings):
base_url: /en/
site_url: https://yourdomain.com/en/
site_start: 55 (ID корневого ресурса для английской версии)
error_page: 56 (ID страницы 404 для этого контекста)
default_template: 3 (шаблон по умолчанию)
cultureKey: en
locale: en_US.UTF-8
Плагин для переключения контекстов
// Плагин: ContextSwitcher
// Событие: OnHandleRequest
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
// По домену
$contextMap = [
'ru.company.com' => 'ru',
'en.company.com' => 'en',
'by.company.com' => 'by',
];
if (isset($contextMap[$host])) {
$contextKey = $contextMap[$host];
if ($modx->context->key !== $contextKey) {
$modx->switchContext($contextKey);
}
return;
}
// По URL-префиксу (один домен)
$prefixMap = ['/ru/' => 'ru', '/en/' => 'en', '/uk/' => 'uk'];
foreach ($prefixMap as $prefix => $contextKey) {
if (strpos($uri, $prefix) === 0) {
if ($modx->context->key !== $contextKey) {
$modx->switchContext($contextKey);
}
return;
}
}
Nginx конфигурация для поддоменов
server {
listen 443 ssl http2;
server_name ru.company.com en.company.com by.company.com;
root /var/www/company.com;
# Один MODX, разные контексты по хосту
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_HOST $host; # передаём хост в PHP
include fastcgi_params;
}
}
Ресурсы в контексте
Каждый ресурс создаётся в определённом контексте. При создании ресурса: вкладка «Настройки документа» → Контекст → выбрать нужный.
// Программное создание ресурса в конкретном контексте
$resource = $modx->newObject('modDocument');
$resource->set('pagetitle', 'About Us');
$resource->set('alias', 'about-us');
$resource->set('context_key', 'en'); // привязка к контексту
$resource->set('template', 3);
$resource->set('parent', 55); // корневой ресурс контекста
$resource->save();
Кросс-контекстные ссылки
[[- Ссылка на ресурс в другом контексте ]]
[[~42? &context=`en`]]
[[- Переключатель языков в чанке ]]
[[- (через сниппет LangSwitch или вручную) ]]
Синхронизация настроек между контекстами
Системные настройки MODX имеют приоритеты: Global > Context > Namespace. Контекстные настройки переопределяют глобальные для конкретного контекста.
// Получить настройку с учётом текущего контекста
$siteUrl = $modx->getOption('site_url'); // вернёт настройку текущего контекста
Сроки
Настройка двух контекстов (ru/en) с мультиязычной структурой ресурсов и переключателем языков — 2–3 дня.







