Это пироженное какбы символизирует пирок. Т.е. CakePHP. Вы думаете оно вишнёвое? Нет, с молоком.В продолжении предыдущего поста хотел бы рассказать о том, как прикрутить геолокацию по IP-адресу к моему любимому фреймворку CakePHP.

Итак, для подключения к фреймворку воспользуемся одним из методов, который, по моему мнению, является наиболее подходящим для этой ситуации.

  1. Возьмём файлы, подготовленные в предыдущем упражнении. Я решил отправить файл базы в /app/webroot/files, а для библиотеки подготовил отдельную директорию /app/includes/
  2. В /app/controllers/components положим файл компонента:
  3. ?Download geo.php
    <?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;
    	}    
    }
    ?>
  4. Компонент готов. Подключим его к контроллеру:
  5. var $components = array(...,'Geo');
  6. Контроллер готов. Теперь в код можно добавить вызовы следущего типа:
   $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 entry was posted on Sunday, December 28th, 2008 and is filed under PHP-разработка, cakephp. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

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

free counters

Designed by Gabfire
Rambler's Top100