Создание региональности без компонентов и модулей на CMS Bitrix, на поддоменах — PROG-TIME

Создание региональности без компонентов и модулей на CMS Bitrix, на поддоменах

12.09.2021
Содержание:

В новой записи я вам покажу как я делал региональность на сайте с CMS Bitrix без использования компонентов, модулей и плагинов, с помощью пары простых функций.

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

Административная часть для региональности

В плане админки, нам нужно сделать следующее:

  • создать отдельный highloadblock, в который мы будем записывать информацию по регионам
  • прописать в созданной таблице поля для контактов. Так же здесь я создал поля для склонения названия города в Т.п., в Р.п. и в П.п.

Таблица у меня состоит из следующих полей:

  • Название города
  • Главный домен (поддомен)
  • Телефон
  • Email
  • Название области
  • Название города в Родительном падеже
  • Название города в Творительном падеже
  • Название города в Предложном падеже
  • Адрес магазина

Моя задумка состоит в использование специальных ключей, которые я буду прописывать в 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);
На этом всё!
Больше интересных статей в нашей группе - https://vk.com/progtime
Вы так же можете разместить свой вопрос на нашем форуме, где другие программисты смогут вам помочь в решение вашей задачи - https://vk.com/prog_time
Так же прокачивайте свои навыки на нашем канале - https://www.youtube.com/c/ProgTime
Наши планы
  • Написание материала для курса по разработке ботов на Telegram
  • Разработка универсального парсера на PHP

Поддержите мой сайт!

Каждый переведённый донат, мотивирует на создание новых записей и уроков на YouTube

Контакты для связи

Технология на prog-time
Telegram
https://t.me/prog_time_bot