]> git.mjollnir.org Git - moodle.git/commitdiff
RSS for forums now checks the new posts against the file modification date,
authormoodler <moodler>
Thu, 5 Aug 2004 18:06:55 +0000 (18:06 +0000)
committermoodler <moodler>
Thu, 5 Aug 2004 18:06:55 +0000 (18:06 +0000)
and doesn't regenerate the RSS file if it doesn't need to.

Much faster now.   :-)

mod/forum/rsslib.php
rss/rsslib.php

index fd4bc4b5a61ab6c7dbf4a641e0e81066bb20495c..d17fd857b169fc56aac69330b7587d8b6f2c414b 100644 (file)
             if ($forums = get_records("forum")) {
                 foreach ($forums as $forum) {
                     if (!empty($forum->rsstype) && !empty($forum->rssarticles) && $status) {
+
+                        $filename = rss_file_name('forum', $forum);  // RSS file
+
+                        //First let's make sure there is work to do by checking existing files
+                        if (file_exists($filename)) {
+                            if ($lastmodified = filemtime($filename)) {
+                                if (!forum_rss_newstuff($forum, $lastmodified)) {
+                                    continue;
+                                }
+                            }
+                        }
+
+                        //Ignore hidden forums
+                        if (!instance_is_visible('forum',$forum)) {
+                            if (file_exists($filename)) {
+                                @unlink($filename);
+                            }
+                            continue;
+                        }
+
+                        mtrace("Updating RSS feed for $forum->name, ID: $forum->id");
+
                         //Some debug...
                         if ($CFG->debug > 7) {
                             echo "ID: $forum->id->";
         return $status;
     }
 
+    function forum_rss_newstuff($forum, $time) {
+    // If there is new stuff in the forum since $time then this returns
+    // true.  Otherwise it returns false.
+        if ($forum->rsstype == 1) {  
+            $items = forum_rss_feed_discussions($forum, $time);
+        } else {             
+            $items = forum_rss_feed_posts($forum, $time);
+        }
+        return (!empty($items));
+    }
+
     //This function return the XML rss contents about the forum record passed as parameter
     //It returns false if something is wrong
     function forum_rss_feed($forum) {
 
     //This function returns "items" record array to be used to build the rss feed
     //for a Type=discussions forum
-    function forum_rss_feed_discussions($forum) {
+    function forum_rss_feed_discussions($forum, $newsince=0) {
 
         global $CFG;
 
         $items = array();
 
+        if ($newsince) {
+            $newsince = " AND p.created > '$newsince'";
+        } else {
+            $newsince = "";
+        }
+
         if ($recs = get_records_sql ("SELECT d.id discussionid, 
                                              d.name discussionname, 
                                              u.id userid, 
                                       WHERE d.forum = '$forum->id' AND
                                             p.discussion = d.id AND
                                             p.parent = 0 AND
-                                            u.id = p.userid
+                                            u.id = p.userid $newsince
                                       ORDER BY p.created desc")) {
+
+            //Are we just looking for new ones?  If so, then return now.
+            if ($newsince) {
+                return true;
+            }
+
             //Iterate over each discussion to get forum->rssarticles records
             $articlesleft = $forum->rssarticles;
             $item = NULL;
     
     //This function returns "items" record array to be used to build the rss feed
     //for a Type=posts forum
-    function forum_rss_feed_posts($forum) {
+    function forum_rss_feed_posts($forum, $newsince=0) {
 
         global $CFG;
 
         $items = array();
 
+        if ($newsince) {
+            $newsince = " AND p.created > '$newsince'";
+        } else {
+            $newsince = "";
+        }
+
         if ($recs = get_records_sql ("SELECT p.id postid,
                                              d.id discussionid,
                                              u.id userid,
                                            {$CFG->prefix}user u
                                       WHERE d.forum = '$forum->id' AND
                                             p.discussion = d.id AND
-                                            u.id = p.userid
+                                            u.id = p.userid $newsince
                                       ORDER BY p.created desc")) {
+
+            //Are we just looking for new ones?  If so, then return now.
+            if ($newsince) {
+                return true;
+            }
+
             //Iterate over each discussion to get forum->rssarticles records
             $articlesleft = $forum->rssarticles;
             $item = NULL;
index b73948f46b076acd52c03e504af6ef95fc78d9a0..7a13d01777c47c4ab84fc1bf9b419fde8ba71af1 100644 (file)
@@ -98,7 +98,7 @@ function rss_save_file ($modname,$mod,$result) {
     }
 
     if ($status) {
-        $file = $basedir .= "/".$mod->id.".xml";
+        $file = rss_file_name($modname, $mod);
         $rss_file = fopen($file,"w");
         if ($rss_file) {
             $status = fwrite ($rss_file,$result);
@@ -110,6 +110,13 @@ function rss_save_file ($modname,$mod,$result) {
     return $status;
 }
 
+
+function rss_file_name($modname, $mod) {
+    global $CFG;
+
+    return "$CFG->dataroot/rss/$modname/$mod->id.xml";
+}
+
 //This function return all the common headers for every rss feed in the site
 function rss_standard_header($title = NULL, $link = NULL, $description = NULL) {