MDL-32931 mod_forum Polishing patch and taking into account courses without previous...
authorDavid Monllao <davidm@moodle.com>
Mon, 9 Jul 2012 07:29:42 +0000 (15:29 +0800)
committerDavid Monllao <davidm@moodle.com>
Fri, 27 Jul 2012 01:08:23 +0000 (09:08 +0800)
mod/forum/lib.php

index 7c6ed42..8ee61ae 100644 (file)
@@ -1310,26 +1310,33 @@ function forum_print_overview($courses,&$htmlarray) {
         return;
     }
 
-
-    // look for new posts since lastaccess
-    $course_tuples = join(
-        ' OR ',
-        array_fill(0, count($visited_courses), '(f.course = ? AND p.created > ?)')
-    );
-
-    $sql = "SELECT f.id, COUNT(*) "
-                .'FROM {forum_posts} p, {forum_discussions} d, {forum} f '
-                .'WHERE p.discussion = d.id AND d.forum = f.id '
-                ."AND ($course_tuples) "
-                ."AND p.userid != ? "
-                ."GROUP BY f.id";
-
+    // Courses to search for new posts
+    $coursessqls = array();
     $params = array();
     foreach ($courses as $course) {
-        $params[] = $course->id;
-        $params[] = $course->lastaccess;
+
+        // If the user has never entered into the course all posts are pending
+        if ($course->lastaccess == 0) {
+            $coursessqls[] = '(f.course = ?)';
+            $params[] = $course->id;
+
+        // Only posts created after the course last access
+        } else {
+            $coursessqls[] = '(f.course = ? AND p.created > ?)';
+            $params[] = $course->id;
+            $params[] = $course->lastaccess;
+        }
     }
     $params[] = $USER->id;
+    $coursessql = implode(' OR ', $coursessqls);
+
+    $sql = "SELECT f.id, COUNT(*) as count "
+                .'FROM {forum} f '
+                .'JOIN {forum_discussions} d ON d.forum  = f.id '
+                .'JOIN {forum_posts} p ON p.discussion = d.id '
+                ."WHERE ($coursessql) "
+                .'AND p.userid != ? '
+                .'GROUP BY f.id';
 
     if (!$new = $DB->get_records_sql($sql, $params)) {
         $new = array(); // avoid warnings