]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-13625 improve perf and fixed groups code on forum index page; merged from MOODLE_...
authorskodak <skodak>
Sun, 24 Feb 2008 20:15:12 +0000 (20:15 +0000)
committerskodak <skodak>
Sun, 24 Feb 2008 20:15:12 +0000 (20:15 +0000)
mod/forum/index.php

index 7e90b3d1af47f96d72907fea22c1519c0b2e7cda..9be9ca8dcc66893e006c1dc435823dcde6f52b08 100644 (file)
@@ -8,7 +8,7 @@
     $subscribe = optional_param('subscribe', null, PARAM_INT);  // Subscribe/Unsubscribe all forums
 
     if ($id) {
-        if (! $course = get_record("course", "id", $id)) {
+        if (! $course = get_record('course', 'id', $id)) {
             error("Course ID is incorrect");
         }
     } else {
 
     unset($SESSION->fromdiscussion);
 
-    add_to_log($course->id, "forum", "view forums", "index.php?id=$course->id");
-
-    $strforums = get_string("forums", "forum");
-    $strforum = get_string("forum", "forum");
-    $strdescription = get_string("description");
-    $strdiscussions = get_string("discussions", "forum");
-    $strsubscribed = get_string("subscribed", "forum");
-    $strunreadposts = get_string("unreadposts", "forum");
-    $strtracking = get_string('tracking', 'forum');
-    $strmarkallread = get_string('markallread', 'forum');
-    $strtrackforum = get_string('trackforum', 'forum');
+    add_to_log($course->id, 'forum', 'view forums', "index.php?id=$course->id");
+
+    $strforums       = get_string('forums', 'forum');
+    $strforum        = get_string('forum', 'forum');
+    $strdescription  = get_string('description');
+    $strdiscussions  = get_string('discussions', 'forum');
+    $strsubscribed   = get_string('subscribed', 'forum');
+    $strunreadposts  = get_string('unreadposts', 'forum');
+    $strtracking     = get_string('tracking', 'forum');
+    $strmarkallread  = get_string('markallread', 'forum');
+    $strtrackforum   = get_string('trackforum', 'forum');
     $strnotrackforum = get_string('notrackforum', 'forum');
-    $strsubscribe = get_string('subscribe', 'forum');
-    $strunsubscribe = get_string('unsubscribe', 'forum');
-    $stryes = get_string('yes');
-    $strno = get_string('no');
-    $strrss = get_string("rss");
-    $strweek = get_string('week');
-    $strsection = get_string('section');
+    $strsubscribe    = get_string('subscribe', 'forum');
+    $strunsubscribe  = get_string('unsubscribe', 'forum');
+    $stryes          = get_string('yes');
+    $strno           = get_string('no');
+    $strrss          = get_string('rss');
+    $strweek         = get_string('week');
+    $strsection      = get_string('section');
 
     $searchform = forum_search_form($course);
 
@@ -51,7 +51,7 @@
     $generaltable->head  = array ($strforum, $strdescription, $strdiscussions);
     $generaltable->align = array ('left', 'left', 'center');
 
-    if ($usetracking = forum_tp_can_track_forums()) {
+    if ($usetracking = (!isguestuser() && forum_tp_can_track_forums())) {
         $untracked = forum_tp_get_untracked_forums($USER->id, $course->id);
 
         $generaltable->head[] = $strunreadposts;
@@ -61,7 +61,7 @@
         $generaltable->align[] = 'center';
     }
 
-    if ($can_subscribe = has_capability('moodle/course:view', $coursecontext)) {
+    if ($can_subscribe = (!isguestuser() && has_capability('moodle/course:view', $coursecontext))) {
         $generaltable->head[] = $strsubscribed;
         $generaltable->align[] = 'center';
     }
     // some special ones are not.  These get placed in the general forums
     // category with the forums in section 0.
 
-    $generalforums = array();            // For now
-    $learningforums = get_all_instances_in_course("forum", $course);
+    $forums = get_records('forum', 'course', $course->id);
 
-    if ($forums = get_records("forum", "course", $id, "name ASC")) {  // All known forums
+    $generalforums  = array();
+    $learningforums = array();
+    $modinfo =& get_fast_modinfo($course);
 
-        if ($learningforums) {           // Copy "full" data into this complete array
-            foreach ($learningforums as $key => $learningforum) {
-                $learningforum->keyreference = $key;
-                $forums[$learningforum->id] = $learningforum;
-            }
+    if (!isset($modinfo->instances['forum'])) {
+        $modinfo->instances['forum'] = array();
+    }
+
+    foreach ($modinfo->instances['forum'] as $forumid=>$cm) {
+        if (!$cm->uservisible or !isset($forums[$forumid])) {
+            continue;
         }
 
-        foreach ($forums as $forum) {
+        $forum = $forums[$forumid];
 
-            if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) {
-                continue;   // Shouldn't happen
-            }
+        if (!$context = get_context_instance(CONTEXT_MODULE, $cm->id)) {
+            continue;   // Shouldn't happen
+        }
 
-            if (!$context = get_context_instance(CONTEXT_MODULE, $cm->id)) {
-                continue;   // Shouldn't happen
-            }
-            
-            if (!has_capability('mod/forum:viewdiscussion', $context)) {
-                if (isset($forum->keyreference)) {
-                    unset($learningforums[$forum->keyreference]);
-                }
-                continue;
-            }
-            if (!coursemodule_visible_for_user($cm)) {
-                if (isset($forum->keyreference)) {
-                    unset($learningforums[$forum->keyreference]);
-                }
-                continue;
-            }
+        if (!has_capability('mod/forum:viewdiscussion', $context)) {
+            continue;
+        }
 
-            switch ($forum->type) {
-                case "news":
-                case "social":
-                    $generalforums[] = $forum;
-                    if (isset($forum->keyreference)) {   // Should always be
-                        unset($learningforums[$forum->keyreference]);
-                    }
-                    break;
-                default:
-                    if (($course->id == SITEID) or empty($forum->section)) {   // Site level or section 0
-                        $generalforums[] = $forum;
-                        if (isset($forum->keyreference)) {
-                            unset($learningforums[$forum->keyreference]);
-                        }
-                    }
-                    break;
-            }
+        // fill two type array - order in modinfo is the same as in course
+        if ($forum->type == 'news' or $forum->type == 'social') {
+            $generalforums[$forum->id] = $forum;
+
+        } else if ($course->id == SITEID or empty($cm->sectionnum)) {
+            $generalforums[$forum->id] = $forum;
+
+        } else {
+            $learningforums[$forum->id] = $forum;
         }
     }
 
     /// Do course wide subscribe/unsubscribe
-    if (!is_null($subscribe) && !isguest()) {
-        $allforums = array_merge($generalforums, $learningforums);
-        if ($allforums) {
-            foreach ($allforums as $forum) {
-                if (!forum_is_forcesubscribed($forum->id)) {
-                    $subscribed = forum_is_subscribed($USER->id, $forum->id);
-                    if ($subscribe && !$subscribed) {
-                        forum_subscribe($USER->id, $forum->id);
-                    } elseif (!$subscribe && $subscribed) {
-                        forum_unsubscribe($USER->id, $forum->id);
-                    }
+    if (!is_null($subscribe) and !isguestuser() and !isguest()) {
+        foreach ($modinfo->instances['forum'] as $forumid=>$cm) {
+            if (!forum_is_forcesubscribed($forumid)) {
+                $subscribed = forum_is_subscribed($USER->id, $forumid);
+                if ($subscribe && !$subscribed) {
+                    forum_subscribe($USER->id, $forumid);
+                } elseif (!$subscribe && $subscribed) {
+                    forum_unsubscribe($USER->id, $forumid);
                 }
             }
         }
         $returnto = forum_go_back_to("index.php?id=$course->id");
         if ($subscribe) {
-            add_to_log($course->id, "forum", "subscribeall", "index.php?id=$course->id", $course->id);
-            redirect($returnto, get_string("nowallsubscribed", "forum", format_string($course->shortname)), 1);
+            add_to_log($course->id, 'forum', 'subscribeall', "index.php?id=$course->id", $course->id);
+            redirect($returnto, get_string('nowallsubscribed', 'forum', format_string($course->shortname)), 1);
         } else {
-            add_to_log($course->id, "forum", "unsubscribeall", "index.php?id=$course->id", $course->id);
-            redirect($returnto, get_string("nowallunsubscribed", "forum", format_string($course->shortname)), 1);
+            add_to_log($course->id, 'forum', 'unsubscribeall', "index.php?id=$course->id", $course->id);
+            redirect($returnto, get_string('nowallunsubscribed', 'forum', format_string($course->shortname)), 1);
         }
     }
 
     /// First, let's process the general forums and build up a display
 
+    $introoptions = new object();
+    $introoptions->para = false;
+
     if ($generalforums) {
         foreach ($generalforums as $forum) {
+            $cm      = $modinfo->instances['forum'][$forum->id];
+            $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 
-            if (!$cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
-                continue;  // Shouldn't happen
-            }
-            if (!$context = get_context_instance(CONTEXT_MODULE, $cm->id)) {
-                continue;  // Shouldn't happen
-            }
+            $groupmode    = groups_get_activity_groupmode($cm, $course);
+            $currentgroup = groups_get_activity_group($cm);
 
-            if (!groups_course_module_visible($cm)) {
-                continue;
-            }
-            if (isset($forum->groupmode)) {
-                $groupmode = groups_get_activity_groupmode($cm);
+            if ($groupmode == SEPARATEGROUPS) {
+                $accessallgroups = has_capability('moodle/site:accessallgroups', $context);
             } else {
-                $groupmode = NOGROUPS;
+                $accessallgroups = true;
             }
-            $currentgroup = groups_get_activity_group($cm);
-            $cantaccessagroup = $groupmode && !has_capability('moodle/site:accessallgroups', $context) && !mygroupid($course->id);
+
+            $cantaccessagroup = !$accessallgroups and empty($currentgroup);
 
             // this is potentially wrong logic. could possibly check for if user has the right to hmmm
-            if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
-                $count = count_records_select("forum_discussions", "forum = '$forum->id' AND (groupid = '$currentgroup' OR groupid = '-1')");
+            if ($cantaccessagroup) {
+                $count = '';
+
+            } if ($currentgroup) {
+                $count = count_records_select('forum_discussions', "forum = $forum->id AND (groupid = $currentgroup OR groupid = -1)");
+
             } else {
-                $count = count_records("forum_discussions", "forum", "$forum->id");
+                $count = count_records('forum_discussions', 'forum', $forum->id);
             }
 
             if ($usetracking) {
                     $unreadlink  = '-';
                     $trackedlink = '-';
                 } else if (($forum->trackingtype == FORUM_TRACKING_ON) || !isset($untracked[$forum->id])) {
-                    $groupid = ($groupmode==SEPARATEGROUPS && !has_capability('moodle/site:accessallgroups', $context)) ? $currentgroup : false;
+                    $groupid = !$accessallgroups ? $currentgroup : false;
                     $unread = forum_tp_count_forum_unread_posts($USER->id, $forum->id, $groupid);
                     if ($unread > 0) {
                         $unreadlink = '<span class="unread"><a href="view.php?f='.$forum->id.'">'.$unread.'</a>';
                 }
             }
 
-            $introoptions->para=false;
             $forum->intro = shorten_text(trim(format_text($forum->intro, FORMAT_HTML, $introoptions)), $CFG->forum_shortpost);
+            $forumname = format_string($forum->name, true);;
 
-            $forumname = format_string($forum->name,true);;
             if ($cantaccessagroup) {
                 $forumlink = $forumname;
                 $discussionlink = $count;
             } else {
-                if (!empty($forum->visible)) {
+                if ($cm->visible) {
                     $style = '';
                 } else {
                     $style = 'class="dimmed"';
             if ($show_rss and $forum->rsstype and $forum->rssarticles) {
                 //Calculate the tolltip text
                 if ($forum->rsstype == 1) {
-                    $tooltiptext = get_string("rsssubscriberssdiscussions","forum",format_string($forum->name));
-                } else {
-                    $tooltiptext = get_string("rsssubscriberssposts","forum",format_string($forum->name));
-                }
-                if (empty($USER->id)) {
-                    $userid = 0;
+                    $tooltiptext = get_string('rsssubscriberssdiscussions', 'forum', format_string($forum->name));
                 } else {
-                    $userid = $USER->id;
+                    $tooltiptext = get_string('rsssubscriberssposts', 'forum', format_string($forum->name));
                 }
                 //Get html code for RSS link
-                $row[] = rss_get_link($course->id, $userid, "forum", $forum->id, $tooltiptext);
+                $row[] = rss_get_link($course->id, $USER->id, 'forum', $forum->id, $tooltiptext);
             }
 
             $generaltable->data[] = $row;
 
     // Start of the table for Learning Forums
     $learningtable->head  = array ($strforum, $strdescription, $strdiscussions);
-    $learningtable->align = array ("left", "left", "center");
+    $learningtable->align = array ('left', 'left', 'center');
 
     if ($usetracking) {
         $learningtable->head[] = $strunreadposts;
         } else {
             array_unshift($learningtable->head, $strsection);
         }
-        array_unshift($learningtable->align, "center");
+        array_unshift($learningtable->align, 'center');
 
 
         if ($learningforums) {
-            $currentsection = "";
-            foreach ($learningforums as $key => $forum) {
+            $currentsection = '';
+                foreach ($learningforums as $forum) {
+                $cm      = $modinfo->instances['forum'][$forum->id];
+                $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 
-                if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) {
-                    continue;   // Shouldn't happen
-                }
+                $groupmode    = groups_get_activity_groupmode($cm, $course);
+                $currentgroup = groups_get_activity_group($cm);
 
-                if (!coursemodule_visible_for_user($cm)) {
-                    continue;
+                if ($groupmode == SEPARATEGROUPS) {
+                    $accessallgroups = has_capability('moodle/site:accessallgroups', $context);
+                } else {
+                    $accessallgroups = true;
                 }
 
-                $context = get_context_instance(CONTEXT_MODULE, $cm->id);
+                $cantaccessagroup = !$accessallgroups and empty($currentgroup);
 
-                $currentgroup = groups_get_activity_group($cm);
-                $groupmode = groups_get_activity_groupmode($cm);
+                if ($cantaccessagroup) {
+                    $count = '';
 
-                $cantaccessagroup = $groupmode && !has_capability('moodle/site:accessallgroups', $context) && !mygroupid($course->id);
+                } if ($currentgroup) {
+                    $count = count_records_select('forum_discussions', "forum = $forum->id AND (groupid = $currentgroup OR groupid = -1)");
 
-                if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
-                    $count = count_records("forum_discussions", "forum", "$forum->id", "groupid", $currentgroup);
                 } else {
-                    $count = count_records("forum_discussions", "forum", "$forum->id");
+                    $count = count_records('forum_discussions', 'forum', $forum->id);
                 }
 
                 if ($usetracking) {
                     if ($forum->trackingtype == FORUM_TRACKING_OFF) {
                         $unreadlink = '-';
                         $trackedlink = '-';
-                    } else if (($forum->trackingtype == FORUM_TRACKING_ON) || 
+
+                    } else if (($forum->trackingtype == FORUM_TRACKING_ON) ||
                         !isset($untracked[$forum->id])) {
-                        $groupid = ($groupmode==SEPARATEGROUPS
-                                    && !has_capability('moodle/site:accessallgroups', $context))
-                                    ? $currentgroup : false;
+                        $groupid = !$accessallgroups ? $currentgroup : false;
                         $unread = forum_tp_count_forum_unread_posts($USER->id, $forum->id, $groupid);
                         if ($unread > 0) {
                             $unreadlink = '<span class="unread"><a href="view.php?f='.$forum->id.'">'.$unread.'</a>';
                 $introoptions->para=false;
                 $forum->intro = shorten_text(trim(format_text($forum->intro, FORMAT_HTML, $introoptions)), $CFG->forum_shortpost);
 
-                if ($forum->section != $currentsection) {
-                    $printsection = $forum->section;
+                if ($cm->sectionnum != $currentsection) {
+                    $printsection = $cm->sectionnum;
                     if ($currentsection) {
                         $learningtable->data[] = 'hr';
                     }
-                    $currentsection = $forum->section;
+                    $currentsection = $cm->sectionnum;
                 } else {
-                    $printsection = "";
+                    $printsection = '';
                 }
 
                 $forumname = format_string($forum->name,true);;
-                if ($cantaccessagroup && $groupmode == SEPARATEGROUPS) {
+                if ($cantaccessagroup) {
                     $forumlink = $forumname;
                     $discussionlink = $count;
                 } else {
-                    if ($forum->visible) {
+                    if ($cm->visible) {
                         $style = '';
                     } else {
                         $style = 'class="dimmed"';
                         'unsubscribed' => $strno, 'forcesubscribed' => $stryes,
                         'cantsubscribe' => '-'), $cantaccessagroup, false, true);
                 }
-                
+
                 //If this forum has RSS activated, calculate it
                 if ($show_rss and $forum->rsstype and $forum->rssarticles) {
                     //Calculate the tolltip text
                     if ($forum->rsstype == 1) {
-                        $tooltiptext = get_string("rsssubscriberssdiscussions","forum",format_string($forum->name));
-                    } else {
-                        $tooltiptext = get_string("rsssubscriberssposts","forum",format_string($forum->name));
-                    }
-                    if (empty($USER->id)) {
-                        $userid = 0;
+                        $tooltiptext = get_string('rsssubscriberssdiscussions', 'forum', format_string($forum->name));
                     } else {
-                        $userid = $USER->id;
+                        $tooltiptext = get_string('rsssubscriberssposts', 'forum', format_string($forum->name));
                     }
                     //Get html code for RSS link
-                    $row[] = rss_get_link($course->id, $userid, "forum", $forum->id, $tooltiptext);
+                    $row[] = rss_get_link($course->id, $USER->id, 'forum', $forum->id, $tooltiptext);
                 }
-                
+
                 $learningtable->data[] = $row;
             }
         }
     /// Output the page
     $navlinks = array();
     $navlinks[] = array('name' => $strforums, 'link' => '', 'type' => 'activity');
-    
+
     print_header("$course->shortname: $strforums", $course->fullname,
                     build_navigation($navlinks),
                     "", "", true, $searchform, navmenu($course));
     }
 
     if ($generalforums) {
-        print_heading(get_string("generalforums", "forum"));
+        print_heading(get_string('generalforums', 'forum'));
         print_table($generaltable);
     }
 
     if ($learningforums) {
-        print_heading(get_string("learningforums", "forum"));
+        print_heading(get_string('learningforums', 'forum'));
         print_table($learningtable);
     }