/**
  * Constructs draft post.
  * @param object $draftfields Fields from query_drafts query
  */
 private function __construct($draftfields)
 {
     $draftfields->replytouser = forum_utils::extract_subobject($draftfields, 'u_');
     $this->draftfields = $draftfields;
 }
 /**
  * 
  * @param forum $forum Forum
  * @param object $cm Course-module object
  * @param object $context Context object
  * @param object $course Course object
  */
 function next_forum(&$forum, &$cm, &$context, &$course)
 {
     // Skip if required to get to new forum
     while ($this->forum != null) {
         $this->next_discussion($discussion);
     }
     // Get record
     if ($this->storedrecord) {
         $record = $this->storedrecord;
         $this->storedrecord = null;
     } else {
         if (!$this->rs) {
             // Already used entire list and closed recordset
             return false;
         } else {
             $record = rs_fetch_next_record($this->rs);
             if (!$record) {
                 // End of the line. Mark everything as mailed
                 $this->mark_mailed($this->time);
                 rs_close($this->rs);
                 $this->rs = null;
                 return false;
             }
         }
     }
     // Set data
     $this->storedrecord = clone $record;
     $cm = forum_utils::extract_subobject($record, 'cm_');
     $course = forum_utils::extract_subobject($record, 'c_');
     $context = forum_utils::extract_subobject($record, 'x_');
     $forum = new forum($course, $cm, $context, forum_utils::extract_subobject($record, 'f_'));
     if ($forum->is_shared()) {
         $forum->set_clone_reference($record->cloneid);
         $cm = $forum->get_course_module();
         $course = $forum->get_course();
         $context = $forum->get_context();
     }
     $this->forum = $forum;
     return true;
 }
 /**
  * Obtains all flagged post in this forum by the given or current user,
  * in reverse data order (of when they were flagged).
  * @param int $userid User whose flags will be retrieved; 0 = current
  * @return array Array of forum_post objects
  */
 public function get_flagged_posts($userid = 0)
 {
     // Get all flagged posts. Note that we request the discussion row as
     // well, this is necessary (a) so we can include its forumid field in
     // the query, and (b) because we will use that data to construct
     // basic discussion objects (without having to do another query).
     $records = forum_post::query_posts('fd.forumid = ' . $this->get_id() . ' AND ff.flagged IS NOT NULL AND fp.deleted = 0', 'ff.flagged DESC', false, true, false, $userid, true, true);
     // Construct post object for each one
     $result = array();
     foreach ($records as $record) {
         // Get discussion details from record
         $discussionfields = forum_utils::extract_subobject($record, 'fd_');
         $discussion = new forum_discussion($this, $discussionfields, false, -1);
         // Create post object
         $post = new forum_post($discussion, $record);
         $result[$record->id] = $post;
     }
     return $result;
 }
 /**
  * Obtains a list of everybody who has read this discussion (only works
  * if the discussion is within the 'read' period). The list is in date order
  * (most recent first). Each returned item has ->time (time last read) and
  * ->user (Moodle user object) fields.
  * @param int $groupid Group ID or forum::ALL_GROUPS
  * @return array Array of information about readers
  */
 public function get_readers($groupid = forum::ALL_GROUPS)
 {
     global $CFG;
     $context = $this->get_forum()->get_context();
     // Create comma separated list of context ids
     $context_ids = str_replace('/', ',', substr($context->path, 1));
     $id = $this->discussionfields->id;
     $groupjoin = $groupquery = '';
     $groupwhere = '';
     if ($groupid) {
         $groupjoin = " INNER JOIN {$CFG->prefix}groups_members gm ON gm.userid=fr.userid\n    INNER JOIN {$CFG->prefix}groups g ON gm.groupid = g.id";
         $groupwhere = " AND g.id={$groupid}";
     }
     $result = get_records_sql("\nSELECT\n    fr.id,\n    " . forum_utils::select_username_fields('u', false) . ",\n    fr.time,\n    u.idnumber AS u_idnumber\nFROM\n    {$CFG->prefix}forumng_read fr\n    INNER JOIN {$CFG->prefix}user u ON u.id = fr.userid\n    {$groupjoin}\nWHERE\n    fr.discussionid = {$id}\n    {$groupquery}\n    AND fr.userid in(SELECT userid FROM {$CFG->prefix}role_assignments ra  \n        WHERE ra.contextid in({$context_ids})AND ra.roleid in ({$CFG->forumng_monitorroles}))\n            {$groupwhere}\nORDER BY\n    fr.time DESC");
     $result = $result ? $result : array();
     foreach ($result as $item) {
         $item->user = forum_utils::extract_subobject($item, 'u_');
     }
     return $result;
 }
 /**
  * @param forum_discussion $discussion Discussion object
  * @param object $postfields Post fields from DB table (may also include 
  *   some extra fields provided by forum_post::query_posts)
  * @param forum_post $parentpost Parent post or null if this is root post,
  *   or PARENT_NOT_LOADED if not available
  */
 function __construct($discussion, $postfields, $parentpost = self::PARENT_NOT_LOADED)
 {
     $this->discussion = $discussion;
     $this->postfields = $postfields;
     // Extract the user details into Moodle user-like objects
     if (property_exists($postfields, 'u_id')) {
         $postfields->user = forum_utils::extract_subobject($postfields, 'u_');
         $postfields->edituser = forum_utils::extract_subobject($postfields, 'eu_');
         $postfields->deleteuser = forum_utils::extract_subobject($postfields, 'du_');
     }
     $this->parentpost = $parentpost;
     $this->children = false;
 }