X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Flocation.php;h=191550d6d6ca53e213f4a13f3b6b8bd2fc763a65;hb=ca3b2d614a0f7340ee5e83687be1951020c5aafa;hp=f4ce7f67ac74138bb112502b2a77f5d11836839c;hpb=7b227fd1c06ff6f3ba078b73348dd02419d44e38;p=quix0rs-gnu-social.git diff --git a/lib/location.php b/lib/location.php index f4ce7f67ac..191550d6d6 100644 --- a/lib/location.php +++ b/lib/location.php @@ -34,6 +34,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { /** * class for locations * + * These are stored in the DB as part of notice and profile records, + * but since they're about the same in both, we have a separate class + * for them. + * * @category Location * @package StatusNet * @author Evan Prodromou @@ -43,78 +47,104 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { class Location { - public $lat; - public $lon; - public $location_id; - public $location_ns; + public $lat; + public $lon; + public $location_id; + public $location_ns; + private $_url; + private $_rdfurl; + + var $names = array(); + + /** + * Constructor that makes a Location from a string name + * + * @param string $name Human-readable name (any kind) + * @param string $language Language, default = common_language() + * + * @return Location Location with that name (or null if not found) + */ + + static function fromName($name, $language=null) + { + if (is_null($language)) { + $language = common_language(); + } + + $location = null; + + // Let a third-party handle it - var $names; + Event::handle('LocationFromName', array($name, $language, &$location)); - const geonames = 1; - const whereOnEarth = 2; + return $location; + } - static function fromName($name, $language=null, $location_ns=null) + /** + * Constructor that makes a Location from an ID + * + * @param integer $id Identifier ID + * @param integer $ns Namespace of the identifier + * @param string $language Language to return name in (default is common) + * + * @return Location The location with this ID (or null if none) + */ + + static function fromId($id, $ns, $language=null) { if (is_null($language)) { $language = common_language(); } - if (is_null($location_ns)) { - $location_ns = common_config('location', 'namespace'); - } $location = null; - if (Event::handle('LocationFromName', array($name, $language, $location_ns, &$location))) { + // Let a third-party handle it - switch ($location_ns) { - case Location::geonames: - return Location::fromGeonamesName($name, $language); - break; - case Location::whereOnEarth: - return Location::fromWhereOnEarthName($name, $language); - break; - } - } + Event::handle('LocationFromId', array($id, $ns, $language, &$location)); return $location; } - static function fromGeonamesName($name, $language) + /** + * Constructor that finds the nearest location to a lat/lon pair + * + * @param float $lat Latitude + * @param float $lon Longitude + * @param string $language Language for results, default = current + * + * @return Location the location found, or null if none found + */ + + static function fromLatLon($lat, $lon, $language=null) { + if (is_null($language)) { + $language = common_language(); + } + $location = null; - $client = HTTPClient::start(); - - // XXX: break down a name by commas, narrow by each - - $str = http_build_query(array('maxRows' => 1, - 'q' => $name, - 'lang' => $language, - 'type' => 'json')); - - $result = $client->get('http://ws.geonames.org/search?'.$str); - - if ($result->code == "200") { - $rj = json_decode($result->body); - if (count($rj['geonames']) > 0) { - $n = $rj['geonames'][0]; - $location = new Location(); - $location->lat = $n->lat; - $location->lon = $n->lon; - $location->name = $n->name; - $location->location_id = $n->geonameId; - $location->location_ns = Location:geonames; - } + + // Let a third-party handle it + + if (Event::handle('LocationFromLatLon', + array($lat, $lon, $language, &$location))) { + // Default is just the lat/lon pair + + $location = new Location(); + + $location->lat = $lat; + $location->lon = $lon; } return $location; } - static function fromId($location_id, $location_ns = null) - { - if (is_null($location_ns)) { - $location_ns = common_config('location', 'namespace'); - } - } + /** + * Get the name for this location in the given language + * + * @param string $language language to use, default = current + * + * @return string location name or null if not found + */ function getName($language=null) { @@ -122,8 +152,61 @@ class Location $language = common_language(); } - if (array_key_exists($this->names, $language)) { + if (array_key_exists($language, $this->names)) { return $this->names[$language]; + } else { + $name = null; + Event::handle('LocationNameLanguage', array($this, $language, &$name)); + if (!empty($name)) { + $this->names[$language] = $name; + return $name; + } + } + } + + /** + * Get an URL suitable for this location + * + * @return string URL for this location or NULL + */ + + function getURL() + { + // Keep one cached + + if (is_string($this->_url)) { + return $this->_url; } + + $url = null; + + Event::handle('LocationUrl', array($this, &$url)); + + $this->_url = $url; + + return $url; + } + + /** + * Get an URL for this location, suitable for embedding in RDF + * + * @return string URL for this location or NULL + */ + + function getRdfURL() + { + // Keep one cached + + if (is_string($this->_rdfurl)) { + return $this->_rdfurl; + } + + $url = null; + + Event::handle('LocationRdfUrl', array($this, &$url)); + + $this->_rdfurl = $url; + + return $url; } }