В продолжении предыдущего поста хотел бы рассказать о том, как прикрутить геолокацию по IP-адресу к моему любимому фреймворку CakePHP.
Итак, для подключения к фреймворку воспользуемся одним из методов, который, по моему мнению, является наиболее подходящим для этой ситуации.
- Возьмём файлы, подготовленные в предыдущем упражнении. Я решил отправить файл базы в /app/webroot/files, а для библиотеки подготовил отдельную директорию /app/includes/
- В /app/controllers/components положим файл компонента:
- Компонент готов. Подключим его к контроллеру:
- Контроллер готов. Теперь в код можно добавить вызовы следущего типа:
<?php include("../includes/geoipcity.inc"); class GeoComponent extends Object { var $controller = true; var $record = null; function startup(&$controller) { // This method takes a reference to the controller which is loading it. // Perform controller initialization here. } function lookup($ip=null) { if (!$ip) return -1; $gi = geoip_open("files/GeoLiteCity.dat",GEOIP_STANDARD); $this->record = GeoIP_record_by_addr($gi,$_SERVER['REMOTE_ADDR']); geoip_close($gi); return $this->record; } function getCountry($ip=null){ if ($ip!=null) $this->lookup($ip); if ($this->record == null) return false; return $this->record->country_name; } function getCity($ip=null){ if ($ip!=null) $this->lookup($ip); if ($this->record == null) return false; return $this->record->city; } function getCountryCode($ip=null){ if ($ip!=null) $this->lookup($ip); if ($this->record == null) return false; return $this->record->country_code; } function getCountryCode3($ip=null){ if ($ip!=null) $this->lookup($ip); if ($this->record == null) return false; return $this->record->country_code3; } } ?> |
var $components = array(...,'Geo'); |
$this->Geo->getCity($_SERVER['REMOTE_ADDR']); $this->Geo->getCountry($address); $this->Geo->lookup($_SERVER['REMOTE_ADDR']); $city = $this->Geo->getCity(); |
Можно вызвать метод lookup($address), и тогда последущие вызовы getCity и т.д. (при вызове без параметра) не будут обращаться к базе. А если вам нужны быстрые одноразовые вызовы, используйте синтаксис getCity($address).
Вот список всех методов:
- Geo->lookup($address) – ищет адрес в базе. Возвращает объект типа geoiprecord, и сохраняет его внутри, для последущих вызовов методов.
- Geo->getCity($address) – возвращает город связанный с заданным адресом
- Geo->getCountry($address) – возвращает страну связанную с заданным адресом
- Geo->getCountryCode($address) – возвращает страну связанную с заданным адресом в двухбуквенном формате. К примеру UA.
- Geo->getCountryCode3($address) – возвращает страну связанную с заданным адресом в трёхбуквенном формате. К примеру UKR.
Если вам нужны остальные параметры адреса, воспользуйтесь объектом geoiprecord.


This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.
Leave a Reply