I fixed your issue, but I think it would have been faster if you could have given me effective line numbers or corresponding line content.
Was not correct...
Code:
<?php
/**
* @version Geommunity geocoder.php v1.0
* @author 2010/02/10 Adrien ROUSSEL
* http://geommunity.nordmograph.com
* Inspired by lanari and David Pollack
* @package joomla! community builder
* @subpackage Geommunity Geocoder
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
// ensure this file is being included by a parent file
if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) {
die( 'Direct Access to this location is not allowed.' );
}
// register geocoder function
$_PLUGINS->registerFunction('onBeforeNewUser', 'geocodeAddress', 'geommunitygeocoder');
$_PLUGINS->registerFunction('onBeforeUserUpdate', 'geocodeAddress', 'geommunitygeocoder');
$_PLUGINS->registerFunction('onBeforeUserRegistration', 'geocodeAddress', 'geommunitygeocoder');
class geocoder {
var $address = null;
var $city = null;
var $state = null;
var $country = null;
var $zipcode = null;
var $latitude = null;
var $longitude = null;
function geocoder($geoData, $address='address', $city='city', $state='state', $country='country', $zipcode='zipcode') {
$this->address = $geoData->$address;
$this->city = $geoData->$city;
$this->state = $geoData->$state;
$this->country = $geoData->$country;
$this->zipcode = $geoData->$zipcode;
return true;
}
function geocodeAddress($option) {
global $database;
$query = trim($this->address).','.trim($this->city).','.trim($this->state).','.trim($this->zipcode).','.trim($this->country);
$query = preg_replace('/^,|,$/', '', preg_replace('/(,)*/', '$1', $query));
$query = utf8_decode($query);
$query = urlencode($query);
$result = $this->googleGeocode($query);
$lat = $result['lat'];
$lng = $result['lng'];
if ($lat == false && $lng == false) {
$result = $this->yahooGeocode($query);
$lat = $result['lat'];
$lng = $result['lng'];
}
$this->longitude = $lng ? $lng : $this->longitude;
$this->latitude = $lat ? $lat : $this->latitude;
return true;
}
function googleGeocode($query) {
$query = $this->sendGeoQuery('http://maps.google.com/maps/geo?output=csv&q='. $query);
list($status, $accuracy, $lat, $lng) = explode(',', $query .',,,');
if ($lat == 0 && $lng == 0) $lat = $lng = '';
$result['lat'] = $lat;
$result['lng'] = $lng;
return $result;
}
function yahooGeocode($query) {
$query = $this->sendGeoQuery('http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location='. $query);
$query = trim(preg_replace('/(\s*<.*?>\s*)+/', ',', $query), ',');
list($lat, $lng) = explode(',', $query .',,,');
$result['lat'] = $lat;
$result['lng'] = $lng;
return $result;
}
function sendGeoQuery($url=null, $content=null) {
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
$content = curl_exec($ch);
curl_close($ch);
} elseif (ini_get('allow_url_fopen')) {
$timeout = ini_set('default_socket_timeout', 30);
$fp = @fopen($url, 'r');
$content = @fread($fp, 4096);
@fclose($fp);
}
return $content;
}
}
class geommunitygeocoder extends cbTabHandler {
function geocodeAddress($user,$cbUser) {
$params = $this->params;
$mode = $params->get('mode',0);
$place = new geocoder($cbUser, $params->get('geoAddress','cb_address'), $params->get('geoCity','cb_city'), $params->get('geoState','cb_state'), $params->get('geoCountry','cb_country'), $params->get('geoZipcode','cb_zipcode') , $lat='geoLat', $lng='geoLng');
$place->geocodeAddress('Geommunity Geocoder');
if ( $mode==1 && ($cbUser->$lat == '' || $cbUser->$lng == '') ) { // on profile update and a missing coordinate
$cbUser->$lat = $place->latitude ? $place->latitude : $cbUser->$lat;
$cbUser->$lng = $place->longitude ? $place->longitude : $cbUser->$lng;
}
elseif( $mode==0 ){ // every profile update
$cbUser->$lat = $place->latitude ? $place->latitude : $cbUser->$lat;
$cbUser->$lng = $place->longitude ? $place->longitude : $cbUser->$lng;
}
}
}
?>