]> dev.renevier.net Git - syp.git/commitdiff
rss feed
authorarno <arenevier@fdn.fr>
Sun, 26 Jul 2009 08:59:35 +0000 (10:59 +0200)
committerarno <arenevier@fdn.fr>
Sun, 26 Jul 2009 15:30:44 +0000 (17:30 +0200)
api.php
build.sh
inc/db/anydb.php
inc/db/mysql.php
inc/settings.php
inc/templates_index.php
inc/utils.php
items.php
news.php [new file with mode: 0644]

diff --git a/api.php b/api.php
index 93f27bde6bd5e658a5a0a7af32c297754abe76f0..6ed26c9712435eec3dad280935df78b5c4023c65 100644 (file)
--- a/api.php
+++ b/api.php
@@ -20,7 +20,7 @@ function success_feature ($feature, $request) {
 
     $res .= "<imgurl>" .
              ($feature->imgpath ? 
-                    full_url_from_filename ($feature->imgpath)
+                    full_url_from_imgpath ($feature->imgpath)
                     : "") .
              "</imgurl>";
 
@@ -201,7 +201,7 @@ function main ($con) {
             $description = unquote ($_POST ["description"]);
 
             try {
-                $new_feature = new feature ($id, $lon, $lat, $imgpath, $title, $description);
+                $new_feature = new feature ($id, $lon, $lat, $imgpath, $title, $description, 0);
             } catch (Exception $e) {
                 request_error ();
             }
@@ -239,7 +239,7 @@ function main ($con) {
             $title = unquote ($_POST ["title"]);
             $description = unquote ($_POST ["description"]);
             try {
-                $feature = new feature (null, $lon, $lat, $imgpath, $title, $description);
+                $feature = new feature (null, $lon, $lat, $imgpath, $title, $description, 0);
             } catch (Exception $e) {
                 request_error ();
             }
index 1d91b8080f01bbd52dcafb25e024503c7de5e22e..8224f872464707c5b492eded42c02b5099d89e85 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -15,7 +15,7 @@ mkdir -p $DESTDIR
 cp -RLp inc/ $DESTDIR/
 
 # other php files
-cp -p admin.*php index.*php wizard.*php api.php items.php logout.php $DESTDIR/
+cp -p admin.*php index.*php wizard.*php news.php api.php items.php logout.php $DESTDIR/
 
 # media
 cp -RLp media/ $DESTDIR/
index 47d9a06dc3a154b9870aa0ddfd28affc6445caee..bb80032a274eb3e4b898728f24f80c2e3c29b394 100644 (file)
@@ -9,10 +9,11 @@ class feature {
     private $imgpath = null;
     private $title = null;
     private $description = null;
+    private $date = 0;
 
     const err_lonlat_invalid = 1;
 
-    function __construct ($id, $lon, $lat, $imgpath, $title, $description) {
+    function __construct ($id, $lon, $lat, $imgpath, $title, $description, $date) {
         $this->imgpath = $imgpath;
 
         // id
@@ -26,6 +27,9 @@ class feature {
         // description
         $this->description = $description;
 
+        // date
+        $this->date = $date;
+
         // longitude
         if (!isset ($lon) || !is_numeric ($lon) ||
              ($lon < -180) || ($lon > 180)) {
@@ -118,6 +122,12 @@ interface anydbConnection {
      */
     public function listfeatures();
 
+    /*
+     * returns the most recent features sorted by date. If $num_features is not
+     * defined or is null, returns all features sorted by date.
+     */
+    public function mostrecentfeatures($num_features);
+
     /*
      * returns true if a feature with imgpath exists
      */
index 8fa49d52b68730a1a7edf980a18692e67cb06b6a..8e3fcf85394d618b97c7d1bbd4e68e8ee7abf859 100644 (file)
@@ -120,7 +120,7 @@ class mysqlConnection implements anydbConnection {
                 $id = mysql_insert_id ();
                 return new feature ($id, $feature->lon, $feature->lat,
                                     $feature->imgpath, $feature->title,
-                                    $feature->description);
+                                    $feature->description, $feature->date);
         }
     }
 
@@ -134,7 +134,8 @@ class mysqlConnection implements anydbConnection {
 
     public function getfeature ($id) {
         $query = sprintf ("SELECT id, imgpath, title, description, AsText(location)
-                           AS location FROM %sitems WHERE id = '%s';", 
+                           AS location, UNIX_TIMESTAMP(date) AS date FROM %sitems
+                           WHERE id = '%s';", 
                         $this->dbprefix, mysql_real_escape_string ($id));
         $row = mysql_fetch_assoc ($this->_execute_query ($query));
         if ($row === false) {
@@ -145,7 +146,7 @@ class mysqlConnection implements anydbConnection {
 
     public function listfeatures () {
         $query = sprintf ("SELECT id, imgpath, title, description, AsText(location)
-                            AS location FROM %sitems;",
+                            AS location, UNIX_TIMESTAMP(date) AS date FROM %sitems;",
                           $this->dbprefix);
 
         $features = array ();
@@ -159,6 +160,25 @@ class mysqlConnection implements anydbConnection {
         return $features;
     }
 
+    public function mostrecentfeatures ($num_features) {
+        $query = sprintf ("SELECT id, imgpath, title, description,
+                           AsText(location) AS location, UNIX_TIMESTAMP(date)
+                           AS date FROM %sitems ORDER BY date DESC",
+                           $this->dbprefix);
+        if ($num_features) {
+            $query .= sprintf (" LIMIT %d", $num_features);
+        }
+        $features = array ();
+        $res = $this->_execute_query ($query);
+        while ($row = mysql_fetch_assoc ($res)) {
+            $feature = $this->_feature_frow_row ($row);
+            if (isset ($feature)) {
+                $features[] = $feature;
+            }
+        }
+        return $features;
+    }
+
     public function imgpath_exists ($imgpath) {
         $query = sprintf ("SELECT COUNT(*) FROM %sitems WHERE imgpath LIKE '%s';",
                            $this->dbprefix, mysql_real_escape_string ($imgpath));
@@ -226,7 +246,8 @@ class mysqlConnection implements anydbConnection {
         $lat = $matches [2];
         try {
             $feature = new feature ($row ["id"], $lon, $lat, $row ["imgpath"],
-                                    $row ["title"], $row ["description"]);
+                                    $row ["title"], $row ["description"],
+                                    $row ["date"]);
         } catch (Exception $e) {
             return null;
         }
index 68bc142aee3799e1420a0455ec69948bca945f4b..3f3a3581d5eeb0e38960c055cfa0963c9ba9d13e 100644 (file)
@@ -24,6 +24,9 @@ define ("UPLOADDIR", "upload");
 // title of your website
 define ("SITETITLE", "SYP");
 
+// email contact for webmaster.
+define ("WEBMASTERMAIL", "");
+
 // url of images directory. If empty, syp will try to guess it from syp admin
 // location and UPLOADDIR. So, you need to set that variable if host is
 // different between syp admin and images directory. Or if protocol is
index 2d599268e7a88722f0c54b474ac9d30f24a94754..7fd2bb457744ecb3005e9446aa90760070a13bfa 100644 (file)
@@ -16,6 +16,7 @@ $bbox = $connection->mbr ();
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
     <title><?php echo defined ("SITETITLE") ? SITETITLE : "SYP"?></title>
+    <link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="news.php">
     <link rel="stylesheet" href="./openlayers/theme/default/style.css" type="text/css">
     <link rel="stylesheet" href="./media/syp.css" type="text/css">
 
index a0824c8dea4293d218717c16714a3dfecef26edf..04aeff9817cc424dc83b4060082e39bbfbbfc027 100644 (file)
@@ -4,6 +4,16 @@
 
 require_once ("inc/settings.php");
 
+function gethost() {
+    $host = $_SERVER ["HTTP_HOST"];
+    $colpos = strpos ($host, ':');
+    // some web clients add port informations in Host header
+    if ($colpos !== false) {
+        $host = substr ($host, 0, $colpos);
+    }
+    return $host;
+}
+
 function unquote($gpc_str) {
    if (!isset ($gpc_str)) {
        return $gpc_str;
@@ -15,13 +25,19 @@ function unquote($gpc_str) {
    }
 }
 
-function full_url_from_filename ($filename) {
+function full_url_from_imgpath ($filename) {
     if (defined ("IMGSDIRURL") && (strlen (IMGSDIRURL) != 0)) {
         return rtrim (IMGSDIRURL, '/') . "/" . rawurlencode ($filename);
     }
 
     $rel_path = UPLOADDIR . "/" . rawurlencode ($filename);
 
+    return full_url_from_path (UPLOADDIR . "/" . rawurlencode ($filename));
+}
+
+function full_url_from_path ($path) {
+    $rel_path = $path;
+
     while (substr($rel_path, 0, 2) == "./") { // strips ./
         $rel_path = substr ($rel_path, 2);
     }
@@ -44,7 +60,7 @@ function full_url_from_filename ($filename) {
         $path = "$script_dir/$rel_path";
     }
 
-    $host = $_SERVER ["HTTP_HOST"];
+    $host = gethost();
     $port = $_SERVER ["SERVER_PORT"];
     if ($_SERVER ["HTTPS"] == "on") {
         $proto = "https";
@@ -61,5 +77,4 @@ function full_url_from_filename ($filename) {
 
     return "$proto://$host$port$path";
 }
-
 ?>
index 3efed088d44e5138c7ebd9f3eb3467ef877c6206..af0192f5ef61bdedd76a9c75876a4fbcd6cb5c61 100644 (file)
--- a/items.php
+++ b/items.php
@@ -23,7 +23,7 @@ function main ($features) {
         $title = htmlspecialchars ($feature->title, ENT_QUOTES);
         $description = htmlspecialchars ($feature->description, ENT_QUOTES);
         $imgurl = ($feature->imgpath ? 
-                    full_url_from_filename ($feature->imgpath)
+                    full_url_from_imgpath ($feature->imgpath)
                     : "");
         $lon = $feature->lon;
         $lat = $feature->lat;
diff --git a/news.php b/news.php
new file mode 100644 (file)
index 0000000..615989f
--- /dev/null
+++ b/news.php
@@ -0,0 +1,111 @@
+<?php
+/* Copyright (c) 2009 Arnaud Renevier, Inc, published under the modified BSD
+   license. */
+
+require_once ("./inc/settings.php");
+require_once ("./inc/db/mysql.php");
+require_once ("./inc/utils.php");
+
+header ("Content-type: application/atom+xml; charset=UTF-8");
+header("Cache-control: no-cache");
+
+function date3339 ($feature) {
+    $date = date ('Y-m-d\TH:i:s', $feature->date);
+
+    $matches = array();
+    if (preg_match ('/^([\-+])(\d{2})(\d{2})$/',
+                    date ('O', $feature->date), $matches)) {
+        $date .= $matches [1] . $matches [2] . ':' . $matches [3];
+    } else {
+        $date .= 'Z';
+    }
+    return $date;
+}
+
+function unique_id_from_feature ($feature) {
+    // method from http://diveintomark.org/archives/2004/05/28/howto-atom-id#other
+    $date = date('Y-m-d', $feature->date);
+    $res = sprintf("tag:%s,%s:%d", gethost(), $date, $feature->id);
+    return $res;
+}
+
+function unique_id_from_site () {
+    $id = md5 (full_url_from_path (""));
+    $res = sprintf("tag:%s,1970-01-01:%d", gethost, $id);
+    return $res;
+}
+
+function main ($features) {
+    print "<?xml version=\"1.0\" encoding=\"utf-8\"?>
+<feed xmlns=\"http://www.w3.org/2005/Atom\"
+      xmlns:georss=\"http://www.georss.org/georss\">\n";
+
+    printf("  <link rel=\"alternate\" type=\"text/html\" href=\"%s\"/>\n",
+            full_url_from_path (""));
+    printf("  <link rel=\"self\" href=\"%s\" type=\"application/atom+xml\"/>\n",
+            full_url_from_path (basename ($_SERVER ["PHP_SELF"])));
+    printf("  <id>%s</id>\n", unique_id_from_site());
+
+    if (count ($features) > 0) {
+        printf("  <updated>%s</updated>\n", date3339 ($features[0]));
+    }
+
+    if (SITETITLE) {
+        printf ("  <title>%s</title>\n", SITETITLE);
+    }
+
+    if (WEBMASTERMAIL) {
+        printf ("  <author>\n");
+        printf ("    <email>%s</email>\n", WEBMASTERMAIL);
+        printf("   </author>\n");
+    }
+
+    print "\n";
+
+    foreach ($features as $feature) {
+        print ("    <entry>\n");
+
+        if ($feature->title) {
+            $title = htmlspecialchars ($feature->title, ENT_QUOTES);
+        } else {
+            $title = $feature->id;
+        }
+        printf ("      <title>%s</title>\n", $title);
+
+        $rel_url = sprintf ("index.php?lat=%.18F&lon=%.18F&zoom=12",
+                                         $feature->lat, $feature->lon);
+        $link = htmlspecialchars (full_url_from_path ($rel_url), ENT_QUOTES);
+        printf ("      <link rel=\"alternate\" type=\"text/html\" href=\"%s\"/>\n", $link);
+
+        printf ("      <id>%s</id>\n", unique_id_from_feature ($feature));
+
+        printf ("      <updated>%s</updated>\n", date3339 ($feature));
+
+        if ($feature->description) {
+            $contentHTML = sprintf ("<p>%s</p>", htmlspecialchars ($feature->description, ENT_QUOTES));
+        } else {
+            $contentHTML = sprintf ("<p>%s</p>", htmlspecialchars ($feature->title, ENT_QUOTES));
+        }
+
+        if (strlen ($contentHTML) != 0) {
+            printf("       <content type=\"html\">
+                %s
+       </content>\n", htmlspecialchars ($contentHTML));
+        }
+
+        printf("      <georss:point>%.18F %.18F</georss:point>\n",
+                    $feature->lat, $feature->lon);
+
+        printf("    </entry>\n\n");
+    }
+    print '</feed>';
+}
+
+try {
+    $connection->connect (DBHOST, DBUSER, DBPWD, DBNAME, DBPREFIX);
+    $features = $connection->mostrecentfeatures (10);
+} catch (Exception $e) {
+    exit ("server error");
+}
+main ($features);
+?>