]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/location.php
Use ToSelector choice again.
[quix0rs-gnu-social.git] / lib / location.php
index cbd03f33a439164b473685d42a0c215f976db766..54e0d07acf61575fff990cf2d9f56c8123fabcc6 100644 (file)
@@ -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 <evan@status.net>
@@ -43,35 +47,183 @@ 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();
 
-    var $names;
+    /**
+     * Constructor that makes a Location from Notice::locationOptions(...)
+     *
+     * @param array $options    an array for example provided by Notice::locationOptions(...)
+     *
+     * @return Location Location with the given options (lat, lon, id, name)
+     */
+    static function fromOptions(array $options) {
+        $location = new Location();
+        foreach (['lat', 'lon', 'location_id', 'location_ns'] as $opt) {
+            if (isset($options[$opt])) {
+                $location->$opt = $options[$opt];
+            }
+        }
+        return $location;
+    }
+
+    /**
+     * 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
+
+        Event::handle('LocationFromName', array($name, $language, &$location));
+
+        return $location;
     }
 
-    static function fromId($location_id, $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($location_ns)) {
-            $location_ns = common_config('location', 'namespace');
+        if (is_null($language)) {
+            $language = common_language();
         }
+
+        $location = null;
+
+        // Let a third-party handle it
+
+        Event::handle('LocationFromId', array($id, $ns, $language, &$location));
+
+        return $location;
     }
 
+    /**
+     * 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;
+
+        // 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;
+    }
+
+    /**
+     * 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)
     {
         if (is_null($language)) {
             $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;
+    }
 }