Автоопределение города пользователя на основе GeoIP - версия 2.0

#
Автоопределение города пользователя на основе GeoIP - версия 2.0
Предлагаю вашему вниманию обновленную версия дополнения для HostCMS, для определения региона пользователя с помощью GeoIP-сервиса ipgeobase.ru.

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

Ключевые отличия второй версии от первой:


  • Полностью переписан класс для работы с сервисом ipgeobase.ru
  • Реализована поддержка нового XML-PRC сервиса, работающего с GET-запросами (подробнее см. в новостях сервиса ipgeopbase.ru)
  • База данных сервиса проанализирована на предмет соответствия справочнику городов и регионов в HostCMS. Повышена точность определения города - ранее, если города с одинаковыми названиями встречались в различных регионах, то в ряде случаев в форме адреса подставлялся город не из того региона, в котором находится пользователь, а из одноименного города в другом регионе. Теперь эта ошибка исключена.
  • Изменен формат результата, возвращаемого классом при определении. В 1й версии класс возвращал название города в виде строки, либо false. Во 2й версии класс возвращает массив идентификаторов города, региона и области, либо false. Массив содержит элементы city, location и country, хранящие идентификаторы города, региона и страны по справочнику HostCMS соответствнно.


Установка и использование

Код класса приведен в файле geoip2.class.php который необходимо разместить в папке /modules/ системы.

Класс подключается в коде ТДС "Интернет-магазин Корзина". Необходимо найти фрагмент, в котором вызывается метод ShowAddress() и заменить его вызов следующим кодом:

        /** Kotoff - Здесь начинается вставка кода для GeoIP v2 **/

        // Определяем город пользователя

        // подключим файл класса
        @include_once (CMS_FOLDER . 'modules/geoip2.class.php');
        
        if(class_exists('GeoIp'))
        {
            // создадим экземпляр объекта GeoIp
            $geoIp = new GeoIp;
    
            // Определим IP пользователя
            $user_ip = ($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : getenv("HTTP_X_FORWARDED_FOR");
    
            // определим город, регион и страну по IP-адресу
            // метод возвращает массив или false
            $geoData = $geoIp->GetLocation($user_ip);
        }

        if (isset($geoData) && is_array($geoData)) {
            // если удалось определить город пользователя,
            // то передадим его город, область и страну в XML
            $external_propertys['city_id'] = $geoData['city'];
            $external_propertys['location_id'] = $geoData['location'];
            $external_propertys['country_id'] = $geoData['country'];
            // включим передачу в XML информацию обо всех странах, регионах, городах
            $show = true;
        } else {
            // Не выбираем show_location, show_city и show_city_area, т.к. подгружаются через AJAX
            $show = false;
        }

        /* Отображаем форму ввода адреса */
        $shop->ShowAddress(to_str($GLOBALS['LA']['xsl_delivery_address']), $shop_id,
            array('show_location' => $show, 'show_city' => $show, 'show_city_area' => $show),
            $external_propertys);

        /** Kotoff - Здесь заканчивается вставка кода для GeoIP v2 **/

Файл kod_TDS_Internet-Magazin_Korzina.php представляет собой код ТДС "Интернет-магазин Корзина" от HostCMS версии 5.9.32 со вставленным кодом для определения города пользователя по GeoIP. Вы можете воспользоваться этим файлом.

Теперь необходимо обновить XSL-шаблон, отображающий форму ввода адреса доставки. В файле MagazinAdresDostavki.xsl содержится доработанный код XSL-шаблона "МагазинАдресДоставки", основанный на одноименном стандартном шаблоне от HostCMS версии 5.9.32

XSL-шаблон для новой версии GeoIP-дополнения не изменился, и если вы ранее использовали первую версию модуля, то вам нет необходимости обновлять XSL-шаблон или вносить в него какие-либо изменения.

После этого вы можете тестировать определение города. При правильной работе модуля, в момент отображения формы для ввода адреса доставки, в выпадающих списках автоматически будут выбраны страна, регион и город пользователя.

О точности определения

Точность определения города не зависит ни от работы модуля, ни от его автора. Вся информация о соответствии города и IP-адреса пользователя предоставляется сервисом ipgeobase.ru и если ваш город определяется неверно, то вам следует обратиться в службу поддержки этого сервиса.

Где взять?

Репозитарий новой версии дополнения размещен по адресу https://bitbucket.org/JamesKotov/geoip-v2-for-hostcms-v5/ там можно всегда скачать архив с последней версией, следить за изменениями и выходами апдейтов, а в разделе wiki можно прочитать самую последнюю версию инструкции по установке.

Желаю всем точных определений!
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Kotoff,
Большое спасибо!
Но у меня почему-то выдает вот такие Предупреждения:
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : switching encoding: encoder error в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ?ваново</city><region>Ивановская область</region><distric в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ^ в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Blank needed here в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ?ваново</city><region>Ивановская область</region><distric в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ^ в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : parsing XML declaration: '?>' expected в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ?ваново</city><region>Ивановская область</region><distric в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ^ в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: input conversion failed due to input error, bytes 0x98 0xD0 0xB2 0xD0 в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: encoder errorEntity: line 1: parser error : Premature end of data in tag district line 1 в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: 28.0 - 109.60.255.255</inetnum><country>RU</country><city>Р в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)
Предупреждение: simplexml_load_string() [function.simplexml-load-string]: ^ в файле mysite/public_html/modules/Kernel/Kernel.class.php (строка 5121)


И автоматом поля не заполняются.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
KorSa, постучитесь в аську с доступами, у себя на тестовой площадке воссоздать проблему я не смог.
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Ошибка исправлена, файл geoip2.class.php в репозитарии обновлен.
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Уважаемые коллеги, по вопросам GeoIP продолжаем общение в этой теме!

Старая версия модуля, описанная в другом топике, более мною не поддерживается.
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Ну что-ж, в этой так в этой.
Отвечаю на ваш вопрос, определение на сайте работает для моего ИПа. Да и предыдущая версия работала отменно!
Эта же по какой-то причине не работает вовсе. И города не подставляет и ошибок не сыпет.
Куда чего можно дополнительно прописать, что бы посмотреть по шагам где затык?
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
hosttelecom писал(а):
Куда чего можно дополнительно прописать, что бы посмотреть по шагам где затык?
Можно прописать мне в аську ссылку на сайт доступы в админку и к ftp, я посмотрю что у вас там происходит.
Только скорее всего уже не сегодня, до конца рабдня уже не успею, а вечером - праздник все-таки )
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Доброе время суток. Как бы привязать эту плюшку для определения города при заходе посетителя на сайт...ситуация такая...есть два сайта 100-pechey.ru и krasnodar.100-pechey.ru, но они находятся на разных движках....те в отдельных системах...и допустим если заходят люди с центрального и южных регионов страны их переадресовало на краснодарский сайт, а клиенты которые с урала, сибири и хмао попадали бы на основной сайт....?
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
stoun, в данном случае технически это будет гибрид из двух решений - GeoIP и Массовый 301й редирект (http://www.hostcms.ru/forums/22/4153/).

Вам нужно зароутить все входящие запросы на файл redirecter.php вместо index.php (как это сделать рассказано в теме по ссылке), а в самом redirecter.php вместо определения текущего url и поиска его по базе, сделать определение текущего региона, и в зависимости от него продолжать открытие текущего сайта или делать 307й редирект на другой сайт.
Очень желательно при этом, закешировать результат определения в куках или в сессии, иначе определение будет происходить для каждой открываемой страницы, и при большой посещаемости ваших сайтов Сервис ipgeobase.ru может забанить вас за создание высокой нагрузки.
Заказов не беру. Консультирую редко.
#
Re: Автоопределение города пользователя на основе GeoIP - версия 2.0
Kotoff,
А как возможно сделать используя GeoIP вывод остатков товара и цен для региона пользователя?
Авторизация