GeoIp или Определение города по IP

Тема в разделе "Инструкции и FAQ", создана пользователем Ravilr, 27 мар 2019.

  1. Ravilr

    Ravilr Специалист

    Сообщения:
    3.884
    Симпатии:
    1.065
    Есть такая крутая библиотека Sypex Geo. Она определяет страну, регион, город и географические координаты по IP-адресу в 4-5 раз быстрее ближайших конкурентов.
    Сайт http://sypexgeo.net/

    На базе нее и строится данное решение для определения города или региона.

    Что нам нужно?

    1. Качаем библиотеку http://sypexgeo.net/ru/download/
    нам нужно Sypex Geo для PHP 5.2+ и базу городов Sypex Geo City (utf версия)


    2. Открываем архив и копируем файлы в директорию system/vendor/geoip


    3. В нужном контроллере, например header.php вставим
    PHP:
            require_once(DIR_SYSTEM "vendor/geoip/SxGeo.php");
            
    $SxGeo = new SxGeo(DIR_SYSTEM "vendor/geoip/SxGeoCity.dat");
            
    $ip $_SERVER['REMOTE_ADDR'];
            
    $data['geoip'] = $SxGeo->getCityFull($ip);

    4. В шаблоне ловим данные и делаем условия. Например для версии 3х

    PHP:
                        {% set geotel '8-800-000-00-00' %}
                        {% if 
    geoip.region.iso == 'RU-OMS' %}
                        {% 
    set geotel '+7 (3812) 00-00-00' %}
                        {% endif %}
    тут мы просто присваиваем в переменную geotel нужный телефон, а потом можем вывести как обычно {{ geotel }}

    Если смотреть, что у нас в массиве, как памятка, то ниже смотрим
    Код:
    Array
    (
        [city] => Array
            (
                [id] => 1496153
                [lat] => 54.99244
                [lon] => 73.36859
                [name_ru] => Омск
                [name_en] => Omsk
            )
    
        [region] => Array
            (
                [id] => 1496152
                [name_ru] => Омская область
                [name_en] => Omskaya Oblast'
                [iso] => RU-OMS
            )
    
        [country] => Array
            (
                [id] => 185
                [iso] => RU
                [lat] => 60
                [lon] => 100
                [name_ru] => Россия
                [name_en] => Russia
            )
    
    )

    ВАРИАНТ 2

    Чтобы не скачивать себе базу каждый раз, то можно воспользоваться их апи.
    Там все просто. Пишем
    PHP:
    $data['geoip'] = json_decode(file_get_contents('http://api.sypexgeo.net/json/'), true);
    В итоге получаем все тоже самое, но с помощью запроса к серверу sypexgeo
     
    Последнее редактирование: 27 мар 2019
    Bkmz, Chukcha, karpov и ещё 1-му нравится это.
  2. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    мало качать либу, еще нужно иметь обновленную базу, хотя бы раз в месяц
     
    karpov нравится это.
  3. Ravilr

    Ravilr Специалист

    Сообщения:
    3.884
    Симпатии:
    1.065
    Добавил альтернативный вариант.
     
  4. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    Как рекомнедация - использовать только в админке
     
  5. karpov

    karpov Продвинутый пользователь

    Сообщения:
    1.519
    Симпатии:
    241
    Почему если не секрет?
     
  6. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    потому что из фронта обращение к стороннему сервису (который может ответить , а может и не ответить.

    И понизит в попугаях
    Мало того, сам либа... А попробуйте просто обработать такой массив данных, хотя он и сжат и индекситрован..
    поэтому, здесь показан только принцип

    А в админке, можно подключать по мере необходимости