Skip to content

Instantly share code, notes, and snippets.

@igamov
Created January 11, 2019 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igamov/a70571e20956673e183bcf8884b41a99 to your computer and use it in GitHub Desktop.
Save igamov/a70571e20956673e183bcf8884b41a99 to your computer and use it in GitHub Desktop.
/**
* Плагин для ситуации, когда домен один, а языковые версии отличаются префиксом в адресе: site.ru/ru/page.html и site.ru/en/page.html.
* Или когда без /ru/
*
* То есть, условия такие:
* Все контексты на одном домене, и у них отличается base_url
* Используются friendly urls
* base_url может не совпадать с именем контекста
* Идея заключается в выборке всех контекстов и сравнения их базового адреса с запросом. Создавать директории и копировать index.php не нужно.
*
* Настройки контекстов
* base_url: /ru/
* cultureKey: ru
* site_start: 1
* site_url: https://site.ru/
* --------------------------
* base_url: /en/
* cultureKey: en
* site_start: 3
* site_url: https://site.ru/en/
* Создаём новый плагин, добавляем для него событие OnHandleRequest и копируем этот код:
*/
<?php
// Работаем только на фронтенде и только с 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;
}
}
}
//Кстати говоря, еще можно у основного контекста web убрать base_url, чтобы он открывался без /ru/, а второй контекст был по-прежнему с /en/.
//Источник - https://bezumkin.ru/sections/tips_and_tricks/2439/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment