/** * Saves a new draft message. * @param int $forumid ID of forum * @param int $groupid Group ID (null if none) * @param int $parentpostid ID of post this is in reply to, or 0 for * a new discussion * @param string $subject Subject of draft post * @param string $message Message of draft post * @param int $format Format (FORMAT_xx) of message * @param array $attachments Array of paths to attachments * @param string $options Options (null if none) * @param int $userid User ID or 0 for current * @return int ID of new draft */ static function save_new($forum, $groupid, $parentpostid, $subject, $message, $format, $attachments, $options, $userid = 0) { $userid = forum_utils::get_real_userid($userid); $serializedoptions = $options ? addslashes(serialize($options)) : null; $record = (object) array('userid' => $userid, 'forumid' => $forum->get_id(), 'parentpostid' => $parentpostid ? $parentpostid : null, 'subject' => addslashes($subject), 'message' => addslashes($message), 'format' => $format, 'attachments' => count($attachments) > 0 ? 1 : 0, 'saved' => time(), 'groupid' => $groupid, 'options' => $serializedoptions); forum_utils::start_transaction(); $draftid = forum_utils::insert_record('forumng_drafts', $record); foreach ($attachments as $path) { self::add_attachment($path, $forum->get_course()->id, $forum->get_id(), $draftid); } forum_utils::finish_transaction(); return $draftid; }
/** * Update the forumng_subscription table to incorporate the group subscription feature. * @param bool $moodleupdate If this is true, the function is running as part of the * moodle upgrade.php for Sep 2010 release. In this case, the database queries must * not be changed and other code must work the same way (avoid calls to functions * except Moodle standard ones) */ public function group_subscription_update($moodleupdate = false, $cmid = 0) { global $CFG; forum_utils::start_transaction(); if ($cmid) { //only update one forum $optionalquery = "AND cm.id = {$cmid}"; } else { $optionalquery = ''; } // Query get the distinct forums $sql_count = "\nSELECT\n COUNT(DISTINCT cm.id) AS totalnumberforum\nFROM \n {$CFG->prefix}forumng_subscriptions fs\n INNER JOIN {$CFG->prefix}course_modules cm on fs.forumid = cm.instance \n INNER JOIN {$CFG->prefix}modules m on cm.module = m.id \n INNER JOIN {$CFG->prefix}course c on c.id = cm.course \nWHERE \n discussionid IS NULL AND m.name='forumng' {$optionalquery}\n AND (CASE WHEN c.groupmodeforce=1 THEN c.groupmode ELSE cm.groupmode END ) = 1"; //Query lists all subscriptions to forums that have separate groups $sql_sub = "\nSELECT\n cm.id AS cmid, fs.id AS subid, fs.userid, fs.forumid, c.id AS courseid, cm.groupingid \nFROM\n {$CFG->prefix}forumng_subscriptions fs\n INNER JOIN {$CFG->prefix}course_modules cm on fs.forumid = cm.instance \n INNER JOIN {$CFG->prefix}modules m on cm.module = m.id \n INNER JOIN {$CFG->prefix}course c on c.id = cm.course \nWHERE \n discussionid IS NULL and m.name='forumng' {$optionalquery}\n AND (CASE WHEN c.groupmodeforce=1 THEN c.groupmode ELSE cm.groupmode END ) = 1 \nORDER BY cm.id, fs.id"; //Query lists all groups that the user belongs to from the above query $sql_group = "\nSELECT\n subs.subid, g.id AS groupid\nFROM\n ({$sql_sub}) subs \n INNER JOIN {$CFG->prefix}groups_members gm ON gm.userid = subs.userid \n INNER JOIN {$CFG->prefix}groups g ON gm.groupid = g.id AND g.courseid = subs.courseid \n LEFT JOIN {$CFG->prefix}groupings_groups gg ON gg.groupid = g.id AND subs.groupingid = gg.groupingid \nWHERE\n (subs.groupingid = 0 or gg.id IS NOT NULL)\nORDER BY\n subs.cmid, subs.subid"; $rs = forum_utils::get_recordset_sql($sql_group); $results = array(); while ($rec = rs_fetch_next_record($rs)) { if (!array_key_exists($rec->subid, $results)) { $results[$rec->subid] = array(); } $results[$rec->subid][] = $rec->groupid; } rs_close($rs); $rs = forum_utils::get_recordset_sql($sql_sub); $lastcmid = 0; $forumcount = 1; $totalforumcount = 0; $totalforumcount = count_records_sql($sql_count); while ($rec = rs_fetch_next_record($rs)) { if ($lastcmid != $rec->cmid) { if ($moodleupdate) { print "Updating the subscriptions {$forumcount}/{$totalforumcount} (current cmid:{$rec->cmid}) <br />"; } $context = get_context_instance(CONTEXT_MODULE, $rec->cmid); $aagusers = get_users_by_capability($context, 'moodle/site:accessallgroups', 'u.id'); $aagusers = $aagusers ? $aagusers : array(); $lastcmid = $rec->cmid; $forumcount++; } if (!array_key_exists($rec->userid, $aagusers)) { //Delete the whole forum subscription forum_utils::delete_records('forumng_subscriptions', 'id', $rec->subid); //check if the subid exists in the results array if (array_key_exists($rec->subid, $results)) { foreach ($results[$rec->subid] as $groupid) { $subrecord = new StdClass(); $subrecord->userid = $rec->userid; $subrecord->forumid = $rec->forumid; $subrecord->subscribed = 1; $subrecord->groupid = $groupid; forum_utils::insert_record('forumng_subscriptions', $subrecord); } } } } forum_utils::finish_transaction(); }
/** * Subscribe a user to this discussion. (Assuming it permits manual subscribe/ * unsubscribe.) * @param $userid User ID (default current) * @param $log True to log this */ public function subscribe($userid = 0, $log = true) { global $CFG; $userid = forum_utils::get_real_userid($userid); // For shared forums, we subscribe to a specific clone if ($this->get_forum()->is_shared()) { $clonecmid = $this->get_forum()->get_course_module_id(); $clonevalue = '=' . $clonecmid; } else { $clonecmid = null; $clonevalue = 'IS NULL'; } forum_utils::start_transaction(); //Clear any previous subscriptions to this discussion from the same user if any forum_utils::execute_sql("DELETE FROM {$CFG->prefix}forumng_subscriptions " . "WHERE userid=" . $userid . " AND discussionid=" . $this->discussionfields->id . " AND clonecmid " . $clonevalue); $subrecord = new StdClass(); $subrecord->userid = $userid; $subrecord->forumid = $this->get_forum()->get_id(); $subrecord->subscribed = 1; $subrecord->discussionid = $this->discussionfields->id; $subrecord->clonecmid = $clonecmid; forum_utils::insert_record('forumng_subscriptions', $subrecord); forum_utils::finish_transaction(); if ($log) { $this->log('subscribe', $userid . ' discussion ' . $this->get_id()); } }
/** * Rates this post or updates an existing rating. * @param $rating Rating (value depends on scale used) or NO_RATING * @param $userid User ID or 0 for current user */ function rate($rating, $userid = 0) { if (!$userid) { global $USER; $userid = $USER->id; } forum_utils::start_transaction(); // Delete any existing rating forum_utils::delete_records('forumng_ratings', 'postid', $this->postfields->id, 'userid', $userid); // Add new rating if ($rating != self::NO_RATING) { $ratingobj = new StdClass(); $ratingobj->userid = $userid; $ratingobj->postid = $this->postfields->id; $ratingobj->time = time(); $ratingobj->rating = $rating; forum_utils::insert_record('forumng_ratings', $ratingobj); } // Tell grade to update if ($this->get_forum()->get_grading()) { $this->get_forum()->update_grades($this->get_user()->id); } forum_utils::finish_transaction(); $this->get_discussion()->uncache(); }