Достаточно распространенная задача - определить местоположение пользователя по его 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".