Mostrando o potencial da JS Calls PHP #5 – geolocalização

Fazia muito tempo que não postava nada sobre a JS Calls PHP – muito trabalho, pouco tempo livre… coisas da vida.

Aproveitei um tempinho livre nesse sábado para integrar uma classe que vi de geolocalização com a biblioteca, possibilitando que sejam retornados dados como cidade e estado relativos a um IP via javascript, requisitando assincronamente uma classe PHP.

Veja aqui uma página de exemplo!

A classe original pode ser baixada aqui, só tive que fazer algumas modificações na mesma, conforme o código abaixo:

<?php
include 'PHP45.XML.php';

class GeoLocalizacao {
// XML document
var $doc  = null;
// string describing the host of the geo location service
var $host = "http://api.hostip.info/?ip=<IP>";

// string describing the city
public $city      = 'unknown';
// string describing the country
public $country   = 'unknown';
// longitude
public $longitude = '0';
// latitude
public $latitude  = '0';

public function __construct() {

}

public function geoLocation($ip) {

$this->doc = new PHP45XML();
$this->doc->preserveWhiteSpace = false;

// prepare url of service
$host  = str_replace( "<IP>", $ip, $this->host);

$reply = $this->fetch($host);

// decode the reply and make it available
//echo $reply;
//return false;
$this->decode($reply);
return array("city"=>$this->city, "country"=>$this->country, "lng"=>$this->longitute, "lat"=>$this->latitude);
}

function fetch($host) {
$reply = 'error';
// try curl or fopen
if( function_exists('curl_init') ) {
// use curl too fetch site
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL           , $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$reply = curl_exec($ch);
curl_close ($ch);
} else {
// fall back on fopen
$reply = file_get_contents($host, 'r');
}
return $reply;
}

function decode($text) {
// load in php version independent manner
$this->doc->loadXML($text);
// use the PHP4/5 XML wrapper to decode the result
$result = $this->doc->xpath("//gml:name");

$this->city      = $result['city'];

$this->country   = $result['country'];
$this->longitude = $result['lng'];
$this->latitude  = $result['lat'];
}
}
?>

Essa classe utiliza a API do site http://api.hostip.info, que passando um endereço IP retorna um XML com as informações. A classe trata esses dados e retorna um array com as chaves/valores para cidade, estado, longitude e latitude.

Depois de expor essa classe no config.php (conforme explicado na documentação oficial) sob o nome geo, o único trabalho foi fazer um html que chama o método geoLocation passando o valor de um input como parâmetro, e no retorno dou um alert exibindo a cidade e o estado.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>IP</title>
<script type="text/javascript" src="../engine.js"></script>
<script type="application/javascript" src="../interface/geo.js"></script>
<script type="application/javascript">
window.onload = function() {
document.getElementById("submit").onclick = function() {

var ip = document.getElementById("ip").value;

geo.geoLocation(ip, function(myIp) {
alert("cidade: " + myIp.city + "\npaís: " + myIp.country);
})

}
}
</script>
</head>
<body>

Digite um endereço de IP para ver qual a cidade e país de origem:
<input type="text" name="ip" id="ip" />
<input type="button" value="checar" id="submit" />
</body>
</html>

Funcionamento simples, como sempre, com a JS Calls PHP!

Faça download da JS Calls PHP aqui

3 thoughts on “Mostrando o potencial da JS Calls PHP #5 – geolocalização

  1. Chris Post author

    Alex, eu testei com os IPs do UOL (200.221.2.45) e do Terra (200.176.3.142) e funcionou certinho; pro UOL deu São Paulo/Brazil, pro Terra de Porto Alegre/Brazil

    Testei agora com o do Google (66.102.1.103) e deu Mountain View,CA/USA

    Mas, assim, não posso afirmar que a classe PHP em si está funcionando totalmente, pois como falei no post ela é de terceiros e usa uma outra API; o que quis mostrar, no exemplo, é a integração da JS Calls PHP com classes de terceiros!

    []s!

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>