Николай Ланец
6 апр. 2013 г., 18:10

Пакет Geoip для определения местоположения пользователей по ip

Для одного проекта потребовалось определение из какого города/региона пользователь. Вот написал пакет Geoip. Просто качаете пакет из нашего репозитория, заливаете его на сайт в папку core/packages/ и устанавливаете локально.
Использование:
// Подключаем пакет $modx->addPackage('Geoip', $modx->getOption('core_path').'components/geoip/model/'); // Подгружаем основной класс (он содержит нужные нам статические методы) $modx->loadClass('Geoip'); // Быстрый метод получить информацию о расположении // Возвращает объект Geoip с полной информацией, // включая город, регион, область, широта/долгота и т.п. $location = Geoip::findByIp($modx); // Или формируем xPDOCriteria для более гибких запросов $query = Geoip::newQuery($modx);
Пока что база только России и Украины, но в дальнейшем можно развить ее.
Основным плюсом использования именно локальной базы, а не он-лайн сервисов, можно назвать производительность. Если вы используете он-лайн сервисы, и при заходе пользователя удаленный сервис затормозит, пока мы будем пытаться получить ответ, страница для пользователя так же будет висеть. А здесь все мгновенно проходит.
скачал, установил...
[2013-05-07 13:26:37] (ERROR @ /index.php) Invalid path specified for package: Geoip; using default xpdo model path: /paas/c0100/www/core/xpdo/om/ [2013-05-07 13:26:37] (ERROR @ /index.php) Could not load class: Geoip from mysql.geoip.
что за беда?
Да, это я в примере не прописал путь к пакету. Вместо
$modx->addPackage('Geoip');
надо
$modx->addPackage('Geoip', $modx->getOption('core_path').'components/geoip/model/');
был бы вам признателен за подробный пример… единственное что мне удалось так это получить массив )
Array ( [0] => Array ( [Geoip_id] => 11206 [Geoip_ip_start] => -734667007 [Geoip_ip_end] => -734666752 [Geoip_city_index] => 2097 [Geoip_country_index] => 1 ) )
Так вот это и есть данные, то есть пользователь успешно идентифицирован. Теперь просто добавляйте сюда связанные таблицы по айдишникам. К примеру, Geoip_country_index — это индекс страны. В данном случае 1. Смотрите в таблице стран. А Geoip_city_index в таблице городов. Кстати, судя по всему вы использовали запрос через $query. Но $location = Geoip::findByIp($modx); возвращает уже более подробную информацию. Посмотрите код в geoip.class.php, там же все расписано. К примеру этот метод:
public static function findByIp(xPDO $xpdo, $ip = 'auto'){ if(!$c = self::newQuery($xpdo, $ip)){ return false; } $c->leftJoin('GeoipLocation', 'Location'); $c->leftJoin('GeoipCountry', 'Country'); $c->select(array( "Country.*", "Location.*", "Geoip.*", "ip_end-ip_start as distance", )); $c->sortby('distance'); $c->limit(1); return $xpdo->getObject("Geoip", $c); }
Вот вам подробнейший пример связанных запросов.
Почему нет доступа к закачке пакета?
Потому что скачивания доступны полноправным членам клуба.
Нет. modx-cms.ru — это не modxclub.ru Полноправными членами становятся по индивидуальному отбору.
Хорошо, но ведь не так много разработчиков на MODX, чтобы регаться на очередном сообществе, которое захотелось создать его владельцу, да и еще набирать там карму. И тем более непонятна идея закрывать информацию, ведь это только мешает популяризации движка. Я уважаю тебя, Николай, за толковые публикации, ты, без лести, наверное больше других пишешь о MODX. Я лично около 4 лет работаю с MODX, был почти с самого начала в сообществе modx-cms.ru, поэтому не понаслышке знаю ситуацию и могу судить.
Я лично около 4 лет работаю с MODX, был почти с самого начала в сообществе modx-cms.ru
Да, регистрация действительно очень давняя… Правда активности не было на modx-cms.ru за последние полгода, но это ничего, я тоже долгое время ничего не писал.
Дал доступ. Переавторизуйся.
Карму здесь набивать не нужно. За один проект можно понять ху из ху.
И тем более непонятна идея закрывать информацию, ведь это только мешает популяризации движка.
Популяризация — не главная цель. Осмотрись по закрытым топикам — все станет ясно.
Ок, спасибо
У меня такая потребность возникла, добавить в эту базу Казахстан, это возможно?) Даже без областей) Я пытался найти, или разобраться в базе GeoIP, но что то никак) Откуда ты брал базу? Можешь подсказать в каком направлении нужно капнуть?)
Я откуда-то взял готовую базу. Но суть в том, что GeoIP — это средства, доступные самому php в системе (конечно же, если поддуржка установлена). То есть это в принципе публичный инструмент. На уровне php можно получить информацию о любом ip. Копай лучше в этом направлении, и не будешь ограничен.
а кто вам мешает взять и добавить вручную? ?
Спасибо! Нашел БД откуда скорее всего ты брал ipgeobase.ru/cgi-bin/Archive.cgi тут есть ip всех стран) Отсюда и буду плясать.
Просто не знаю диапазонов адресов)) но я добавлю в ручную) базу надо было найти)
Тоже хочу стать членом клуба, как это сделать?
Проявить себя как-то. Вы уже пол-года здесь, но мы о вас ничего не знаем. Ни комментов, ни топиков-вопросов, ничего.
Привет Философ.
Файла нет: Извините, страница не найдена
Привет. Есть, просто доступ к репозиторию теперь платный. Формулировку в топике поменял. Вывод ошибок тоже позже поправлю.

Добавить комментарий