Bitrix sale location geoip

В версии модуля sale 17.0.13 появилось автоматическое определение местоположения покупателя при оформлении заказа. Но это можно использовать и в своих целях, соответствующие классы и методы доступны для использования разработчиками.

В sale 17.0.17 замечен баг с геолокацией (Ошибка "Call to undefined method BitrixMainServiceGeoIpManager::getData()"). Из-за этого не работает оформление заказа (sale.order.ajax). Для получения костыля нужно написать в техподдержку или обновиться до sale 17.0.18.

Определение местоположения реализовано в классах пространства имён BitrixMainServiceGeoIp . Для работы примеров будет использоваться сокращение:

Обработчики геолокации

Доступные обработчики можно найти и настроить в настройках Настройки > Настройки продукта > Геолокация. На момент написания статьи доступны обработчики:

Для первых двух нужны ключи для доступа к соответствующим сервисам. Для тестирования проще и дешевле зарегистрироваться на Sypex Geo, там дают 30000 бесплатных запросов в месяц. Ключ для сервиса будет указан в личном кабинете, его нужно будет указать в настройках обработчика.

Обработчики геолокации — классы-наследники GeoIpBase . Из коробки идут 3 обработчика, как говорилось выше:

Добавить свои можно с помощью события onMainGeoIpHandlersBuildList модуля main:

Примеры обработчиков можно найти в ядре, обязательно требуется определить три метода: getTitle , getDescription и getData .

Использование

Для определения местоположения требуется IP пользователя. Его можно получить с помощью метода GeoIpManager::getRealIp :

Для получения геоинформации по этому IP нужно вызвать метод GeoIpManager::getDataResult :

Метод возвращает объект класса GeoIpResult (до версии 17.0.18 – GeoIpDataResult ). Поля объекта:

Из поля ‘handlerClass’ видно, что для определения использовался обработчик Sypex Geo. Вообще менеджер перебирает все доступные настроенные обработчики, которые могут вернуть результат на нужном языке (второй аргумент в методе getDataResult ) и с нужными полями. Если найден подходящий обработчик и он вернул результат, то запросы к другим доступным обработчикам не делаются.

Читайте также:  Asus rt n16 прошивка tomato

Нужные поля можно указать третьим аргументом в методе getDataResult , например:

В таком случае Sypex Geo не будет использован, т.к. в списке возвращаемых полей нет zipCode.

Перед запросом можно включить сохранение геоинформации в cookies, для этого перед getDataResult следует вызвать:

В таком случае, в случае успешного получения геоинформации она будет сохранена в cookies BX_MAIN_GEO_IP_DATA_XXX_XXX_XXX_XXX , привязанной к определенному IP. Пока cookie будет жива и IP будет оставаться прежним, запросов в сервис геолокации по данному пользователю не будет.

Стоит учесть, что максимальная длина cookie — 4096 байт, а в IE вроде как еще меньше. Поэтому неизвестно, насколько надежно держать в cookie сериализованный объект с геоинформацией. Уверен, что в Битриксе об этом не задумывались.

Геолокация в модуле sale

Как говорилось в начале, геолокация была анонсирована в обновлении модуля sale, поэтому геолокацию можно использовать для определения местоположения пользователя для оформления заказа. Для этого существует класс BitrixSaleLocationGeoIp , который использует вышеописанный функционал для поиска местоположения в базе Битрикса.

Во всех этих методах используется сохранение результата геолокации в cookies. Местоположение в базе находится по названию независимо от регистра.

Очень часто бывает задача показывать пользователю различный контент в зависимости от того, из какого государства просматривает пользователь ваш сайт. Процесс определения государства конечно же должен быть автоматизирован. В версии модуля sale 17.0.13 появилось автоматическое определение местоположения покупателя при оформлении заказа.

Определение местоположения реализовано в классах пространства имён BitrixMainServiceGeoIp. В самом начале файла с обработчиком прописываем использование данного пространства:

Для обработки местоположения пользователя может быть использовано несколько сервисов. Список доступных можно посмотреть в административном разделе сайта: Настройки -> Настройки продукта -> Геолокация.

Читайте также:  Как поставить пароль на локальную сеть

По умолчанию, пользователю доступны 3 обработчика: MaxMind, Sypex Geo и расширение GeoIP. Для MaxMind и Sypex Geo нужны ключи доступа к данным. При регистрации в сервисе Sypex Geo предоставляется 30000 бесплатных запросов в месяц, чего для многих сайтов достаточно.

Данный список можно расширить своими обработчиками, которые прописываются с помощью обработчика события onMainGeoIpHandlersBuildList для модуля main :

Обработчик должен обязательно содержать 3 метода: getTitle, getDescription и getData. Примеры обработчиков можно посмотреть в ядре. Встроенные в ядро обработчики расположены тут:

Для начала нужно получить IP-адрес пользователя:

Чтобы получить информацию по IP пользователя, нужно вызвать метод:

Чтобы получить код страны пользователя, нужно вызвать метод:

Еще один важный момент — есть возможность сократить количество запросов к сервису определения — вся информация о пользователе будет сохранена в cookies BX_MAIN_GEO_IP_DATA_XXX_XXX_XXX_XXX. Пока cookie будет жива и IP будет оставаться прежним, запросов в сервис геолокации по данному пользователю не будет. Для этого, нужно перед получением информации ( getDataResult ), нужно вызвать метод:

Последний момент — использование данных гео-локации в механизмах интернет-магазина. Для получения ID местоположения пользователя, нужно вызвать функцю:

Для получения кода местоположения используется функция:

И для получения почтового индекса, используется функция:

Вариантов использования получения информации о геолокации пользователя может быть бесконечное множество — показ ближайшего к пользователю склада, отображение контактной информации локального представительства и многое другое.

GeoIp — Пространство имён для классов для работы с геолокацией.

Метод Описание С версии
Base Базовый класс
HandlerTable Расширение класса EntityDataManager.
Manager Финальный класс для работы с информацией о геолокации.
Result Содержит информацию об описаниях запрошенных данных по геолокации.
MaxMind Конкретная реализация базового класса для MaxMind.
Extension Конкретная реализация базового класса для стандартного php GeoIP.
SypexGeo Конкретная реализация базового класса для стандартного php SypexGeo.
Читайте также:  Intel core i7 4700

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.