Мы будем переключать контексты с помощью плагина на событие OnHandleRequest.
Есть 2 основных вида URL, которые надо обрабатывать:
- context.site.ru
- site.ru/context/
- Создать субдомен его направить на тот же каталог, где лежит основной сайт ИЛИ создать алиас для основного домена;
- Создать контекст и следующие его настройки:
- error_page = ID страницы для 404 ошибки в данном контексте
- site_name = Название сайта для этого контекста
- site_start = ID главной страницы в данном контексте
- Создаем плагин с любым именем (например, swCtx), отмечаем галкой событие onHandleRequest.
Первый вариант очень простой, плагин имеет всего несколько строк.
Для соответствующего контекста создаем следующие настройки:
- base_url = /
- http_host = context.site.ru
- site_url = context.site.ru/
<?php
if ($modx->event->name == 'OnHandleRequest') {
if ($modx->context->get('key') == 'mgr') {return;}
// сравнение текущего имени хоста и искомого
if (strstr($_SERVER['HTTP_HOST'], 'testen.a.aaa0.ru') != false) {
$modx->switchContext('endomain');
return;
}
}
Для первого случая больше ничего делать не надо. Если контекстов на субдомены несколько, просто скопируйте нужное количество раз блок
if (strstr($_SERVER['HTTP_HOST'], 'context.site.ru') != false) {
$modx->switchContext('context');
return;
}
, заменив в нем название контекста и субдомена.
Больше ничего.
Со вторым вариантом чуть сложнее. Дело в том, что uri страницы записывается относительно контекста. Соответственно, из стандартной переменной запроса $_REQUEST['q'] нужно вырезать часть пути, относящуюся к контексту.
Настройки контекста:
- base_url = /ctxfolder/
- http_host = site.ru
- site_url = site.ru/ctxfolder/
<?php
if ($modx->context->key == 'mgr') {return;}
elseif ($modx->event->name == 'OnHandleRequest') {
// Получаем названием переменной запроса, затем ее значение
$var = $modx->getOption('request_param_alias', null, 'q');
$request = $_REQUEST[$var];
// Проверяем, стоит ли в начале запроса путь контекста
if (strpos($request, 'context/') === 0) {
$modx->switchContext('context');
// Вырезаем лишнее
$_REQUEST[$var] = substr($request, 8);
}
}
Переключив контекст и изменив запрос, более не вмешиваемся в работу движка. Дальше все будет обработано стандартным образом.
P.S.: Спасибо Василию за изначальную идею и правильный плагин для второго варианта.
Николай 18.10.2013 14:20 #
Есть один важный аргумент - авторизация и последующая инициализация сессии.
Суть проблемы в том, что MODX дергает сессию пользователя и проверяет его на доступ к текущему контексту еще на уровне метода modX::initizlize(), и лишь только потом, пройдя несколько важных шагов, он добирается до плагина, который делает свич контекста (навешанного на OnHandleRequest).
Это накладывает проблемы с определением авторизации пользователя в конкретном контексте, так как если пользователь авторизовался в другом контексте, а MODX его пытается определить на уровне контекста web (в момент дефолтовой инициализации), а этого пользователя нет в контексте web (он в другом контексте), то MODX просто продолжает работу как с анонимным пользователем.
То есть, если у вас предполагается авторизация на сайте, то свич в плагине - не лучший вариант. Можно конечно либо авторизовывать пользователя сразу во всех контекстах (если случаи, когда этого не следует делать), либо выполнять повторную инициализацию пользователя в плагине (чего я бы не стал делать, потому что это двойная нагрузка на инициализацию).
Итог: я всегда прописываю свич в index.php
И вот как раз в этом и есть недоработка MODX-а: в нем не предусмотрено точки корректного свича контекстов, так, чтобы по религии было. Ибо index.php править - это не православно.
Николай 18.10.2013 21:58 #
Сергей 01.11.2015 16:36 #
Создал алиасы:
Один из tyumen.ll66.ru
Создал контекст со следующими настройками screenshot.su/show.php?img=7250983a08b25f3db5ebef6f1b38eb91.jpg
Сам код плагина:
В параметры плагине не чего не надо прописывать?
Подскажите где ошибся(
Дмитрий 31.10.2017 18:48 #
Вот код плагина, переписанный мной с учетом любого контекста, ибо «substr($request, 8)» — частный случай:
Дмитрий 31.10.2017 19:01 #
1. В ссылки типа «assets/gallery/img1.jpg» (чанки, tv-шки) добавить вначале "/", т.е. "/assets/gallery/img1.jpg" — иначе не взлетит!
2. Допилить стандартные сниппеты Gallery и BannerY, закомментив там по одной строке, связанной с использованием base_url. А именно:
Gallery:
(у меня строка 127).
BannerY:
(у меня строка 110).
Вот теперь все открывается красиво!
Пример:
sushimaster.mirsushi.net/tomsk/menu/rolly#kappa-maki