Fi1osof 06 апреля 2013 2 23
Для одного проекта потребовалось определение из какого города/региона пользователь. Вот написал пакет 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);


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

Основным плюсом использования именно локальной базы, а не он-лайн сервисов, можно назвать производительность. Если вы используете он-лайн сервисы, и при заходе пользователя удаленный сервис затормозит, пока мы будем пытаться получить ответ, страница для пользователя так же будет висеть. А здесь все мгновенно проходит.
23 комментария
Fi1osof1
Fi1osof 07 апреля 2013г в 00:06 #
vgrish1
vgrish 07 мая 2013г в 22:28 #
скачал, установил...
[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.

что за беда?
Fi1osof1
Fi1osof 07 мая 2013г в 23:52 #
Да, это я в примере не прописал путь к пакету. Вместо
$modx->addPackage('Geoip');

надо
$modx->addPackage('Geoip', $modx->getOption('core_path').'components/geoip/model/');
vgrish1
vgrish 08 мая 2013г в 09:19 #
был бы вам признателен за подробный пример…
единственное что мне удалось так это получить массив )
Array
(
    [0] => Array
        (
            [Geoip_id] => 11206
            [Geoip_ip_start] => -734667007
            [Geoip_ip_end] => -734666752
            [Geoip_city_index] => 2097
            [Geoip_country_index] => 1
        )

)
Fi1osof1
Fi1osof 08 мая 2013г в 09:33 #
Так вот это и есть данные, то есть пользователь успешно идентифицирован. Теперь просто добавляйте сюда связанные таблицы по айдишникам. К примеру, 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);
    }

Вот вам подробнейший пример связанных запросов.
Neolot1
Neolot 09 мая 2013г в 18:07 #
Почему нет доступа к закачке пакета?
Fi1osof1
Fi1osof 09 мая 2013г в 18:18 #
Потому что скачивания доступны полноправным членам клуба.
Neolot1
Neolot 09 мая 2013г в 18:48 #
А вот это не считается? http://community.modx-cms.ru/profile/Neolot/
Fi1osof1
Fi1osof 09 мая 2013г в 18:53 #
Нет. modx-cms.ru — это не modxclub.ru
Полноправными членами становятся по индивидуальному отбору.
Neolot1
Neolot 09 мая 2013г в 19:03 #
Хорошо, но ведь не так много разработчиков на MODX, чтобы регаться на очередном сообществе, которое захотелось создать его владельцу, да и еще набирать там карму. И тем более непонятна идея закрывать информацию, ведь это только мешает популяризации движка.
Я уважаю тебя, Николай, за толковые публикации, ты, без лести, наверное больше других пишешь о MODX. Я лично около 4 лет работаю с MODX, был почти с самого начала в сообществе modx-cms.ru, поэтому не понаслышке знаю ситуацию и могу судить.
Fi1osof1
Fi1osof 09 мая 2013г в 19:19 #
Я лично около 4 лет работаю с MODX, был почти с самого начала в сообществе modx-cms.ru
Да, регистрация действительно очень давняя… Правда активности не было на modx-cms.ru за последние полгода, но это ничего, я тоже долгое время ничего не писал.

Дал доступ. Переавторизуйся.

Карму здесь набивать не нужно. За один проект можно понять ху из ху.
И тем более непонятна идея закрывать информацию, ведь это только мешает популяризации движка.
Популяризация — не главная цель. Осмотрись по закрытым топикам — все станет ясно.
Neolot1
Neolot 09 мая 2013г в 19:21 #
Ок, спасибо
Fi1osof1
Fi1osof 10 мая 2013г в 04:41 #
Пожалуйста
M
MacHamster 15 ноября 2013г в 22:09 #
Тоже хочу стать членом клуба, как это сделать?
Fi1osof1
Fi1osof 15 ноября 2013г в 23:19 #
Проявить себя как-то. Вы уже пол-года здесь, но мы о вас ничего не знаем. Ни комментов, ни топиков-вопросов, ничего.
bazgyrt1
bazgyrt 06 ноября 2013г в 10:11 #
У меня такая потребность возникла, добавить в эту базу Казахстан, это возможно?) Даже без областей) Я пытался найти, или разобраться в базе GeoIP, но что то никак) Откуда ты брал базу? Можешь подсказать в каком направлении нужно капнуть?)
Fi1osof1
Fi1osof 06 ноября 2013г в 10:24 #
Я откуда-то взял готовую базу. Но суть в том, что GeoIP — это средства, доступные самому php в системе (конечно же, если поддуржка установлена). То есть это в принципе публичный инструмент. На уровне php можно получить информацию о любом ip. Копай лучше в этом направлении, и не будешь ограничен.
bazgyrt1
bazgyrt 06 ноября 2013г в 14:43 #
Спасибо!
Нашел БД откуда скорее всего ты брал ipgeobase.ru/cgi-bin/Archive.cgi тут есть ip всех стран)
Отсюда и буду плясать.
Fi1osof1
Fi1osof 06 ноября 2013г в 20:40 #
Вот и славно.
vgrish1
vgrish 06 ноября 2013г в 13:26 #
а кто вам мешает взять и добавить вручную?
bazgyrt1
bazgyrt 06 ноября 2013г в 14:45 #
Просто не знаю диапазонов адресов)) но я добавлю в ручную) базу надо было найти)
den991
den99 04 мая 2016г в 20:23 #
Привет Философ.

Файла нет:
Извините, страница не найдена
Fi1osof1
Fi1osof 04 мая 2016г в 20:52 #
Привет. Есть, просто доступ к репозиторию теперь платный. Формулировку в топике поменял. Вывод ошибок тоже позже поправлю.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.