Пакет 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);

Пока что база только России и Украины, но в дальнейшем можно развить ее.

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

Comments

скачал, установил...

[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. Копай лучше в этом направлении, и не будешь ограничен.

а кто вам мешает взять и добавить вручную? ?

Просто не знаю диапазонов адресов)) но я добавлю в ручную) базу надо было найти)

Проявить себя как-то. Вы уже пол-года здесь, но мы о вас ничего не знаем. Ни комментов, ни топиков-вопросов, ничего.

Привет. Есть, просто доступ к репозиторию теперь платный. Формулировку в топике поменял. Вывод ошибок тоже позже поправлю.