В этой заметке будем рассматривать пример вывода блока с телефонами на основе региона пользователя. Например, пользователям с Москвы показываем номер с кодом 495, а регионам 8 800.

Будем использовать мой модуль olegpro.ipgeobase для определения местоположения пользователя. Почитать подробнее в заметке IpGeoBase. Определение местоположения по IP-адресу, а скачать можно на странице модуля.

Код включаемой области с блоком телефонов

<?php
 
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 шаблона нашего сайта:

<?php
    $APPLICATION->IncludeFile(
        SITE_TEMPLATE_PATH . '/include_areas/header_contacts.php',
        array(),
        array('MODE' => 'php')
    )
?>