From 6b7de0bb9b68e607fabb434d9cd3a2d6dfad66cf Mon Sep 17 00:00:00 2001 From: skodak Date: Mon, 14 Apr 2008 08:05:48 +0000 Subject: [PATCH] MDL-12505 general advanced search cleanup + added capability test to recent activity; merged from MOODLE_19_STABLE --- mod/forum/lib.php | 228 ++++++++++++++++++++++------------------------ 1 file changed, 108 insertions(+), 120 deletions(-) diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 01de36f394..b1b2e077c1 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -34,7 +34,7 @@ define ('FORUM_AGGREGATE_SUM', 5); * will create a new instance and return the id number * of the new instance. * @param object $forum add forum instance (with magic quotes) - * @return int intance id + * @return int intance id */ function forum_add_instance($forum) { global $CFG; @@ -88,7 +88,7 @@ function forum_add_instance($forum) { * (defined by the form in mod.html) this function * will update an existing instance with new data. * @param object $forum forum instance (with magic quotes) - * @return bool success + * @return bool success */ function forum_update_instance($forum) { $forum->timemodified = time(); @@ -1099,10 +1099,15 @@ function forum_print_recent_activity($course, $viewfullnames, $timestart) { if (!$cm->uservisible) { continue; } + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + + if (!has_capability('mod/forum:viewdiscussion', $context)) { + continue; + } if (!empty($CFG->forum_enabletimedposts) and $USER->id != $post->duserid and (($post->timestart > 0 and $post->timestart > time()) or ($post->timeend > 0 and $post->timeend < time()))) { - if (!has_capability('mod/forum:viewhiddentimedposts', get_context_instance(CONTEXT_MODULE, $cm->id))) { + if (!has_capability('mod/forum:viewhiddentimedposts', $context)) { continue; } } @@ -1110,7 +1115,7 @@ function forum_print_recent_activity($course, $viewfullnames, $timestart) { $groupmode = groups_get_activity_groupmode($cm, $course); if ($groupmode) { - if ($post->groupid == -1 or $groupmode == VISIBLEGROUPS or has_capability('moodle/site:accessallgroups', get_context_instance(CONTEXT_MODULE, $cm->id))) { + if ($post->groupid == -1 or $groupmode == VISIBLEGROUPS or has_capability('moodle/site:accessallgroups', $context)) { // oki (Open discussions have groupid -1) } else { // separate mode @@ -1254,7 +1259,7 @@ function forum_get_user_grades($forum, $userid=0) { * * @param object $forum null means all forums * @param int $userid specific user only, 0 mean all - * @param boolean $nullifnone return null if grade does not exist + * @param boolean $nullifnone return null if grade does not exist * @return void */ function forum_update_grades($forum=null, $userid=0, $nullifnone=true) { @@ -1494,7 +1499,7 @@ function forum_get_all_discussion_posts($discussionid, $sort, $tracking=false) { foreach ($posts as $pid=>$p) { if ($tracking) { if (forum_tp_is_post_old($p)) { - $posts[$pid]->postread = true; + $posts[$pid]->postread = true; } } if (!$p->parent) { @@ -1539,6 +1544,7 @@ function forum_get_child_posts($parent, $forumid) { function forum_get_readable_forums($userid, $courseid=0) { global $CFG, $USER; + require_once($CFG->dirroot.'/course/lib.php'); if (!$forummod = get_record('modules', 'name', 'forum')) { error('The forum module is not installed'); @@ -1554,95 +1560,79 @@ function forum_get_readable_forums($userid, $courseid=0) { $courses = array_merge($courses1, $courses2); } if (!$courses) { - return false; + return array(); } $readableforums = array(); foreach ($courses as $course) { - $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id); + $modinfo =& get_fast_modinfo($course); + if (is_null($modinfo->groups)) { + $modinfo->groups = groups_get_user_groups($course->id, $userid); + } - if (!has_capability('moodle/course:viewhiddenactivities', $coursecontext)) { - $selecthidden = ' AND cm.visible = 1'; - } else { - $selecthidden = ''; - } - - $selectforums = "SELECT f.id AS id, - f.name AS name, - f.type AS type, - f.course AS course, - cm.id AS cmid, - cm.visible AS cmvisible, - cm.groupmode AS cmgroupmode, - cm.groupingid AS cmgroupingid, - cm.groupmembersonly AS cmgroupmembersonly - FROM {$CFG->prefix}course_modules cm, - {$CFG->prefix}forum f - WHERE cm.instance = f.id - AND cm.course = {$course->id} - AND cm.module = {$forummod->id} - $selecthidden - ORDER BY f.name ASC"; - - if ($forums = get_records_sql($selectforums)) { - - $groups = array(); - if ($group = groups_get_all_groups($course->id, $userid)) { - foreach($group as $grp) { - if (isset($grp->id)) { - $groups[] = $grp->id; - } - } - } + if (empty($modinfo->instances['forum'])) { + // hmm, no forums? + continue; + } - foreach ($forums as $forum) { - $forumcontext = get_context_instance(CONTEXT_MODULE, $forum->cmid); + $courseforums = get_records('forum', 'course', $course->id); - if (has_capability('mod/forum:viewdiscussion', $forumcontext)) { + foreach ($modinfo->instances['forum'] as $forumid => $cm) { + if (!$cm->uservisible or !isset($courseforums[$forumid])) { + continue; + } + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + $forum = $courseforums[$forumid]; - // Evaluate groupmode. - $cm = new object; - $cm->id = $forum->cmid; - $cm->groupmode = $forum->cmgroupmode; - $cm->groupingid = $forum->cmgroupingid; - $cm->groupmembersonly = $forum->cmgroupmembersonly; - $cm->course = $forum->course; - $forum->cmgroupmode = groups_get_activity_groupmode($cm); - if (!groups_course_module_visible($cm)) { - continue; - } - if ($forum->cmgroupmode == SEPARATEGROUPS - && !has_capability('moodle/site:accessallgroups', $forumcontext)) { - $forum->accessallgroups = false; - $forum->accessgroup = $groups; // The user can only access - // discussions for this group. - } else { - $forum->accessallgroups = true; - } + if (!has_capability('mod/forum:viewdiscussion', $context)) { + continue; + } - $forum->viewhiddentimedposts - = has_capability('mod/forum:viewhiddentimedposts', $forumcontext); + /// group access + if (groups_get_activity_groupmode($cm, $course) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) { + if (is_null($modinfo->groups)) { + $modinfo->groups = groups_get_user_groups($course->id, $USER->id); + } + if (empty($CFG->enablegroupings)) { + $forum->onlygroups = $modinfo->groups[0]; + $forum->onlygroups[] = -1; + } else if (isset($modinfo->groups[$cm->groupingid])) { + $forum->onlygroups = $modinfo->groups[$cm->groupingid]; + $forum->onlygroups[] = -1; + } else { + $forum->onlygroups = array(-1); + } + } - if ($forum->type == 'qanda' - && !has_capability('mod/forum:viewqandawithoutposting', $forumcontext)) { + /// hidden timed discussions + $forum->viewhiddentimedposts = true; + if (!empty($CFG->forum_enabletimedposts)) { + if (!has_capability('mod/forum:viewhiddentimedposts', $context)) { + $forum->viewhiddentimedposts = false; + } + } - // We need to check whether the user has posted in the qanda forum. - $forum->onlydiscussions = array(); // Holds discussion ids for the discussions - // the user is allowed to see in this forum. + /// qanda access + if ($forum->type == 'qanda' + && !has_capability('mod/forum:viewqandawithoutposting', $context)) { - if ($discussionspostedin = - forum_discussions_user_has_posted_in($forum->id, $USER->id)) { - foreach ($discussionspostedin as $d) { - array_push($forum->onlydiscussions, $d->id); - } - } + // We need to check whether the user has posted in the qanda forum. + $forum->onlydiscussions = array(); // Holds discussion ids for the discussions + // the user is allowed to see in this forum. + if ($discussionspostedin = forum_discussions_user_has_posted_in($forum->id, $USER->id)) { + foreach ($discussionspostedin as $d) { + $forum->onlydiscussions[] = $d->id; } - array_push($readableforums, $forum); } } + + $readableforums[$forum->id] = $forum; } + + unset($modinfo); + } // End foreach $courses //print_object($courses); @@ -1669,52 +1659,50 @@ function forum_search_posts($searchterms, $courseid=0, $limitfrom=0, $limitnum=5 $forums = forum_get_readable_forums($USER->id, $courseid); if (count($forums) == 0) { + $totalcount = 0; return false; } - for ($i=0; $i $forum) { + $select = array(); + + if (!$forum->viewhiddentimedposts) { + $select[] = "(d.userid = {$USER->id} OR (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now)))"; } - if (!empty($CFG->forum_enabletimedposts) && !$forums[$i]->viewhiddentimedposts) { - $now = time(); - $selectdiscussion .= " AND ( d.userid = {$USER->id} - OR ((d.timestart = 0 OR d.timestart <= $now) - AND (d.timeend = 0 OR d.timeend > $now)) )"; - } - if ($forums[$i]->type == 'qanda' && isset($forums[$i]->onlydiscussions)) { - // This is a qanda forum. - if (is_array($forums[$i]->onlydiscussions)) { - // Show question posts as well as posts from discussions in - // which the user has posted a reply. - if (!empty($forums[$i]->onlydiscussions)) { - $onlydiscussions = "(d.id = ".implode(' OR d.id = ', $forums[$i]->onlydiscussions).") OR"; - } else { - $onlydiscussions = ""; - } - $selectdiscussion .= " AND ($onlydiscussions p.parent = 0)"; + + if ($forum->type == 'qanda') { + if (!empty($forum->onlydiscussions)) { + $discussionsids = implode(',', $forum->onlydiscussions); + $select[] = "(d.id IN ($discussionsids) OR p.parent = 0)"; } else { - // Show only the question posts. - $selectdiscussion .= ' AND (p.parent = 0)'; + $select[] = "p.parent = 0"; } } - if (!$forums[$i]->accessallgroups) { - if (!empty($forums[$i]->accessgroup)) { - $groups = rtrim(implode(",", $forums[$i]->accessgroup),","); - $selectdiscussion .= " AND (d.groupid in ($groups)"; - $selectdiscussion .= ' OR d.groupid = -1)'; // -1 means open for all groups. - } else { - // User isn't in any group. Only search discussions that are - // open to all groups. - $selectdiscussion .= ' AND d.groupid = -1'; - } + + if (!empty($forum->onlygroups)) { + $groupids = implode(',', $forum->onlygroups); + $select[] = "d.groupid IN ($groupids)"; } - $selectdiscussion .= ")\n"; + + if ($select) { + $selects = implode(" AND ", $select); + $where[] = "(d.forum = $forumid AND $selects)"; + } else { + $fullaccess[] = $forumid; + } + } + + if ($fullaccess) { + $fullids = implode(',', $fullaccess); + $where[] = "(d.forum IN ($fullids))"; } - $selectdiscussion .= ")"; + $selectdiscussion = "(".implode(" OR ", $where).")"; // Some differences SQL $LIKE = sql_ilike(); @@ -1836,7 +1824,7 @@ function forum_get_unmailed_posts($starttime, $endtime, $now=null) { if (empty($now)) { $now = time(); } - $timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))"; + $timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))"; } else { $timedsql = ""; } @@ -1889,12 +1877,12 @@ function forum_get_user_posts($forumid, $userid) { if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) { $now = time(); $timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))"; - } + } } return get_records_sql("SELECT p.*, d.forum, u.firstname, u.lastname, u.email, u.picture, u.imagealt FROM {$CFG->prefix}forum f - JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id + JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id JOIN {$CFG->prefix}user u ON u.id = p.userid WHERE f.id = $forumid @@ -1918,12 +1906,12 @@ function forum_get_user_involved_discussions($forumid, $userid) { if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) { $now = time(); $timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))"; - } + } } return get_records_sql("SELECT DISTINCT d.* FROM {$CFG->prefix}forum f - JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id + JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id WHERE f.id = $forumid AND p.userid = $userid @@ -1945,12 +1933,12 @@ function forum_count_user_posts($forumid, $userid) { if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) { $now = time(); $timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))"; - } + } } return get_records_sql("SELECT COUNT(p.id) AS postcount, MAX(p.modified) AS lastpost FROM {$CFG->prefix}forum f - JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id + JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id JOIN {$CFG->prefix}user u ON u.id = p.userid WHERE f.id = $forumid -- 2.39.5