Определение местоположения реализовано в классах пространства имён \Bitrix\Main\Service\GeoIp. В самом начале файла с обработчиком прописываем использование данного пространства:
use \Bitrix\Main\Service\GeoIp;
Для обработки местоположения пользователя может быть использовано несколько сервисов. Список доступных можно посмотреть в административном разделе сайта: Настройки -> Настройки продукта -> Геолокация.
По умолчанию, пользователю доступны 3 обработчика: MaxMind, Sypex Geo и расширение GeoIP. Для MaxMind и Sypex Geo нужны ключи доступа к данным. При регистрации в сервисе Sypex Geo предоставляется 30000 бесплатных запросов в месяц, чего для многих сайтов достаточно.
Данный список можно расширить своими обработчиками, которые прописываются с помощью обработчика события 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'
Для начала нужно получить IP-адрес пользователя:
$ipAddress = GeoIp\Manager::getRealIp();
Чтобы получить информацию по IP пользователя, нужно вызвать метод:
$result = GeoIp\Manager::getDataResult($ipAddress, "ru")->getGeoData();
Чтобы получить код страны пользователя, нужно вызвать метод:
$country = $result->countryCode;
Еще один важный момент - есть возможность сократить количество запросов к сервису определения - вся информация о пользователе будет сохранена в cookies BX_MAIN_GEO_IP_DATA_XXX_XXX_XXX_XXX. Пока cookie будет жива и IP будет оставаться прежним, запросов в сервис геолокации по данному пользователю не будет. Для этого, нужно перед получением информации (getDataResult), нужно вызвать метод:
GeoIp\Manager::useCookieToStoreInfo(true);
Последний момент - использование данных гео-локации в механизмах интернет-магазина. Для получения ID местоположения пользователя, нужно вызвать функцю:
\Bitrix\Sale\Location\GeoIp::getLocationId($ip, $lang);
Для получения кода местоположения используется функция:
\Bitrix\Sale\Location\GeoIp::getLocationCode($ip, $lang);
И для получения почтового индекса, используется функция:
\Bitrix\Sale\Location\GeoIp::getZipCode($ip, $lang);
Вариантов использования получения информации о геолокации пользователя может быть бесконечное множество - показ ближайшего к пользователю склада, отображение контактной информации локального представительства и многое другое.
