コード例 #1
0
 /**
  * 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;
 }
コード例 #2
0
 /**
  * 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();
 }
コード例 #3
0
 /**
  * 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());
     }
 }
コード例 #4
0
 /**
  * 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();
 }