Иногда на сайте требуется реализовать что-то вроде такого функционала:

Город при посещении сайта должен быть выбран в соответствии с тем, откуда пользователь зашёл на сайт. Если из Санкт-Петербурга — то должен быть отображён Санкт-Петербург.
Реализовать определение города можно с помощью замечательного модуля «Определение местоположения по IP-адресу». Качаем его из маркетплейса отсюда.
Приступим к реализации:
Данные о том, из какого города к нам зашёл посетитель, будем хранить в сессии, а сами города и им соответствующие номера телефонов — в инфоблоке. Напишем несколько функций, которые помогут нам вытащить из инфоблока данные о городе (его название, id и номер телефона):
/*
* возвращает текущий город, его id и телефон по GeoIP
*/
function get_current_city_by_geo(){
$ret = false;
CModule::IncludeModule("iblock");
if (CModule::IncludeModule("altasib.geoip")) {
$arData = ALX_GeoIP::GetAddr();
$res = CIBlockElement::GetList(Array(), array("IBLOCK_ID" => 1, "ACTIVE" => "Y", "NAME" => $arData['city']), false, false, array("NAME", "ID", "PROPERTY_PHONE"))->GetNext();
if ($res){
$ret['ID'] = $res['ID'];
$ret['NAME'] = $res['NAME'];
$ret['PHONE'] = $res['PROPERTY_PHONE_VALUE'];
}
else{
$ret = false;
}
}
return $ret;
}
/*
* возвращает текущий город, его id и телефон по $_SESSION['city']
*/
function get_current_city_by_session(){
$ret = false;
CModule::IncludeModule("iblock");
if (CModule::IncludeModule("altasib.geoip")) {
$arData = ALX_GeoIP::GetAddr();
$res = CIBlockElement::GetList(Array(), array("IBLOCK_ID" => 1, "ACTIVE" => "Y", "NAME" => $_SESSION['city']), false, false, array("NAME", "ID", "PROPERTY_PHONE"))->GetNext();
if ($res){
$ret['ID'] = $res['ID'];
$ret['NAME'] = $res['NAME'];
$ret['PHONE'] = $res['PROPERTY_PHONE_VALUE'];
}
else{
$ret = false;
}
}
return $ret;
}
Добавим эти функции в init.php (чтобы к ним был доступ из header.php)
Теперь опишем саму логику определения города (этот код можно использовать в header.php):
if (isset($_SESSION['city'])){
$city = get_current_city_by_session();
}
else{
$city = get_current_city_by_geo();
if ($city){
$_SESSION['city'] = $city['NAME'];
}
else{
$_SESSION['city'] = 'Санкт-Петербург';
$city = get_current_city_by_session();
}
}
Пояснения: Если в сессии уже задан город, то в $city будут записаны данные о нём. Если нет — то определим этот город по GeoIP и попытаемся получить о нём данные из инфоблока. Если в инфоблоке такого города нет — то получим данные о городе «Санкт-Петербург» (пусть это будет город по умолчанию).
Далее уже можно приступать к отображению. Телефон и наименование города можно получить так:
// название города echo $city['NAME']; // телефон этого города echo $city['PHONE'];