В связи с развитием интернет торговли и наличия у многих магазинов партнёрских сетей, региональных представителей  и т.п. задача определения местоположения пользователя при заходе на сайт, сейчас достаточно актуальная. В 1С Битрикс, решить её можно несколькими путями, используя внешние сервисы такие как SypexGeo или же встроенными классами ядра.

Как получить ip посетителя сайта?

Получить ip адрес посетителя можно через глобальный массив $_SERVER. Т.к. клиент может зайти на ваш сайт напрямую или же используя прокси-сервер, нам следует проверить несколько разных ключей массива $_SERVER:

  1. HTTP_CLIENT_IP — заголовок содержащий ip адрес пользователя (в случае прокси-сервера)
  2. HTTP_X_FORWARDED_FOR — заголовок содержащий ip адрес пользователя (в случае прокси-сервера)
  3. REMOTE_ADDR — IP-адрес, с которого пользователь просматривает текущую страницу.

Давайте напишем небольшую функцию для этого:


/**
 * Возвращаем ip-адрес посетителя сайта
 * @return bool|string
 */
function getUserIp() {
    //Массив ключей $_SERVER которые следует проверить
    $serverKeys = [
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'REMOTE_ADDR'
    ];

    foreach ($serverKeys as $key) {
        if ($_SERVER[$key]) {
            //Преобразуем строку в $_SERVER в массив, получаем последний элемент массива который содержит ip-адрес
            $ipAddress = trim(end(explode(',', $_SERVER[$key])));
            //Проверяем переменную $ipAddress на валидность
            if (filter_var($ipAddress, FILTER_VALIDATE_IP)) {
                return $ipAddress;
            }
        }
    }

    //Не удалось определить ip адрес
    return false;
}

//Узнаём и выводим на экран ip-адрес пользователя
$yourIp = getUserIp();
if($yourIp){
    echo 'Ваш ip адрес: ' . $yourIp;
} else {
    echo 'Не удалось определить ip-адрес';
}

Ip адрес

Определяем страну и город по ip с помощью SypexGeo

SypexGeo это небольшой скрипт и несколько баз данных в бинарном формате, которые содержат огромное количество ip адресов, стран, городов и координат географических объектов. Распространяется бесплатно, работает быстро, весит не много. В первую очередь вам необходимо загрузить сам скрипт + несколько базы данных для стран и городов. Сделать это можно на странице загрузки на официальном сайта.

Первым делом вам необходимо распаковать и подключить к вашему сайту скрипт SxGeo.php.


//Подключаем SxGeo
require_once __DIR__ . '/sxgeo/SxGeo.php';

А затем, создадим экземпляр класса SxGeo и получим код страны по ip пользователя:


//Создадим объёкт SxGeo со следующими параметрами:

//$_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeo.dat - путь к файлу базы данных стран
//SXGEO_BATCH  - пакетная обработка, увеличивает скорость обработки нескольких ip за раз
//SXGEO_MEMORY - кеширования БД в памяти

$sxGeoObj = new SxGeo($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeo.dat', SXGEO_BATCH | SXGEO_MEMORY);

//Получим код страны
$countryCode = $sxGeoObj->getCountry($yourIp);
echo 'Код вашей страны: ' . $countryCode . '<br/>';
Результат:
Код страны SxGeo
У нас ведь есть ещё одна бинарная база SxGeoCity.dat , посмотрим что она нам даёт. Немного изменим наш код, подключим другую БД и получим всё что есть по нашему ip-адресу:

//Создадим объект SxGeo со следующими параметрами:

//$_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeoCity.dat - путь к файлу базы данных городов
//SXGEO_BATCH  - пакетная обработка, увеличивает скорость обработки нескольких ip за раз
//SXGEO_MEMORY - кеширования БД в памяти

$sxGeoObj = new SxGeo($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY);

//Получим данные по городу
$city = $sxGeoObj->get($yourIp);
//Заглянем внутрь
echo '<pre>'; 
print_r($city); 
echo '</pre>';

В результате будет выведен такой массив:

Array
(
    [city] => Array
        (
            [id] => 501175
            [lat] => 47.23135
            [lon] => 39.72328
            [name_ru] => Ростов-на-Дону
            [name_en] => Rostov-on-Don
        )

    [country] => Array
        (
            [id] => 185
            [iso] => RU
        )

)

Как видите здесь есть наименование города на русском и английском языках, координаты (широта и долгота), а так же данные по стране города.


Определение города посетителя методами 1С Битрикс

Не так давно, в ядро 1С Битрикс был добавлен класс \Bitrix\Main\Service\GeoIp\Manager который позволяет нам, без подключения сторонних библиотек определить странц, город и координаты пользователя по его ip-адресу. Класс содержит следующий набор доступных методов:

Метод Описание метода
getCityName Метод возвращает полное название города.
getCityPostCode Метод возвращает почтовый индекс, FSA или Zip код.
getCountryCode Метод возвращает двухбуквенный код страны.
getCountryName Метод возвращает полное имя страны.
getDataResult Метод возвращает всю возможную информацию о геолокации.
getGeoPosition Метод возвращает атрибуты гео-положения.
getGeoPositionLatitude Метод возвращает широту.
getGeoPositionLongitude Метод возвращает долготу.
getIspName Метод возвращает имя Internet Service Provider (ISP).
getOrganizationName Метод возвращает название организации.
getTimezoneName Метод получает временную зону.
setLogErrors Метод включает/выключает ведение лога для выявления ошибок.
useCookieToStoreInfo Метод включает/выключает хранение информации о геолокации в файлах cookie.

Давайте узнаем наименование страны, а так же город и географические координаты:


//Получим ip адрес пользователя
$yourIp = getUserIp();

echo 'Ваш ip адрес: ' . $yourIp . '<br/>';

//Передаём ip и идентификатор языка, на котором нам нужно получить название страны и города
$country = Bitrix\Main\Service\GeoIp\Manager::getCountryName($yourIp); 
$cityName = Bitrix\Main\Service\GeoIp\Manager::getCityName($yourIp);

//Получаем координаты для карты
$geoPosition = Bitrix\Main\Service\GeoIp\Manager::getGeoPosition();


echo 'Ваша страна: <b>'. $country .'</b>, ваш город: <b>' . $cityName . '</b>';
echo '<pre>'; print_r($geoPosition); echo '</pre>';

Получаем такой результат:
Местоположения по ip методами битрикса
Не нашёл где включить поддержку русского языка, поэтому название страны и города на английском, но в целом всё работает. Как мы можем это использовать? Например, можно вывести Яндекс Карту с меткой на городе посетителя и контктами магазина полученными для этого города. Их можно хранить в отдельном инфоблоке или HL-блоке. Давайте выведем карту при момощи компонента Яндекс.Карты, Настраиваемая карта:

//Получим ip адрес пользователя
$yourIp = getUserIp();

echo 'Ваш ip адрес: ' . $yourIp . '<br/>';

//Передаём ip и идентификатор языка, на котором нам нужно получить название страны и города
$country = Bitrix\Main\Service\GeoIp\Manager::getCountryName($yourIp); 

//Получаем координаты для карты
$geoPosition = Bitrix\Main\Service\GeoIp\Manager::getGeoPosition();

//Параметры метки для Яндекс.Карты
$arPlacemarks[] = [
    "LAT" => $geoPosition['latitude'],
    "LON" => $geoPosition['longitude'],
    "TEXT" => $userCity,
];


//Параметры карты в виде сериализованного массива
$mapData = serialize([
	'yandex_scale' => 5, //Масштаб карты
	'yandex_lat' => $geoPosition['latitude'], //Координаты
	'yandex_lon' => $geoPosition['longitude'], //Координаты
	'PLACEMARKS' => $arPlacemarks
]);


//Компонент Яндекс.Карты, Настраиваемая карта
$APPLICATION->IncludeComponent(
	"bitrix:map.yandex.view",
	"",
	Array(
		"API_KEY" => "",
		"CONTROLS" => array("ZOOM", "MINIMAP", "TYPECONTROL", "SCALELINE"),
		"INIT_MAP_TYPE" => "MAP",
		"MAP_DATA" => $mapData ,
		"MAP_HEIGHT" => "500",
		"MAP_ID" => "",
		"MAP_WIDTH" => "600",
		"OPTIONS" => array("ENABLE_SCROLL_ZOOM", "ENABLE_DBLCLICK_ZOOM", "ENABLE_DRAGGING")
	)
);

Получаем такой результат:
Яндекс карта


Как видите в 1С Битрикс вы без особых сложностей и сторонних библиотек можете получить все данные о местоположении пользователя по его ip адресу и реализовать на основе этих данных некий персонализированный функционал, например поменять телефоны на сайте, чтобы посетитель дозванивался до регионального офиса, вывести контакты регионального офиса на странице контактов, вывести цены текущего региона пользователя и многое другое. О реализации подобного функционала поговорим в других статьях.

Функции использованные в статье: trim(), end(), explode()


Полезная статья?
(Голосов: 5, Рейтинг: 3.48)
Вам также могут понравиться
Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как правильно подключать стили и скрипты к шаблону 1С Битрикс.

Генерация оглавления статьи

Генерация оглавления статьи

В статье рассмотрен пример функции для генерации оглавления статьи блога или новости

Переменные доступные в компоненте 1С Битрикс

Переменные доступные в компоненте 1С Битрикс

В статье разобран список доступных в компоненте 1С Битрикс переменных, позволяющих получить доступ к различным параметрам и методам компонента.


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке