Создание контекстов [MODX]

Задача: создание контекстов на поддоменах.

Должно получиться например так: spb.domain.ru и msk.domain.ru

  1. Создаем плагин, который при переходе на главную страница будет переключать контекст, название для плагина указываем любое:

    включаем события OnHandleRequest

    код плагина:

    // Работаем только на фронтенде
    if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr') {return;}
    
    // Определяем запрашиваемый хост
    $host = $_SERVER['HTTP_HOST'];
    
    // Выбираем контекст с настройкой base_url
    $q = $modx->newQuery('modContextSetting', array('key' => 'http_host', 'value' => $host));
    $q->select('context_key');
    
    $tstart = microtime(true);
    if ($q->prepare() && $q->stmt->execute()) {
    	// Учитываем наш запрос в БД
    	$modx->queryTime += microtime(true) - $tstart;
    	$modx->executedQueries++;
    	// Получаем ключ контекста
    	if ($context = $q->stmt->fetch(PDO::FETCH_COLUMN)) {
    		// Web инициализируется в index.php - на него переключаться не нужно
    		if ($context != 'web') {
    			$modx->switchContext($context);
    		}
    	}
    }
  2. Нужно разрешить переключение между контекстами:

    Настройки -> Системные настройки -> ключ allow_forward_across_contexts устанавливаем значение - ДА

  3. Создаем контексты:

    Настройки -> Контексты -> Создать новый

    Ключ -> spb

    Имя -> Санкт-Петербург


    Редактировать (правой кнопкой на нужный контекст) -> Настройки контекста -> Создать новый

    Создаем необходимые настройки, указываем ключ и значение:

    base_url -> /

    http_host -> domain.ru

    site_name -> Россия

    site_start -> 23

    site_url -> http://domain.ru/

    Должно получиться как то так:

  4. Настройка сервера:

    Придется либо создавать каждый домен отдельно и прописывать путь до основного сайта, либо настроить редиректы для всех поддоменов на основной сайт, всё зависит от хостинга. Так же можно настроить редиректы через алиасы сервера.

  5. У каждого поддомена будет создаваться собственная сессия, если требуется объединить сессии всех поддоменов - то укажите это в системной настройке session_cookie_domain

php