* 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;
* (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();
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;
}
}
$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
*
* @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) {
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) {
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');
$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);
$forums = forum_get_readable_forums($USER->id, $courseid);
if (count($forums) == 0) {
+ $totalcount = 0;
return false;
}
- for ($i=0; $i<count($forums); $i++) {
- if ($i == 0) {
- $selectdiscussion = " ((d.forum = {$forums[$i]->id}";
- } else {
- $selectdiscussion .= " OR (d.forum = {$forums[$i]->id}";
+ $now = round(time(), -2); // db friendly
+
+ $fullaccess = array();
+ $where = array();
+
+ foreach ($forums as $forumid => $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();
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 = "";
}
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
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
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