Простейшая мультиязычность и использование нескольких контекстов

Загрузим свежую копию MODX Revolution на свой сервер. Перейдем во вкладку "Система" -> "Контексты". Добавим два интересующих нас контекста. В моем случае это будет VN и EN. Т.к. я собираюсь сделать двуязычный зарубежный сайт.

MODX REVO добавление контекстов

После добавления контекстов добавим несколько ключей, которые помогут нам управлять переключением контекстов. При работе с разными контекстами на одном домене ннеобходимо использовать Fiendly_URLs, т.е. дружелюбные URlы, включаются они в настройках системы "Система" -> "Настройки системы". Выбираем фильтр по разделу "Дружественные URl". далее включеаем поддержку дружественных URl.

  • base_url - Базовая ссылка
  • site_start - Страница с которой начинается данный контекст
  • site_url - Адерс сайта

Далее, чтобы контекста заработали нам необходимо создать плагин, который будет зниматься переключением контекстов. В настройках плагина устанавливаем галочку на против события OnHandleRequest.

    
// Работаем только на фронтенде и только с friendly urls
if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr' || !$modx->getOption('friendly_urls')) {return;}

// Получаем запрашиваемый url
$alias = $modx->getOption('request_param_alias', null, 'alias', true);
$request = &$_REQUEST[$alias];

// Выбираем контексты с настройкой base_url
$q = $modx->newQuery('modContextSetting', array('key' => 'base_url', 'value:!=' => ''));
$q->select('context_key,value');

$contexts = array();
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
	// Учитываем наш запрос в БД
	$modx->queryTime += microtime(true) - $tstart;
	$modx->executedQueries++;
	// Разбираем результаты
	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		$base_url = trim($row['value'], '/');
		$context = $row['context_key'];
		// Если запрос начинается с base_url какого-то контекста
		if (preg_match('/^('.$base_url.')\//i', $request)) {
			// То переключаемся на этот контекст
			// Web инициализируется в index.php - на него переключаться не нужно
			if ($context != 'web') {
				$modx->switchContext($context);
			}
			// Вырезаем base_url из запроса, чтобы MODX нашел ресурс по uri
			$request = preg_replace('/^'.$base_url.'\//', '', $request);
			// Дело сделано - выходим из цикла
			break;
		}
	}
}
    

Второй плагин поможет работать с разными поддоменами. Принцип создания контекстов такойже. В настройках контекстов должны быть уникальные http_host.

    
// Работаем только на фронтенде
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);
		}
	}
}        
    

Данный плагин позаимствован с другого источника.