В продолжении предыдущего поста хотел бы рассказать о том, как прикрутить геолокацию по 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.


Leave a Reply