1С-Битрикс. Геозависимые блоки на сайте с поддержкой композитного режима
В этой заметке будем рассматривать пример вывода блока с телефонами на основе региона пользователя. Например, пользователям с Москвы показываем номер с кодом 495, а регионам 8 800.
Будем использовать мой модуль olegpro.ipgeobase для определения местоположения пользователя. Почитать подробнее в заметке IpGeoBase. Определение местоположения по IP-адресу, а скачать можно на странице модуля.
Код включаемой области с блоком телефонов
use Bitrix\Main\Loader; use Bitrix\Main\Page\FrameBuffered; use Olegpro\IpGeoBase\IpGeoBase; use Bitrix\Main\Config\Option; /** * Телефоны у нас хранятся через запятую в системных настройках нашего модуля * В разных полях: одно для регионов, другое для москвы */ $phonesMsk = array_filter(array_map('trim', explode(',', Option::get('olegpro.sitesettings', 'phone_msk')))); list($phoneRegion1) = array_values(array_filter(array_map('trim', explode(',', Option::get('olegpro.sitesettings', 'phone_region'))))); $msk = false; if (Loader::includeModule('olegpro.ipgeobase') && ($record = IpGeoBase::getInstance()->getRecord()) && ($record['city'] == 'Москва' || $record['region'] == 'Москва' || $record['region'] == 'Московская область') ) { $msk = true; } <p class="phone-paragraph" id="header_contacts"><?php $frame = new FrameBuffered('header_contacts', false); $frame->begin(); // {{{ Это часть динамическая - будет отдаваться в ответ на ajax-хит при композите if($msk) { echo array_map(function($phone) { return sprintf('<span class="header-phone">%s</span>', $phone); }, $phonesMsk); }else{ if(isset($phoneRegion1)) { echo sprintf('<span class="header-phone">%s</span>', $phoneRegion1); } } // }}} $frame->beginStub(); // {{{ Эта часть статическая - запишется в кеш композита на первом его хите или будет отдаваться, когда композит отключен if(isset($phoneRegion1)) { echo sprintf('<span class="header-phone">%s</span>', $phoneRegion1); } // }}} $frame->end(); </p>
Ну и подключим включаемую область с блоком телефонов в header.php шаблона нашего сайта:
$APPLICATION->IncludeFile( SITE_TEMPLATE_PATH . '/include_areas/header_contacts.php', array(), array('MODE' => 'php') )