В связи с развитием интернет торговли и наличия у многих магазинов партнёрских сетей, региональных представителей  и т.п. задача определения местоположения пользователя при заходе на сайт, сейчас достаточно актуальная. В 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()


Вам также могут понравиться

Современные способы заработка на сайтах

Современные способы заработка на сайтах

Не для кого не секрет, что в современном мире вы можете зарабатывать определённые деньги на своём сайте ничего не продавая. Говоря «ничего не продавая», я имею ввиду классическую схему, когда вы продаёте свои услуги, перепродаёте товар (предварительно закупая или используя схемы прямой поставки «дроп-шиппинга») или что-то производите. В статье рассмотрим методы, которые не требуют от вас подобных действий. И так, рассмотрим основные методы в порядке возрастания их сложности и времени которое требуется от владельца сайта.

Пользовательский тип свойств инфоблока в 1С Битрикс

Пользовательский тип свойств инфоблока в 1С Битрикс

В дополнение к статье о создании собственного типа пользовательских полей хочу рассказать как делать аналогичные свойства для информационных блоков, т.к. эти свойства относятся к другому модулю, а именно «информационные блоки» (iblock).

Условные операторы в PHP

Условные операторы в PHP

Добрались до логики выполнения программы. И так условные операторы (по другому операторы ветвления) позволяют нам организовать определённое поведение программы в зависимости от входных параметров (данных вводимых пользователем, результатом работы вспомогательных функций). Вся логика в языках программирования основана на Алгебре Буля. 

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

Самые читаемые

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Одним из преимуществ интернет-магазинов на 1С Битрикс на мой взгляд является наличие не так давно до...

Основы SEO оптимизации сайта

Основы SEO оптимизации сайта

Эта статья не истина в последней инстанции, а лишь набор правил которые я применяю при создании/испр...

Собственный тип пользовательских полей в 1С Битрикс

Собственный тип пользовательских полей в 1С Битрикс

Для решения некоторых задач порой не хватает стандартного набора пользовательских полей поставляемых...