Работа с Geo средствами Bitrix
Очень часто бывает задача показывать пользователю различный контент в зависимости от того, из какого государства просматривает пользователь ваш сайт. Процесс определения государства конечно же должен быть автоматизирован.
Определение местоположения реализовано в классах пространства имён \Bitrix\Main\Service\GeoIp
.
Для обработки местоположения пользователя может быть использовано несколько сервисов. Список доступных можно посмотреть в административном разделе сайта: Настройки -> Настройки продукта -> Геолокация
.
По умолчанию, пользователю доступны 3 обработчика:
MaxMind
Sypex Geo
GeoIP
Для MaxMind
и Sypex Geo
нужны ключи доступа к данным. При регистрации в сервисе Sypex Geo
предоставляется 30000 бесплатных запросов в месяц, чего для многих сайтов достаточно.
Код страны можно вытащить из модуля "Веб-аналитика" через переменные окружения, подробней тут.
Как работает Geo
Получение объекта с данными о местоположении, на некоторых хостингах, может быть установлена только англоязычная база расширения geoip
, поэтому если не работает, можно попробовать en
вместо LANGUAGE_ID
:
$geoIpData = \Bitrix\Main\Service\GeoIp\Manager::getDataResult($ip,LANGUAGE_ID);
Методы объекта
Проверить, было ли определение успешным:
$geoIpData->isSuccess();
Получение страны:
$geoIpData->getGeoData()->countryName;
Получение региона:
$geoIpData->getGeoData()->regionName;
Получение города:
$geoIpData->getGeoData()->cityName
Класс службы, с помощью которой было определено местоположение:
$geoIpData->getGeoData()->handlerClass;
Получение данных в одну строку
Определение IP-адреса пользователя:
$ip = \Bitrix\Main\Service\GeoIp\Manager::getRealIp();
Код страны одной строкой:
$countryCode = \Bitrix\Main\Service\GeoIp\Manager::getCountryCode($ip,LANGUAGE_ID);
Название страны одной строкой:
$countryName = \Bitrix\Main\Service\GeoIp\Manager::getCountryName($ip,LANGUAGE_ID);
Название города одной строкой:
$cityName = \Bitrix\Main\Service\GeoIp\Manager::getCityName($ip,LANGUAGE_ID);
Почтовый индекс города одной строкой:
$postCode = \Bitrix\Main\Service\GeoIp\Manager::getCityPostCode($ip,LANGUAGE_ID);
Данные о геопозиции одной строкой:
$geoPosition = \Bitrix\Main\Service\GeoIp\Manager::getGeoPosition($ip,LANGUAGE_ID);
Широта одной строкой:
$lat = \Bitrix\Main\Service\GeoIp\Manager::getGeoPositionLatitude($ip,LANGUAGE_ID));
Долгота одной строкой:
$lon = \Bitrix\Main\Service\GeoIp\Manager::getGeoPositionLongitude($ip,LANGUAGE_ID));
Добавление нового сервиса
Данный список можно расширить своими обработчиками, которые прописываются с помощью обработчика события onMainGeoIpHandlersBuildList
для модуля main
:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler(
'main',
'onMainGeoIpHandlersBuildList',
'GeoIpHandler'
);
function GeoIpHandler()
{
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
array(
'YourClass' => '/path/to/your/class.php',
)
);
}
Обработчик должен обязательно содержать 3 метода: getTitle
, getDescription
, getData
. Примеры обработчиков можно посмотреть в ядре, встроенные в ядро обработчики расположены тут:
'\Bitrix\Main\Service\GeoIp\MaxMind' => 'lib/service/geoip/maxmind.php',
'\Bitrix\Main\Service\GeoIp\Extension' => 'lib/service/geoip/extension.php',
'\Bitrix\Main\Service\GeoIp\SypexGeo' => 'lib/service/geoip/sypexgeo.php'