Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active July 27, 2023 16:10
Show Gist options
  • Save Isa3v/4bba4724ed4a997741170c5c3a89e5d9 to your computer and use it in GitHub Desktop.
Save Isa3v/4bba4724ed4a997741170c5c3a89e5d9 to your computer and use it in GitHub Desktop.
Алиасы - поддомены (MODx revo)

Алиасы - поддомены (MODx revo)

Делаем для каждого города свои поддомены

Задача:

  1. Нужно создать поддомены для *Перечисление городов*
  2. Переключатель регионов сделать по аналогии как на сайте *Любой сайт, который нравится заказчику* и разместить эту переключалку в шапке (аккуратно и компактно).
  3. В шапке, в футере и в разделе контактов поддомена разместить данные *города*

Решение:

  • Создаем на хостинге алиасы, синонимы или другие вариации, создания поодомена-зеркала основного домена
  • Нам нужно всего 2 сниппета:
    1. Создаем сниппет city_contoller и заполняем (Это контроллер)
    2. Создаем сниппет city_toggle и заполняем (Это переключалка городов)

    Сниппет позволяет использовать плейсхолдеры

    1. [[+sub_city]] - Город (Самара)
    2. [[+in_city]] - в Городе (в Самаре)
    3. [[+to_city]] - в Город (в Самару)
  • В самом верху шаблона или чанка который отвечает за head вставляем [[!city_contoller]]
  • Там, где хотим переключалку воткнуть вставляем [[!city_toggle]] (Стили сами крутим какие нужно)
  • Создаем в корне сайта robots.php и sitemap.php
  • В .htaccess добавлем строки:
    RewriteRule ^robots.txt$ /robots.php [L]
    RewriteRule ^sitemap.xml$ /sitemap.php [L]
  • Заполняем robots.php (Делается для того, чтобы sitemap у поддоменов был свой
  • Заполняем sitemap.php по образцу
<?php
global $arRegions, $mainRegion;
// Массив всех городов-синонимов
$arRegions = [];
$arRegions['example.ru'] = [
'city' => 'Москва',
'in_city' => 'в Москве',
'to_city' => 'в Москву',
];
$arRegions['samara.example.ru'] = [
'city' => 'Самара',
'in_city' => 'в Самаре',
'to_city' => 'в Самару',
];
// Текущий домен
$mainRegion = $arRegions[$_SERVER['HTTP_HOST']];
//Определяем http_host для <base>
$modx->setPlaceholder('http_host', $_SERVER['HTTP_HOST']);
if (is_array($arRegions) && !empty($arRegions)) {
if (!empty($arRegions[$_SERVER['HTTP_HOST']])) {
//Добавляем плейсхолдеры - [[+sub_city]] и т.п
$modx->setPlaceholder('sub_city', $mainRegion['city']);
$modx->setPlaceholder('in_city', $mainRegion['in']);
$modx->setPlaceholder('to_city', $mainRegion['to']);
}
}
<?php
/*Переключалка городов*/
?>
<div class="container item address">
<div class="city_name"><span>Ваш город:</span> [[+sub_city]]</div>
<ul class="drop_city">
<?//Берем глобальную переменную из city_sub_controller
foreach ($GLOBALS["arRegions"] as $city=>$value){
if($city != $GLOBALS["mainRegion"]['city']){
if ($city == 'default'){ $city = ''; }else{ $city = $city.'.'; }?>
<li><a href="//<?=$city?>example.ru<?=$_SERVER['REQUEST_URI']?>"><?=$value['city']?></a></li>
<?}else{?>
<li><span><?=$value['city']?></span></li>
<?}
}?>
</ul>
</div>
<script>
$(function() {$(".city_name").click(function() {$(".drop_city").toggle("fast");});});
</script>
<?php ?>
<?php
ob_end_clean();
header("Content-Type: text/plain");
if (file_exists($file)) {
// Паттерн получающий (//sub.domain.ru или //domain.ru) не учитывая http и https
$patternReg = '/(?:https|http)(?:\:\/\/)+(?:[a-z0-9](?:[a-z0-9-]+[a-z0-9])?\.)+(?:[a-z]+|[a-z0-9])/i';
$robots = file_get_contents($file);
$robots = preg_replace($patternReg, (!empty($_SERVER["HTTPS"]) ? "https://" : "http://") . $_SERVER["HTTP_HOST"], $robots);
echo $robots;
} else {
echo 'Error: ' . $file . ' not found!';
}
// Заканчиваем выполнение
die();
<?php
// Очищаем буфер
ob_end_clean();
header("Content-Type: text/xml");
$file = __DIR__.'/sitemap.xml';
if (file_exists($file)) {
$sitemap = json_decode(json_encode(simplexml_load_file($file)), true);
$xml = new \SimpleXMLElement('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"/>');
// Паттерн получающий (//sub.domain.ru или //domain.ru) не учитывая http и https
$patternReg = '/(?:https|http)(?:\:\/\/)+(?:[a-z0-9](?:[a-z0-9-]+[a-z0-9])?\.)+(?:[a-z]+|[a-z0-9])/i';
foreach ($sitemap['url'] as $key => $siteMapItem) {
// Создаем к каждому ключу обьект xml ссылки
$xmlUrl = $xml->addChild('url');
//Добавляем ключи в ссылку и меняем домен
foreach ($siteMapItem as $nameParam => $valueParam) {
if ($nameParam == 'loc') {
$xmlUrl->addChild($nameParam, preg_replace($patternReg, (!empty($_SERVER["HTTPS"]) ? "https://" : "http://") . $_SERVER["HTTP_HOST"], $valueParam));
} else {
$xmlUrl->addChild($nameParam, $valueParam);
}
}
echo $xml->asXML();
}
} else {
echo 'Error: ' . $file . ' not found!';
}
// Заканчиваем выполнение
die();
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment