Определение местоположения d7

Достаточно распространенная задача - определить местоположение пользователя по его ip. Одно время в битриксе было достаточно проблематично получить местоположение пользователя, но с версии 17.0.13 необходимый функционал появился в коробке. Для начала необходимо заглянуть в админку и настроить необходимые обработчики для определения местоположения:

Настройки –> Настройки продукта –> Геолокация

Как видно мы можем использовать несколько обработчиков для определения местоположения.

GeoIP - это расширение относится к серверному и работает на стороне сервера. Для работы, необходимо установить это расширение на сервер версии 1.4.0 и загрузить платные базы данных.

MaxMind - работает только по подписке. Необходимо получить лицензионный ключ в этом сервисе.

Sypex Geo - бесплатно обрабатывает до 10 000 запросов в месяц. Но при увеличении этого числа потребуется получить ключ.

Для работы с сервисами геолокации в битрикс d7 используются классы в пространстве имён \Bitrix\Main\Service\GeoIp

Для упрощения работы с геолокацией будем использовать сокращение:

use \Bitrix\Main\Service\GeoIp;

Для того, что бы определить местоположение, необходимо получить IP пользователя:

$userIP = GeoIp\Manager::getRealIp();

Зная IP адрес, можно запросить информацию о нем:

$geoData = GeoIp\Manager::getDataResult($userIP, "ru");

Метод возвращает объект класса GeoIp\Result если результат найден и GeoIp\Manager::INFO_NOT_AVAILABLE если не найден

Для проверки, получены результаты или нет, используем метод isSuccess()

$geoData->isSuccess();

Так же можно получить данные геолокации методом getGeoData

$geoDataResult = $geoData->getGeoData();

$geoDataResult->countryName; //Страна
$geoDataResult->regionName; //Город
$geoDataResult->subRegionName;
$geoDataResult->cityName; // Санкт-Петербург
$geoDataResult->countryCode; // Код страны
$geoDataResult->regionCode; // Код города
$geoDataResult->zipCode; //Индекс
$geoDataResult->latitude; //Широта
$geoDataResult->longitude; //Долгота
$geoDataResult->timezone; //Временная зона -  Europe/Moscow
$geoDataResult->asn;
$geoDataResult->ispName;
$geoDataResult->organizationName; 
$geoDataResult->handlerClass; //Класс через который работает метод

Так же данные можно получить по отдельности:

GeoIp\Manager::getCityName($realIP, "ru"); // Город
GeoIp\Manager::getCityPostCode($userIP, "ru"); // Индекс
GeoIp\Manager::getCountryCode($userIP, "ru"); // Код страны
GeoIp\Manager::getCountryName($userIP, "ru"); // Страна
GeoIp\Manager::getGeoPosition($userIP, "ru"); // Широта и долгота
GeoIp\Manager::getGeoPositionLatitude($userIP, "ru"); // Широта
GeoIp\Manager::getGeoPositionLongitude($userIP, "ru"); // Долгота
GeoIp\Manager::getIspName($userIP, "ru"); // Имя Internet Service Provider (ISP)
GeoIp\Manager::getOrganizationName($userIP, "ru"); // Организация
GeoIp\Manager::getTimezoneName($userIP, "ru"); // Временнуя зону

Для уменьшения количества запросов к сервисам определения местоположения стоит сохранять результат в cookies. Вызываем useCookieToStoreInfo перед getDataResult

GeoIp\Manager::useCookieToStoreInfo(true);

Определение местоположения через модуль магазина (sale)

Помимо базового функционала определения местоположения, битрикс, для редакций с интернет-магазином, умеет работать так же и с местоположениями магазина. Можно получить не просто информацию о городе или стране, но и с привязкой к местоположениями магазина. Это потребуется для оформления заказа или расчета доставки.

Для работы с местоположениями магазина используется класс Bitrix\Sale\Location\GeoIp

\Bitrix\Sale\Location\GeoIp::getLocationId($userIP, "ru");//ID
\Bitrix\Sale\Location\GeoIp::getLocationCode($userIP, "ru");//Код
\Bitrix\Sale\Location\GeoIp::getZipCode($userIP, "ru");//Индекс

Эти методы находят местоположение в базе по названию не зависимо от регистра. Так же эти методы сохраняют данные о метоположении в cookies.

Для работы с местоположениями магазина(sale) в битриксе есть свои классы, о которых можно прочесть в статье "Работа с местоположениями магазина битрикс d7".