В новой записи я вам покажу как я делал региональность на сайте с CMS Bitrix без использования компонентов, модулей и плагинов, с помощью пары простых функций.
В данном случае я говорю о региональности сделанной на поддоменах, например msk.site.ru. В зависимости от выбранного региона, у вас из базы будут подтягиваться разные адреса и контакты.
Административная часть для региональности
В плане админки, нам нужно сделать следующее:
- создать отдельный highloadblock, в который мы будем записывать информацию по регионам
- прописать в созданной таблице поля для контактов. Так же здесь я создал поля для склонения названия города в Т.п., в Р.п. и в П.п.
Таблица у меня состоит из следующих полей:
- Название города
- Главный домен (поддомен)
- Телефон
- Название области
- Название города в Родительном падеже
- Название города в Творительном падеже
- Название города в Предложном падеже
- Адрес магазина

Моя задумка состоит в использование специальных ключей, которые я буду прописывать в SEO описание для title и description, после чего в footer данные ключи будут заменяться на информацию.
Для каждого типа склонения названия я создал свой ключ:
- PROGTIME_REGION_STATE_NAME_RP — название города в родительном падеже
- PROGTIME_REGION_STATE_NAME_TP — название города в творительном падеже
- PROGTIME_REGION_STATE_NAME_PP — название города в предложном падеже
Ключи я могу вводить, как в настройках страниц, так и в настройках разделов и элементов.

Программирование региональности на PHP
По началу я пробовал 2 вещи, которые оказались ошибочными:
- Я пробовал создать региональность через cookie. Я думал что таким образом облегчу сайт и на него будет падать меньше нагрузки. Ошибка была в том что при каждом новом пользователе создавались новые куки и это сильно нагружало сайт.
- Второй моей ошибкой было прописание настроек региональности в файле init.php. В данном файле запросы очень плохо кэшируются и вызывают большие ошибки.
Поэтому методом проб и ошибок я перенес функцию для региональности в файл header.php. И вот как выглядит данная функция.
/* ================================ */
/* НАСТРОЙКА РЕГИОНАЛЬНОСТИ ДЛЯ САЙТА */
/* ================================ */
use Bitrix\Main\Loader;
Loader::includeModule("highloadblock");
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;
/* ФУНКЦИЯ ДЛЯ РАБОТЫ РЕГИОНАЛЬНОСТИ */
function addRegionInfo() {
/* ДЕЛАЕМ ЗАПРОС ЕСЛИ КУКИ НЕ СОЗДАНЫ */
$hlbl = 46; // Указываем ID нашего highloadblock блока к которому будет делать запросы.
$hlblock = HL\HighloadBlockTable::getById($hlbl)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$rsData = $entity_data_class::getList(array(
"select" => ["*"],
"order" => ["ID" => "ASC"],
"filter" => ["UF_MAIN_DOMAIN"=>$_SERVER["HTTP_HOST"]]
));
while($arData = $rsData->Fetch()) {
/* название города */
$regionInfo["NAME_STATE"] = $arData["UF_NAME_STATE"];
/* название региона */
$regionInfo["NAME_REGION"] = $arData["UF_NAME_REGION"];
/* название города в РОДИТЕЛЬНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_RP"] = $arData["UF_NAME_RP"];
/* название города в ПРЕДЛОЖНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_PP"] = $arData["UF_NAME_PP"];
/* название города в ТВОРИТЕЛЬНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_TP"] = $arData["UF_NAME_TP"];
/* главный домен */
$regionInfo["MAIN_DOMAIN_REGION"] = $arData["UF_MAIN_DOMAIN"];
/* адрес */
$regionInfo["ADRESS_REGION"] = $arData["UF_ADRESS_SHOP"];
/* телефон */
$regionInfo["PHONE_REGION"] = $arData["UF_PHONE"];
/* email */
$regionInfo["EMAIL_REGION"] = $arData["UF_EMAIL"];
/* описание анонса */
$regionInfo["DESC_PREVIEW_REGION"] = $arData["UF_DESC_TEXT"];
/* подробное описание */
$regionInfo["DESC_DETAIL_REGION"] = $arData["UF_DESC_DETAIL"];
}
return $regionInfo;
}
function ProgTimeRegionInfo() {
$dataCach = returnResultCache("860000", $_SERVER["HTTP_HOST"], "addRegionInfo");
$GLOBALS["PROGTIME_REGION_CACH"] = $dataCach;
return $dataCach;
}
/* ================================ */
/* ================================ */
Давайте теперь разберем данный код
В функции addRegionInfo() проходит весь процесс сборки информации по текущему поддомену. Первым делом я подключаю все необходимые модули для создания запросов в highloadblock с региональностью. Для фильтрации я использую $_SERVER[«HTTP_HOST»], для получения текущего поддомена. UF_MAIN_DOMAIN — это код моего поля, у вас может быть по другому.
$hlbl = 46; // Указываем ID нашего highloadblock блока к которому будет делать запросы.
$hlblock = HL\HighloadBlockTable::getById($hlbl)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$rsData = $entity_data_class::getList([
"select" => ["*"],
"order" => ["ID" => "ASC"],
"filter" => ["UF_MAIN_DOMAIN"=>$_SERVER["HTTP_HOST"]]
]);
Если выборка прошла успешно, я записываю все данные в отдельные элементы массива с настройками региональности. Я использую запись в массив, чтобы в дальнейшем его можно было закэшировать и не повторять запрос при каждой перезагрузке страницы.
В конце функция возвращает массив с настройками региональности.
while($arData = $rsData->Fetch()) {
/* название города */
$regionInfo["NAME_STATE"] = $arData["UF_NAME_STATE"];
/* название региона */
$regionInfo["NAME_REGION"] = $arData["UF_NAME_REGION"];
/* название города в РОДИТЕЛЬНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_RP"] = $arData["UF_NAME_RP"];
/* название города в ПРЕДЛОЖНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_PP"] = $arData["UF_NAME_PP"];
/* название города в ТВОРИТЕЛЬНОМ падеже */
$regionInfo["NAME_STATE_DECLINE_TP"] = $arData["UF_NAME_TP"];
/* главный домен */
$regionInfo["MAIN_DOMAIN_REGION"] = $arData["UF_MAIN_DOMAIN"];
/* адрес */
$regionInfo["ADRESS_REGION"] = $arData["UF_ADRESS_SHOP"];
/* телефон */
$regionInfo["PHONE_REGION"] = $arData["UF_PHONE"];
/* email */
$regionInfo["EMAIL_REGION"] = $arData["UF_EMAIL"];
/* описание анонса */
$regionInfo["DESC_PREVIEW_REGION"] = $arData["UF_DESC_TEXT"];
/* подробное описание */
$regionInfo["DESC_DETAIL_REGION"] = $arData["UF_DESC_DETAIL"];
}
return $regionInfo;
Ниже я создал ещё одну небольшую функцию которая будет кэшировать наши данные и в зависимости от необходимости отдавать свежую или закэшированную информацию.
Плюсом я записываю данные о региональности в глобальную переменную $GLOBALS[«PROGTIME_REGION_CACH»], чтобы к информации можно было обратиться как к обычному массиву, без работы функции.
В дальнейшем мы будем использовать именно эту функцию для получения информации
function ProgTimeRegionInfo() {
$dataCach = returnResultCache("860000", $_SERVER["HTTP_HOST"], "addRegionInfo");
$GLOBALS["PROGTIME_REGION_CACH"] = $dataCach;
return $dataCach;
}
Использование региональности
Я региональности в своё проекте использую в добавление названия города к заголовкам страниц или в описание страницы, в файле footer.php.
Здесь я просто запускаю функцию, получаю в отдельной переменной заголовок или любою другую информацию, ищу и заменяю ключи.
$regionInfo = ProgTimeRegionInfo();
$titlePage = $APPLICATION->GetPageProperty("title");
if($regionInfo) {
/* название города в Р.П. */
$titlePage = str_replace("PROGTIME_REGION_STATE_NAME_RP", $regionInfo["NAME_STATE_DECLINE_RP"], $titlePage);
/* название города в Т.П. */
$titlePage = str_replace("PROGTIME_REGION_STATE_NAME_TP", $regionInfo["NAME_STATE_DECLINE_TP"], $titlePage);
/* название города в П.П. */
$titlePage = str_replace("PROGTIME_REGION_STATE_NAME_PP", $regionInfo["NAME_STATE_DECLINE_PP"], $titlePage);
}
$APPLICATION->SetPageProperty("title", $titlePage);