/** * Get a discussion posts and related info * * @param $discussionid * @return array */ public function get_posts($discussionid) { global $PAGE, $DB, $CFG, $COURSE, $USER; $discussion = $DB->get_record('hsuforum_discussions', array('id' => $discussionid), '*', MUST_EXIST); $forum = $PAGE->activityrecord; $course = $COURSE; $cm = get_coursemodule_from_id('hsuforum', $PAGE->cm->id, $course->id, false, MUST_EXIST); // Cannot use cm_info because it is read only. $context = $PAGE->context; if ($forum->type == 'news') { if (!($USER->id == $discussion->userid || ($discussion->timestart == 0 || $discussion->timestart <= time()) && ($discussion->timeend == 0 || $discussion->timeend > time()))) { print_error('invaliddiscussionid', 'hsuforum', "{$CFG->wwwroot}/mod/hsuforum/view.php?f={$forum->id}"); } } if (!($post = hsuforum_get_post_full($discussion->firstpost))) { print_error("notexists", 'hsuforum', "{$CFG->wwwroot}/mod/hsuforum/view.php?f={$forum->id}"); } if (!hsuforum_user_can_see_post($forum, $discussion, $post, null, $cm)) { print_error('nopermissiontoview', 'hsuforum', "{$CFG->wwwroot}/mod/hsuforum/view.php?f={$forum->id}"); } $posts = hsuforum_get_all_discussion_posts($discussion->id); $canreply = hsuforum_user_can_post($forum, $discussion, $USER, $cm, $course, $context); hsuforum_get_ratings_for_posts($context, $forum, $posts); return array($cm, $discussion, $posts, $canreply); }
print_error('invalidforumid', 'hsuforum'); } if (!($course = $DB->get_record("course", array("id" => $discussion->course)))) { print_error('invalidcourseid'); } if (!($cm = get_coursemodule_from_instance("hsuforum", $forum->id, $course->id))) { print_error('invalidcoursemodule'); } // Ensure lang, theme, etc. is set up properly. MDL-6926 $PAGE->set_cm($cm, $course, $forum); $renderer = $PAGE->get_renderer('mod_hsuforum'); $PAGE->requires->js_init_call('M.mod_hsuforum.init', null, false, $renderer->get_js_module()); // Retrieve the contexts. $modcontext = context_module::instance($cm->id); $coursecontext = context_course::instance($course->id); if (!hsuforum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext)) { if (!isguestuser()) { if (!is_enrolled($coursecontext)) { // User is a guest here! $SESSION->wantsurl = qualified_me(); $SESSION->enrolcancel = clean_param($_SERVER['HTTP_REFERER'], PARAM_LOCALURL); redirect($CFG->wwwroot . '/enrol/index.php?id=' . $course->id, get_string('youneedtoenrol')); } } print_error('nopostforum', 'hsuforum'); } // Make sure user can post here if (isset($cm->groupmode) && empty($course->groupmodeforce)) { $groupmode = $cm->groupmode; } else { $groupmode = $course->groupmode;
/** * Prints a forum discussion * * @uses CONTEXT_MODULE * @param stdClass $course * @param stdClass $cm * @param stdClass $forum * @param stdClass $discussion * @param stdClass $post * @param mixed $canreply * @param bool $canrate */ function hsuforum_print_discussion($course, $cm, $forum, $discussion, $post, $canreply = NULL, $canrate = false) { global $USER, $CFG, $OUTPUT, $PAGE; require_once $CFG->dirroot . '/rating/lib.php'; $modcontext = context_module::instance($cm->id); if ($canreply === NULL) { $reply = hsuforum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext); } else { $reply = $canreply; } $posters = array(); $posts = hsuforum_get_all_discussion_posts($discussion->id); $post = $posts[$post->id]; foreach ($posts as $pid => $p) { $posters[$p->userid] = $p->userid; } //load ratings if ($forum->assessed != RATING_AGGREGATE_NONE) { $ratingoptions = new stdClass(); $ratingoptions->context = $modcontext; $ratingoptions->component = 'mod_hsuforum'; $ratingoptions->ratingarea = 'post'; $ratingoptions->items = $posts; $ratingoptions->aggregate = $forum->assessed; //the aggregation method $ratingoptions->scaleid = $forum->scale; $ratingoptions->userid = $USER->id; if ($forum->type == 'single' or !$discussion->id) { $ratingoptions->returnurl = "{$CFG->wwwroot}/mod/hsuforum/view.php?id={$cm->id}"; } else { $ratingoptions->returnurl = "{$CFG->wwwroot}/mod/hsuforum/discuss.php?d={$discussion->id}"; } $ratingoptions->assesstimestart = $forum->assesstimestart; $ratingoptions->assesstimefinish = $forum->assesstimefinish; $rm = new rating_manager(); $posts = $rm->get_ratings($ratingoptions); } $post->forum = $forum->id; // Add the forum id to the post object, later used for rendering $post->forumtype = $forum->type; $post->subject = format_string($post->subject); $postread = !empty($post->postread); echo $OUTPUT->box_start("mod-hsuforum-posts-container article"); $renderer = $PAGE->get_renderer('mod_hsuforum'); echo $renderer->discussion_thread($cm, $discussion, $post, $posts, $reply); echo $OUTPUT->box_end(); // End mod-hsuforum-posts-container return; }
/** * Render a single discussion * * Optionally also render the discussion's posts * * @param \stdClass $cm The forum course module * @param \stdClass $discussion The discussion to render * @param \stdClass $post The discussion's post to render * @param \stdClass[] $posts The discussion posts (optional) * @param null|boolean $canreply If the user can reply or not (optional) * @return string */ public function discussion($cm, $discussion, $post, $fullthread, array $posts = array(), $canreply = null) { global $DB, $PAGE, $USER; $forum = hsuforum_get_cm_forum($cm); $postuser = hsuforum_extract_postuser($post, $forum, context_module::instance($cm->id)); $postuser->user_picture->size = 100; $course = hsuforum_get_cm_course($cm); if (is_null($canreply)) { $canreply = hsuforum_user_can_post($forum, $discussion, null, $cm, $course, context_module::instance($cm->id)); } // Meta properties, sometimes don't exist. if (!property_exists($discussion, 'replies')) { if (!empty($posts)) { $discussion->replies = count($posts) - 1; } else { $discussion->replies = 0; } } else { if (empty($discussion->replies)) { $discussion->replies = 0; } } if (!property_exists($discussion, 'unread') or empty($discussion->unread)) { $discussion->unread = '-'; } $format = get_string('articledateformat', 'hsuforum'); $groups = groups_get_all_groups($course->id, 0, $cm->groupingid); $group = ''; if (groups_get_activity_groupmode($cm, $course) > 0 && isset($groups[$discussion->groupid])) { $group = $groups[$discussion->groupid]; $group = format_string($group->name); } $data = new stdClass(); $data->id = $discussion->id; $data->postid = $post->id; $data->unread = $discussion->unread; $data->fullname = $postuser->fullname; $data->subject = $this->raw_post_subject($post); $data->message = $this->post_message($post, $cm); $data->created = userdate($post->created, $format); $data->datetime = date(DATE_W3C, usertime($post->created)); $data->modified = userdate($discussion->timemodified, $format); $data->replies = $discussion->replies; $data->replyavatars = array(); if ($data->replies > 0) { // Get actual replies $fields = user_picture::fields('u'); $replyusers = $DB->get_records_sql("SELECT DISTINCT {$fields} FROM {hsuforum_posts} hp JOIN {user} u ON hp.userid = u.id WHERE hp.discussion = ? AND hp.privatereply = 0 ORDER BY hp.modified DESC", array($discussion->id)); if (!empty($replyusers) && !$forum->anonymous) { foreach ($replyusers as $replyuser) { if ($replyuser->id === $postuser->id) { continue; // Don't show the posters avatar in the reply section. } $replyuser->imagealt = fullname($replyuser); $data->replyavatars[] = $this->output->user_picture($replyuser, array('link' => false, 'size' => 100)); } } } $data->group = $group; $data->imagesrc = $postuser->user_picture->get_url($this->page)->out(); $data->userurl = $this->get_post_user_url($cm, $postuser); $data->viewurl = new moodle_url('/mod/hsuforum/discuss.php', array('d' => $discussion->id)); $data->tools = implode(' ', $this->post_get_commands($post, $discussion, $cm, $canreply)); $data->postflags = implode(' ', $this->post_get_flags($post, $cm, $discussion->id)); $data->subscribe = ''; $data->posts = ''; $data->fullthread = $fullthread; $data->revealed = false; $data->rawcreated = $post->created; $data->rawmodified = $discussion->timemodified; if ($forum->anonymous && $postuser->id === $USER->id && $post->reveal) { $data->revealed = true; } if ($fullthread && $canreply) { $data->replyform = html_writer::tag('div', $this->simple_edit_post($cm, false, $post->id), array('class' => 'hsuforum-footer-reply')); } else { $data->replyform = ''; } if ($fullthread) { $data->posts = $this->posts($cm, $discussion, $posts, $canreply); } $subscribe = new hsuforum_lib_discussion_subscribe($forum, context_module::instance($cm->id)); $data->subscribe = $this->discussion_subscribe_link($cm, $discussion, $subscribe); return $this->discussion_template($data, $forum->type); }
/** * Validates the submitted post and any submitted files * * @param object $course * @param object $cm * @param object $forum * @param \context_module $context * @param object $discussion * @param object $post * @param upload_file $uploader * @return moodle_exception[] */ public function validate_post($course, $cm, $forum, $context, $discussion, $post, upload_file $uploader) { global $USER; $errors = array(); if (!hsuforum_user_can_post($forum, $discussion, null, $cm, $course, $context)) { $errors[] = new \moodle_exception('nopostforum', 'hsuforum'); } if (!empty($post->id)) { if (!($post->userid == $USER->id && (has_capability('mod/hsuforum:replypost', $context) || has_capability('mod/hsuforum:startdiscussion', $context)) || has_capability('mod/hsuforum:editanypost', $context))) { $errors[] = new \moodle_exception('cannotupdatepost', 'hsuforum'); } } if (empty($post->id)) { $thresholdwarning = hsuforum_check_throttling($forum, $cm); if ($thresholdwarning !== false && $thresholdwarning->canpost === false) { $errors[] = new \moodle_exception($thresholdwarning->errorcode, $thresholdwarning->module, $thresholdwarning->additional); } } if (hsuforum_str_empty($post->subject)) { $errors[] = new \moodle_exception('subjectisrequired', 'hsuforum'); } if (hsuforum_str_empty($post->message)) { $errors[] = new \moodle_exception('messageisrequired', 'hsuforum'); } if ($post->privatereply) { if (!has_capability('mod/hsuforum:allowprivate', $context) || !$forum->allowprivatereplies) { $errors[] = new \moodle_exception('cannotmakeprivatereplies', 'hsuforum'); } } if ($uploader->was_file_uploaded()) { try { $uploader->validate_files(empty($post->id) ? 0 : $post->id); } catch (\Exception $e) { $errors[] = $e; } } return $errors; }
/** * Returns a list of forum posts for a discussion * * @param int $discussionid the post ids * * @return array the forum post details * @since Moodle 2.7 */ public static function get_forum_discussion_posts($discussionid) { global $CFG, $DB, $USER; $warnings = array(); // Validate the parameter. $params = self::validate_parameters(self::get_forum_discussion_posts_parameters(), array('discussionid' => $discussionid)); // Compact/extract functions are not recommended. $discussionid = $params['discussionid']; $discussion = $DB->get_record('hsuforum_discussions', array('id' => $discussionid), '*', MUST_EXIST); $forum = $DB->get_record('hsuforum', array('id' => $discussion->forum), '*', MUST_EXIST); $course = $DB->get_record('course', array('id' => $forum->course), '*', MUST_EXIST); $cm = get_coursemodule_from_instance('hsuforum', $forum->id, $course->id, false, MUST_EXIST); // Validate the module context. It checks everything that affects the module visibility (including groupings, etc..). $modcontext = context_module::instance($cm->id); self::validate_context($modcontext); // This require must be here, see mod/hsuforum/discuss.php. require_once $CFG->dirroot . "/mod/hsuforum/lib.php"; // Check they have the view forum capability. require_capability('mod/hsuforum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum'); if (!($post = hsuforum_get_post_full($discussion->firstpost))) { throw new moodle_exception('notexists', 'hsuforum'); } // This function check groups, qanda, timed discussions, etc. if (!hsuforum_user_can_see_post($forum, $discussion, $post, null, $cm)) { throw new moodle_exception('noviewdiscussionspermission', 'hsuforum'); } $canviewfullname = has_capability('moodle/site:viewfullnames', $modcontext); // We will add this field in the response. $canreply = hsuforum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext); $posts = hsuforum_get_all_discussion_posts($discussion->id); foreach ($posts as $pid => $post) { if (!hsuforum_user_can_see_post($forum, $discussion, $post, null, $cm)) { $warning = array(); $warning['item'] = 'post'; $warning['itemid'] = $post->id; $warning['warningcode'] = '1'; $warning['message'] = 'You can\'t see this post'; $warnings[] = $warning; continue; } // Function hsuforum_get_all_discussion_posts adds postread field. // Note that the value returned can be a boolean or an integer. The WS expects a boolean. if (empty($post->postread)) { $posts[$pid]->postread = false; } else { $posts[$pid]->postread = true; } $posts[$pid]->canreply = $canreply; if (!empty($posts[$pid]->children)) { $posts[$pid]->children = array_keys($posts[$pid]->children); } else { $posts[$pid]->children = array(); } $user = new stdclass(); $user = username_load_fields_from_object($user, $post); $posts[$pid]->userfullname = fullname($user, $canviewfullname); $posts[$pid] = (array) $post; } $result = array(); $result['posts'] = $posts; $result['warnings'] = $warnings; return $result; }