Меняем данные на сайте MODX в зависимости от поддомена

Часто бывает нужно менять цены, телефоны, адреса на сайте в зависимости от поддомена, например, для другого города или другого языка. Конечно можно воспользоваться компонентом Babel, но иногда он излишен, да и настраивать его не быстро :)

Рассмотрим простой сниппет, который будет использовать MIGX в своей основе.

Навигация по статье:


Создание поддомена и подключение к сайту

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

Создание MIGX-TV с нужными данными

Допустим, нам нужно менять телефон и адрес в зависимости от поддомена. Вообще, можно менять и все содержимое, но для этого уже лучше использовать Babel. Данная статья годится для изменения небольших данных, к примеру, на лендинге.

Создадим для нужного шаблона MIGX-TV (подробнее о настройке MIGX), назовем, например, alldomains и вводим следующее.

Вкладки форм:

[{
"caption":"Поддомены",
"fields": [{
"field":"subdomain",
"caption":"Поддомен (указывается в виде - sub.site.ru )"
},{
"field":"city",
"caption":"Город"
},{
"field":"address",
"caption":"Адрес"
},{
"field":"phone",
"caption":"Телефон"
}]
}]

Название полей (subdomain, city, phone, addres) будут использоваться в работе/вызове сниппета.

Разметка колонок:

[{
"dataIndex": "subdomain",
"header": "Поддомен",
"width": "150"
},{
"dataIndex": "city",
"header": "Город",
"width": "150"
},{
"dataIndex": "address",
"header": "Адрес",
"width": "150"
},{
"dataIndex": "phone",
"header": "Телефон",
"width": "150"
}]

Тут важно название MIGX-поля - subdomain, именно по нему сравнивается поддомен в сниппете (о нем ниже).

Заполняем данные для нужного ресурса, например, "Контакты" (у ресурса ID=10). У нас получится что-то типа такого:

Создание сниппета subDomain для работы с MIGX-TV

<?php
// Определяем активный URL
$sub_domain = ($_SERVER['HTTP_HOST']);

// Определяем ID ресурса с MIGX-TV
if(isset($parent)) {
$id = $modx->getObject('modResource', $parent);
} else {
return "Не указан ID (&parent=``) ресурса!<br>";
}

// Определяем название MIGX-TV
if(isset($tv)) {
$migx = $id->getTVValue($tv);
} else {
return "Не указано название MIGX-TV (&tv=``)!<br>";
}

// Преобразуем в массив из JSON
$arr_migx = $modx->fromJSON($migx);

// Определяем значения из MIGX-TV [В квадратных скобках название поля]:
if(isset($element)) {

foreach($arr_migx as $arr_migx_set) {

if($arr_migx_set['subdomain'] == $sub_domain) {
$data_return = $arr_migx_set[$element];
}

}

} else {
return "Не указано название поля MIGX-TV (&element=``) ресурса!<br>";
}

return $data_return;
?>

Вызов сниппета subDomain

Сниппет вызывается таким образом:

[[!subDomain?
&parent=`10`
&tv=`alldomains`
&element=`phone`
]]

Где в &parent=`10` мы указали ID ресурса "Контакты" с заполненным MIGX-TV, &tv=`alldomains` - название нашего TV, &element=`phone` - название поля в MIGX-TV, которое нужно вывести, в данном случае телефон.

Вообще с MIGX очень удобно управлять нужными полями, и для менеджера понятно что и где править.

Прочее

Опять же для грамотного seo можно выводить нужный город в <head>, к примеру:

<title>[[*longtitle]] | [[!subDomain? &parent=`10` &tv=`alldomains` &element=`city`]] | [[++site_name]]</title>

Еще нужно не забывать, что MIGX-TV можно использовать отдельно. Например, вызовем переключатель городов, с помощью сниппета getImageList (входит в пакет MIGX):

<ul class="dropdown">
[[!getImageList?
&docid=`10`
&limit=`0`
&tvname=`alldomains`
&tpl=`header_city_tpl`
]]
</ul>

Сам чанк header_city_tpl:

<li><a href="//[[+subdomain]]">[[+city]]</a></li>

Или вызвать список всех городов и их контактных данных. В общем, зависит от фантазии.

На этом все. Удачи с поддоменами ;)


На поддержку блога

Комментарии к посту (5)