Automatically generated installer lang files
[moodle.git] / mod / forum / post.php
blob84652e4844f204364918d3b976ebc82d2208ed44
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 /**
19 * Edit and save a new post to a discussion
21 * @package mod_forum
22 * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 require_once('../../config.php');
27 require_once('lib.php');
28 require_once($CFG->libdir.'/completionlib.php');
30 $reply = optional_param('reply', 0, PARAM_INT);
31 $forum = optional_param('forum', 0, PARAM_INT);
32 $edit = optional_param('edit', 0, PARAM_INT);
33 $delete = optional_param('delete', 0, PARAM_INT);
34 $prune = optional_param('prune', 0, PARAM_INT);
35 $name = optional_param('name', '', PARAM_CLEAN);
36 $confirm = optional_param('confirm', 0, PARAM_INT);
37 $groupid = optional_param('groupid', null, PARAM_INT);
39 $PAGE->set_url('/mod/forum/post.php', array(
40 'reply' => $reply,
41 'forum' => $forum,
42 'edit' => $edit,
43 'delete'=> $delete,
44 'prune' => $prune,
45 'name' => $name,
46 'confirm'=>$confirm,
47 'groupid'=>$groupid,
48 ));
49 //these page_params will be passed as hidden variables later in the form.
50 $page_params = array('reply'=>$reply, 'forum'=>$forum, 'edit'=>$edit);
52 $sitecontext = context_system::instance();
54 if (!isloggedin() or isguestuser()) {
56 if (!isloggedin() and !get_local_referer()) {
57 // No referer+not logged in - probably coming in via email See MDL-9052
58 require_login();
61 if (!empty($forum)) { // User is starting a new discussion in a forum
62 if (! $forum = $DB->get_record('forum', array('id' => $forum))) {
63 print_error('invalidforumid', 'forum');
65 } else if (!empty($reply)) { // User is writing a new reply
66 if (! $parent = forum_get_post_full($reply)) {
67 print_error('invalidparentpostid', 'forum');
69 if (! $discussion = $DB->get_record('forum_discussions', array('id' => $parent->discussion))) {
70 print_error('notpartofdiscussion', 'forum');
72 if (! $forum = $DB->get_record('forum', array('id' => $discussion->forum))) {
73 print_error('invalidforumid');
76 if (! $course = $DB->get_record('course', array('id' => $forum->course))) {
77 print_error('invalidcourseid');
80 if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) { // For the logs
81 print_error('invalidcoursemodule');
82 } else {
83 $modcontext = context_module::instance($cm->id);
86 $PAGE->set_cm($cm, $course, $forum);
87 $PAGE->set_context($modcontext);
88 $PAGE->set_title($course->shortname);
89 $PAGE->set_heading($course->fullname);
90 $referer = get_local_referer(false);
92 echo $OUTPUT->header();
93 echo $OUTPUT->confirm(get_string('noguestpost', 'forum').'<br /><br />'.get_string('liketologin'), get_login_url(), $referer);
94 echo $OUTPUT->footer();
95 exit;
98 require_login(0, false); // Script is useless unless they're logged in
100 if (!empty($forum)) { // User is starting a new discussion in a forum
101 if (! $forum = $DB->get_record("forum", array("id" => $forum))) {
102 print_error('invalidforumid', 'forum');
104 if (! $course = $DB->get_record("course", array("id" => $forum->course))) {
105 print_error('invalidcourseid');
107 if (! $cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
108 print_error("invalidcoursemodule");
111 // Retrieve the contexts.
112 $modcontext = context_module::instance($cm->id);
113 $coursecontext = context_course::instance($course->id);
115 if (! forum_user_can_post_discussion($forum, $groupid, -1, $cm)) {
116 if (!isguestuser()) {
117 if (!is_enrolled($coursecontext)) {
118 if (enrol_selfenrol_available($course->id)) {
119 $SESSION->wantsurl = qualified_me();
120 $SESSION->enrolcancel = get_local_referer(false);
121 redirect(new moodle_url('/enrol/index.php', array('id' => $course->id,
122 'returnurl' => '/mod/forum/view.php?f=' . $forum->id)),
123 get_string('youneedtoenrol'));
127 print_error('nopostforum', 'forum');
130 if (!$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $modcontext)) {
131 print_error("activityiscurrentlyhidden");
134 $SESSION->fromurl = get_local_referer(false);
136 // Load up the $post variable.
138 $post = new stdClass();
139 $post->course = $course->id;
140 $post->forum = $forum->id;
141 $post->discussion = 0; // ie discussion # not defined yet
142 $post->parent = 0;
143 $post->subject = '';
144 $post->userid = $USER->id;
145 $post->message = '';
146 $post->messageformat = editors_get_preferred_format();
147 $post->messagetrust = 0;
149 if (isset($groupid)) {
150 $post->groupid = $groupid;
151 } else {
152 $post->groupid = groups_get_activity_group($cm);
155 // Unsetting this will allow the correct return URL to be calculated later.
156 unset($SESSION->fromdiscussion);
158 } else if (!empty($reply)) { // User is writing a new reply
160 if (! $parent = forum_get_post_full($reply)) {
161 print_error('invalidparentpostid', 'forum');
163 if (! $discussion = $DB->get_record("forum_discussions", array("id" => $parent->discussion))) {
164 print_error('notpartofdiscussion', 'forum');
166 if (! $forum = $DB->get_record("forum", array("id" => $discussion->forum))) {
167 print_error('invalidforumid', 'forum');
169 if (! $course = $DB->get_record("course", array("id" => $discussion->course))) {
170 print_error('invalidcourseid');
172 if (! $cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
173 print_error('invalidcoursemodule');
176 // Ensure lang, theme, etc. is set up properly. MDL-6926
177 $PAGE->set_cm($cm, $course, $forum);
179 // Retrieve the contexts.
180 $modcontext = context_module::instance($cm->id);
181 $coursecontext = context_course::instance($course->id);
183 if (! forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext)) {
184 if (!isguestuser()) {
185 if (!is_enrolled($coursecontext)) { // User is a guest here!
186 $SESSION->wantsurl = qualified_me();
187 $SESSION->enrolcancel = get_local_referer(false);
188 redirect(new moodle_url('/enrol/index.php', array('id' => $course->id,
189 'returnurl' => '/mod/forum/view.php?f=' . $forum->id)),
190 get_string('youneedtoenrol'));
193 print_error('nopostforum', 'forum');
196 // Make sure user can post here
197 if (isset($cm->groupmode) && empty($course->groupmodeforce)) {
198 $groupmode = $cm->groupmode;
199 } else {
200 $groupmode = $course->groupmode;
202 if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $modcontext)) {
203 if ($discussion->groupid == -1) {
204 print_error('nopostforum', 'forum');
205 } else {
206 if (!groups_is_member($discussion->groupid)) {
207 print_error('nopostforum', 'forum');
212 if (!$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $modcontext)) {
213 print_error("activityiscurrentlyhidden");
216 // Load up the $post variable.
218 $post = new stdClass();
219 $post->course = $course->id;
220 $post->forum = $forum->id;
221 $post->discussion = $parent->discussion;
222 $post->parent = $parent->id;
223 $post->subject = $parent->subject;
224 $post->userid = $USER->id;
225 $post->message = '';
227 $post->groupid = ($discussion->groupid == -1) ? 0 : $discussion->groupid;
229 $strre = get_string('re', 'forum');
230 if (!(substr($post->subject, 0, strlen($strre)) == $strre)) {
231 $post->subject = $strre.' '.$post->subject;
234 // Unsetting this will allow the correct return URL to be calculated later.
235 unset($SESSION->fromdiscussion);
237 } else if (!empty($edit)) { // User is editing their own post
239 if (! $post = forum_get_post_full($edit)) {
240 print_error('invalidpostid', 'forum');
242 if ($post->parent) {
243 if (! $parent = forum_get_post_full($post->parent)) {
244 print_error('invalidparentpostid', 'forum');
248 if (! $discussion = $DB->get_record("forum_discussions", array("id" => $post->discussion))) {
249 print_error('notpartofdiscussion', 'forum');
251 if (! $forum = $DB->get_record("forum", array("id" => $discussion->forum))) {
252 print_error('invalidforumid', 'forum');
254 if (! $course = $DB->get_record("course", array("id" => $discussion->course))) {
255 print_error('invalidcourseid');
257 if (!$cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
258 print_error('invalidcoursemodule');
259 } else {
260 $modcontext = context_module::instance($cm->id);
263 $PAGE->set_cm($cm, $course, $forum);
265 if (!($forum->type == 'news' && !$post->parent && $discussion->timestart > time())) {
266 if (((time() - $post->created) > $CFG->maxeditingtime) and
267 !has_capability('mod/forum:editanypost', $modcontext)) {
268 print_error('maxtimehaspassed', 'forum', '', format_time($CFG->maxeditingtime));
271 if (($post->userid <> $USER->id) and
272 !has_capability('mod/forum:editanypost', $modcontext)) {
273 print_error('cannoteditposts', 'forum');
277 // Load up the $post variable.
278 $post->edit = $edit;
279 $post->course = $course->id;
280 $post->forum = $forum->id;
281 $post->groupid = ($discussion->groupid == -1) ? 0 : $discussion->groupid;
283 $post = trusttext_pre_edit($post, 'message', $modcontext);
285 // Unsetting this will allow the correct return URL to be calculated later.
286 unset($SESSION->fromdiscussion);
288 }else if (!empty($delete)) { // User is deleting a post
290 if (! $post = forum_get_post_full($delete)) {
291 print_error('invalidpostid', 'forum');
293 if (! $discussion = $DB->get_record("forum_discussions", array("id" => $post->discussion))) {
294 print_error('notpartofdiscussion', 'forum');
296 if (! $forum = $DB->get_record("forum", array("id" => $discussion->forum))) {
297 print_error('invalidforumid', 'forum');
299 if (!$cm = get_coursemodule_from_instance("forum", $forum->id, $forum->course)) {
300 print_error('invalidcoursemodule');
302 if (!$course = $DB->get_record('course', array('id' => $forum->course))) {
303 print_error('invalidcourseid');
306 require_login($course, false, $cm);
307 $modcontext = context_module::instance($cm->id);
309 if ( !(($post->userid == $USER->id && has_capability('mod/forum:deleteownpost', $modcontext))
310 || has_capability('mod/forum:deleteanypost', $modcontext)) ) {
311 print_error('cannotdeletepost', 'forum');
315 $replycount = forum_count_replies($post);
317 if (!empty($confirm) && confirm_sesskey()) { // User has confirmed the delete
318 //check user capability to delete post.
319 $timepassed = time() - $post->created;
320 if (($timepassed > $CFG->maxeditingtime) && !has_capability('mod/forum:deleteanypost', $modcontext)) {
321 print_error("cannotdeletepost", "forum",
322 forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $post->discussion))));
325 if ($post->totalscore) {
326 notice(get_string('couldnotdeleteratings', 'rating'),
327 forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $post->discussion))));
329 } else if ($replycount && !has_capability('mod/forum:deleteanypost', $modcontext)) {
330 print_error("couldnotdeletereplies", "forum",
331 forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $post->discussion))));
333 } else {
334 if (! $post->parent) { // post is a discussion topic as well, so delete discussion
335 if ($forum->type == 'single') {
336 notice("Sorry, but you are not allowed to delete that discussion!",
337 forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $post->discussion))));
339 forum_delete_discussion($discussion, false, $course, $cm, $forum);
341 $params = array(
342 'objectid' => $discussion->id,
343 'context' => $modcontext,
344 'other' => array(
345 'forumid' => $forum->id,
349 $event = \mod_forum\event\discussion_deleted::create($params);
350 $event->add_record_snapshot('forum_discussions', $discussion);
351 $event->trigger();
353 redirect(new moodle_url('/mod/forum/view.php', ['f' => $discussion->forum]));
355 } else if (forum_delete_post($post, has_capability('mod/forum:deleteanypost', $modcontext),
356 $course, $cm, $forum)) {
358 if ($forum->type == 'single') {
359 // Single discussion forums are an exception. We show
360 // the forum itself since it only has one discussion
361 // thread.
362 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id));
363 } else {
364 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id));
367 redirect(forum_go_back_to($discussionurl));
368 } else {
369 print_error('errorwhiledelete', 'forum');
374 } else { // User just asked to delete something
376 forum_set_return();
377 $PAGE->navbar->add(get_string('delete', 'forum'));
378 $PAGE->set_title($course->shortname);
379 $PAGE->set_heading($course->fullname);
381 if ($replycount) {
382 if (!has_capability('mod/forum:deleteanypost', $modcontext)) {
383 print_error("couldnotdeletereplies", "forum",
384 forum_go_back_to(new moodle_url('/mod/forum/discuss.php', array('d' => $post->discussion), 'p'.$post->id)));
386 echo $OUTPUT->header();
387 echo $OUTPUT->heading(format_string($forum->name), 2);
388 echo $OUTPUT->confirm(get_string("deletesureplural", "forum", $replycount+1),
389 "post.php?delete=$delete&confirm=$delete",
390 $CFG->wwwroot.'/mod/forum/discuss.php?d='.$post->discussion.'#p'.$post->id);
392 forum_print_post($post, $discussion, $forum, $cm, $course, false, false, false);
394 if (empty($post->edit)) {
395 $forumtracked = forum_tp_is_tracked($forum);
396 $posts = forum_get_all_discussion_posts($discussion->id, "created ASC", $forumtracked);
397 forum_print_posts_nested($course, $cm, $forum, $discussion, $post, false, false, $forumtracked, $posts);
399 } else {
400 echo $OUTPUT->header();
401 echo $OUTPUT->heading(format_string($forum->name), 2);
402 echo $OUTPUT->confirm(get_string("deletesure", "forum", $replycount),
403 "post.php?delete=$delete&confirm=$delete",
404 $CFG->wwwroot.'/mod/forum/discuss.php?d='.$post->discussion.'#p'.$post->id);
405 forum_print_post($post, $discussion, $forum, $cm, $course, false, false, false);
409 echo $OUTPUT->footer();
410 die;
413 } else if (!empty($prune)) { // Pruning
415 if (!$post = forum_get_post_full($prune)) {
416 print_error('invalidpostid', 'forum');
418 if (!$discussion = $DB->get_record("forum_discussions", array("id" => $post->discussion))) {
419 print_error('notpartofdiscussion', 'forum');
421 if (!$forum = $DB->get_record("forum", array("id" => $discussion->forum))) {
422 print_error('invalidforumid', 'forum');
424 if ($forum->type == 'single') {
425 print_error('cannotsplit', 'forum');
427 if (!$post->parent) {
428 print_error('alreadyfirstpost', 'forum');
430 if (!$cm = get_coursemodule_from_instance("forum", $forum->id, $forum->course)) { // For the logs
431 print_error('invalidcoursemodule');
432 } else {
433 $modcontext = context_module::instance($cm->id);
435 if (!has_capability('mod/forum:splitdiscussions', $modcontext)) {
436 print_error('cannotsplit', 'forum');
439 $PAGE->set_cm($cm);
440 $PAGE->set_context($modcontext);
442 $prunemform = new mod_forum_prune_form(null, array('prune' => $prune, 'confirm' => $prune));
445 if ($prunemform->is_cancelled()) {
446 redirect(forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $post->discussion))));
447 } else if ($fromform = $prunemform->get_data()) {
448 // User submits the data.
449 $newdiscussion = new stdClass();
450 $newdiscussion->course = $discussion->course;
451 $newdiscussion->forum = $discussion->forum;
452 $newdiscussion->name = $name;
453 $newdiscussion->firstpost = $post->id;
454 $newdiscussion->userid = $discussion->userid;
455 $newdiscussion->groupid = $discussion->groupid;
456 $newdiscussion->assessed = $discussion->assessed;
457 $newdiscussion->usermodified = $post->userid;
458 $newdiscussion->timestart = $discussion->timestart;
459 $newdiscussion->timeend = $discussion->timeend;
461 $newid = $DB->insert_record('forum_discussions', $newdiscussion);
463 $newpost = new stdClass();
464 $newpost->id = $post->id;
465 $newpost->parent = 0;
466 $newpost->subject = $name;
468 $DB->update_record("forum_posts", $newpost);
470 forum_change_discussionid($post->id, $newid);
472 // Update last post in each discussion.
473 forum_discussion_update_last_post($discussion->id);
474 forum_discussion_update_last_post($newid);
476 // Fire events to reflect the split..
477 $params = array(
478 'context' => $modcontext,
479 'objectid' => $discussion->id,
480 'other' => array(
481 'forumid' => $forum->id,
484 $event = \mod_forum\event\discussion_updated::create($params);
485 $event->trigger();
487 $params = array(
488 'context' => $modcontext,
489 'objectid' => $newid,
490 'other' => array(
491 'forumid' => $forum->id,
494 $event = \mod_forum\event\discussion_created::create($params);
495 $event->trigger();
497 $params = array(
498 'context' => $modcontext,
499 'objectid' => $post->id,
500 'other' => array(
501 'discussionid' => $newid,
502 'forumid' => $forum->id,
503 'forumtype' => $forum->type,
506 $event = \mod_forum\event\post_updated::create($params);
507 $event->add_record_snapshot('forum_discussions', $discussion);
508 $event->trigger();
510 redirect(forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $newid))));
512 } else {
513 // Display the prune form.
514 $course = $DB->get_record('course', array('id' => $forum->course));
515 $PAGE->navbar->add(format_string($post->subject, true), new moodle_url('/mod/forum/discuss.php', array('d'=>$discussion->id)));
516 $PAGE->navbar->add(get_string("prune", "forum"));
517 $PAGE->set_title(format_string($discussion->name).": ".format_string($post->subject));
518 $PAGE->set_heading($course->fullname);
519 echo $OUTPUT->header();
520 echo $OUTPUT->heading(format_string($forum->name), 2);
521 echo $OUTPUT->heading(get_string('pruneheading', 'forum'), 3);
523 $prunemform->display();
525 forum_print_post($post, $discussion, $forum, $cm, $course, false, false, false);
528 echo $OUTPUT->footer();
529 die;
530 } else {
531 print_error('unknowaction');
535 if (!isset($coursecontext)) {
536 // Has not yet been set by post.php.
537 $coursecontext = context_course::instance($forum->course);
541 // from now on user must be logged on properly
543 if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) { // For the logs
544 print_error('invalidcoursemodule');
546 $modcontext = context_module::instance($cm->id);
547 require_login($course, false, $cm);
549 if (isguestuser()) {
550 // just in case
551 print_error('noguest');
554 if (!isset($forum->maxattachments)) { // TODO - delete this once we add a field to the forum table
555 $forum->maxattachments = 3;
558 $thresholdwarning = forum_check_throttling($forum, $cm);
559 $mform_post = new mod_forum_post_form('post.php', array('course' => $course,
560 'cm' => $cm,
561 'coursecontext' => $coursecontext,
562 'modcontext' => $modcontext,
563 'forum' => $forum,
564 'post' => $post,
565 'subscribe' => \mod_forum\subscriptions::is_subscribed($USER->id, $forum,
566 null, $cm),
567 'thresholdwarning' => $thresholdwarning,
568 'edit' => $edit), 'post', '', array('id' => 'mformforum'));
570 $draftitemid = file_get_submitted_draft_itemid('attachments');
571 file_prepare_draft_area($draftitemid, $modcontext->id, 'mod_forum', 'attachment', empty($post->id)?null:$post->id, mod_forum_post_form::attachment_options($forum));
573 //load data into form NOW!
575 if ($USER->id != $post->userid) { // Not the original author, so add a message to the end
576 $data = new stdClass();
577 $data->date = userdate($post->modified);
578 if ($post->messageformat == FORMAT_HTML) {
579 $data->name = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$USER->id.'&course='.$post->course.'">'.
580 fullname($USER).'</a>';
581 $post->message .= '<p><span class="edited">('.get_string('editedby', 'forum', $data).')</span></p>';
582 } else {
583 $data->name = fullname($USER);
584 $post->message .= "\n\n(".get_string('editedby', 'forum', $data).')';
586 unset($data);
589 $formheading = '';
590 if (!empty($parent)) {
591 $heading = get_string("yourreply", "forum");
592 $formheading = get_string('reply', 'forum');
593 } else {
594 if ($forum->type == 'qanda') {
595 $heading = get_string('yournewquestion', 'forum');
596 } else {
597 $heading = get_string('yournewtopic', 'forum');
601 $postid = empty($post->id) ? null : $post->id;
602 $draftid_editor = file_get_submitted_draft_itemid('message');
603 $currenttext = file_prepare_draft_area($draftid_editor, $modcontext->id, 'mod_forum', 'post', $postid, mod_forum_post_form::editor_options($modcontext, $postid), $post->message);
605 $manageactivities = has_capability('moodle/course:manageactivities', $coursecontext);
606 if (\mod_forum\subscriptions::subscription_disabled($forum) && !$manageactivities) {
607 // User does not have permission to subscribe to this discussion at all.
608 $discussionsubscribe = false;
609 } else if (\mod_forum\subscriptions::is_forcesubscribed($forum)) {
610 // User does not have permission to unsubscribe from this discussion at all.
611 $discussionsubscribe = true;
612 } else {
613 if (isset($discussion) && \mod_forum\subscriptions::is_subscribed($USER->id, $forum, $discussion->id, $cm)) {
614 // User is subscribed to the discussion - continue the subscription.
615 $discussionsubscribe = true;
616 } else if (!isset($discussion) && \mod_forum\subscriptions::is_subscribed($USER->id, $forum, null, $cm)) {
617 // Starting a new discussion, and the user is subscribed to the forum - subscribe to the discussion.
618 $discussionsubscribe = true;
619 } else {
620 // User is not subscribed to either forum or discussion. Follow user preference.
621 $discussionsubscribe = $USER->autosubscribe;
625 $mform_post->set_data(array( 'attachments'=>$draftitemid,
626 'general'=>$heading,
627 'subject'=>$post->subject,
628 'message'=>array(
629 'text'=>$currenttext,
630 'format'=>empty($post->messageformat) ? editors_get_preferred_format() : $post->messageformat,
631 'itemid'=>$draftid_editor
633 'discussionsubscribe' => $discussionsubscribe,
634 'mailnow'=>!empty($post->mailnow),
635 'userid'=>$post->userid,
636 'parent'=>$post->parent,
637 'discussion'=>$post->discussion,
638 'course'=>$course->id) +
639 $page_params +
641 (isset($post->format)?array(
642 'format'=>$post->format):
643 array())+
645 (isset($discussion->timestart)?array(
646 'timestart'=>$discussion->timestart):
647 array())+
649 (isset($discussion->timeend)?array(
650 'timeend'=>$discussion->timeend):
651 array())+
653 (isset($discussion->pinned) ? array(
654 'pinned' => $discussion->pinned) :
655 array()) +
657 (isset($post->groupid)?array(
658 'groupid'=>$post->groupid):
659 array())+
661 (isset($discussion->id)?
662 array('discussion'=>$discussion->id):
663 array()));
665 if ($mform_post->is_cancelled()) {
666 if (!isset($discussion->id) || $forum->type === 'qanda') {
667 // Q and A forums don't have a discussion page, so treat them like a new thread..
668 redirect(new moodle_url('/mod/forum/view.php', array('f' => $forum->id)));
669 } else {
670 redirect(new moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id)));
672 } else if ($fromform = $mform_post->get_data()) {
674 if (empty($SESSION->fromurl)) {
675 $errordestination = "$CFG->wwwroot/mod/forum/view.php?f=$forum->id";
676 } else {
677 $errordestination = $SESSION->fromurl;
680 $fromform->itemid = $fromform->message['itemid'];
681 $fromform->messageformat = $fromform->message['format'];
682 $fromform->message = $fromform->message['text'];
683 // WARNING: the $fromform->message array has been overwritten, do not use it anymore!
684 $fromform->messagetrust = trusttext_trusted($modcontext);
686 if ($fromform->edit) { // Updating a post
687 unset($fromform->groupid);
688 $fromform->id = $fromform->edit;
689 $message = '';
691 //fix for bug #4314
692 if (!$realpost = $DB->get_record('forum_posts', array('id' => $fromform->id))) {
693 $realpost = new stdClass();
694 $realpost->userid = -1;
698 // if user has edit any post capability
699 // or has either startnewdiscussion or reply capability and is editting own post
700 // then he can proceed
701 // MDL-7066
702 if ( !(($realpost->userid == $USER->id && (has_capability('mod/forum:replypost', $modcontext)
703 || has_capability('mod/forum:startdiscussion', $modcontext))) ||
704 has_capability('mod/forum:editanypost', $modcontext)) ) {
705 print_error('cannotupdatepost', 'forum');
708 // If the user has access to all groups and they are changing the group, then update the post.
709 if (isset($fromform->groupinfo) && has_capability('mod/forum:movediscussions', $modcontext)) {
710 if (empty($fromform->groupinfo)) {
711 $fromform->groupinfo = -1;
714 if (!forum_user_can_post_discussion($forum, $fromform->groupinfo, null, $cm, $modcontext)) {
715 print_error('cannotupdatepost', 'forum');
718 $DB->set_field('forum_discussions' ,'groupid' , $fromform->groupinfo, array('firstpost' => $fromform->id));
720 // When editing first post/discussion.
721 if (!$fromform->parent) {
722 if (has_capability('mod/forum:pindiscussions', $modcontext)) {
723 // Can change pinned if we have capability.
724 $fromform->pinned = !empty($fromform->pinned) ? FORUM_DISCUSSION_PINNED : FORUM_DISCUSSION_UNPINNED;
725 } else {
726 // We don't have the capability to change so keep to previous value.
727 unset($fromform->pinned);
730 $updatepost = $fromform; //realpost
731 $updatepost->forum = $forum->id;
732 if (!forum_update_post($updatepost, $mform_post)) {
733 print_error("couldnotupdate", "forum", $errordestination);
736 // MDL-11818
737 if (($forum->type == 'single') && ($updatepost->parent == '0')){ // updating first post of single discussion type -> updating forum intro
738 $forum->intro = $updatepost->message;
739 $forum->timemodified = time();
740 $DB->update_record("forum", $forum);
743 if ($realpost->userid == $USER->id) {
744 $message .= get_string("postupdated", "forum");
745 } else {
746 $realuser = $DB->get_record('user', array('id' => $realpost->userid));
747 $message .= get_string("editedpostupdated", "forum", fullname($realuser));
750 $subscribemessage = forum_post_subscription($fromform, $forum, $discussion);
751 if ($forum->type == 'single') {
752 // Single discussion forums are an exception. We show
753 // the forum itself since it only has one discussion
754 // thread.
755 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id));
756 } else {
757 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id), 'p' . $fromform->id);
760 $params = array(
761 'context' => $modcontext,
762 'objectid' => $fromform->id,
763 'other' => array(
764 'discussionid' => $discussion->id,
765 'forumid' => $forum->id,
766 'forumtype' => $forum->type,
770 if ($realpost->userid !== $USER->id) {
771 $params['relateduserid'] = $realpost->userid;
774 $event = \mod_forum\event\post_updated::create($params);
775 $event->add_record_snapshot('forum_discussions', $discussion);
776 $event->trigger();
778 redirect(
779 forum_go_back_to($discussionurl),
780 $message . $subscribemessage,
781 null,
782 \core\output\notification::NOTIFY_SUCCESS
785 } else if ($fromform->discussion) { // Adding a new post to an existing discussion
786 // Before we add this we must check that the user will not exceed the blocking threshold.
787 forum_check_blocking_threshold($thresholdwarning);
789 unset($fromform->groupid);
790 $message = '';
791 $addpost = $fromform;
792 $addpost->forum=$forum->id;
793 if ($fromform->id = forum_add_new_post($addpost, $mform_post)) {
794 $fromform->deleted = 0;
795 $subscribemessage = forum_post_subscription($fromform, $forum, $discussion);
797 if (!empty($fromform->mailnow)) {
798 $message .= get_string("postmailnow", "forum");
799 } else {
800 $message .= '<p>'.get_string("postaddedsuccess", "forum") . '</p>';
801 $message .= '<p>'.get_string("postaddedtimeleft", "forum", format_time($CFG->maxeditingtime)) . '</p>';
804 if ($forum->type == 'single') {
805 // Single discussion forums are an exception. We show
806 // the forum itself since it only has one discussion
807 // thread.
808 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id), 'p'.$fromform->id);
809 } else {
810 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id), 'p'.$fromform->id);
813 $params = array(
814 'context' => $modcontext,
815 'objectid' => $fromform->id,
816 'other' => array(
817 'discussionid' => $discussion->id,
818 'forumid' => $forum->id,
819 'forumtype' => $forum->type,
822 $event = \mod_forum\event\post_created::create($params);
823 $event->add_record_snapshot('forum_posts', $fromform);
824 $event->add_record_snapshot('forum_discussions', $discussion);
825 $event->trigger();
827 // Update completion state
828 $completion=new completion_info($course);
829 if($completion->is_enabled($cm) &&
830 ($forum->completionreplies || $forum->completionposts)) {
831 $completion->update_state($cm,COMPLETION_COMPLETE);
834 redirect(
835 forum_go_back_to($discussionurl),
836 $message . $subscribemessage,
837 null,
838 \core\output\notification::NOTIFY_SUCCESS
841 } else {
842 print_error("couldnotadd", "forum", $errordestination);
844 exit;
846 } else { // Adding a new discussion.
847 // The location to redirect to after successfully posting.
848 $redirectto = new moodle_url('/mod/forum/view.php', array('f' => $fromform->forum));
850 $fromform->mailnow = empty($fromform->mailnow) ? 0 : 1;
852 $discussion = $fromform;
853 $discussion->name = $fromform->subject;
855 $newstopic = false;
856 if ($forum->type == 'news' && !$fromform->parent) {
857 $newstopic = true;
859 $discussion->timestart = $fromform->timestart;
860 $discussion->timeend = $fromform->timeend;
862 if (has_capability('mod/forum:pindiscussions', $modcontext) && !empty($fromform->pinned)) {
863 $discussion->pinned = FORUM_DISCUSSION_PINNED;
864 } else {
865 $discussion->pinned = FORUM_DISCUSSION_UNPINNED;
868 $allowedgroups = array();
869 $groupstopostto = array();
871 // If we are posting a copy to all groups the user has access to.
872 if (isset($fromform->posttomygroups)) {
873 // Post to each of my groups.
874 require_capability('mod/forum:canposttomygroups', $modcontext);
876 // Fetch all of this user's groups.
877 // Note: all groups are returned when in visible groups mode so we must manually filter.
878 $allowedgroups = groups_get_activity_allowed_groups($cm);
879 foreach ($allowedgroups as $groupid => $group) {
880 if (forum_user_can_post_discussion($forum, $groupid, -1, $cm, $modcontext)) {
881 $groupstopostto[] = $groupid;
884 } else if (isset($fromform->groupinfo)) {
885 // Use the value provided in the dropdown group selection.
886 $groupstopostto[] = $fromform->groupinfo;
887 $redirectto->param('group', $fromform->groupinfo);
888 } else if (isset($fromform->groupid) && !empty($fromform->groupid)) {
889 // Use the value provided in the hidden form element instead.
890 $groupstopostto[] = $fromform->groupid;
891 $redirectto->param('group', $fromform->groupid);
892 } else {
893 // Use the value for all participants instead.
894 $groupstopostto[] = -1;
897 // Before we post this we must check that the user will not exceed the blocking threshold.
898 forum_check_blocking_threshold($thresholdwarning);
900 foreach ($groupstopostto as $group) {
901 if (!forum_user_can_post_discussion($forum, $group, -1, $cm, $modcontext)) {
902 print_error('cannotcreatediscussion', 'forum');
905 $discussion->groupid = $group;
906 $message = '';
907 if ($discussion->id = forum_add_discussion($discussion, $mform_post)) {
909 $params = array(
910 'context' => $modcontext,
911 'objectid' => $discussion->id,
912 'other' => array(
913 'forumid' => $forum->id,
916 $event = \mod_forum\event\discussion_created::create($params);
917 $event->add_record_snapshot('forum_discussions', $discussion);
918 $event->trigger();
920 if ($fromform->mailnow) {
921 $message .= get_string("postmailnow", "forum");
922 } else {
923 $message .= '<p>'.get_string("postaddedsuccess", "forum") . '</p>';
924 $message .= '<p>'.get_string("postaddedtimeleft", "forum", format_time($CFG->maxeditingtime)) . '</p>';
927 $subscribemessage = forum_post_subscription($fromform, $forum, $discussion);
928 } else {
929 print_error("couldnotadd", "forum", $errordestination);
933 // Update completion status.
934 $completion = new completion_info($course);
935 if ($completion->is_enabled($cm) &&
936 ($forum->completiondiscussions || $forum->completionposts)) {
937 $completion->update_state($cm, COMPLETION_COMPLETE);
940 // Redirect back to the discussion.
941 redirect(
942 forum_go_back_to($redirectto->out()),
943 $message . $subscribemessage,
944 null,
945 \core\output\notification::NOTIFY_SUCCESS
952 // To get here they need to edit a post, and the $post
953 // variable will be loaded with all the particulars,
954 // so bring up the form.
956 // $course, $forum are defined. $discussion is for edit and reply only.
958 if ($post->discussion) {
959 if (! $toppost = $DB->get_record("forum_posts", array("discussion" => $post->discussion, "parent" => 0))) {
960 print_error('cannotfindparentpost', 'forum', '', $post->id);
962 } else {
963 $toppost = new stdClass();
964 $toppost->subject = ($forum->type == "news") ? get_string("addanewtopic", "forum") :
965 get_string("addanewdiscussion", "forum");
968 if (empty($post->edit)) {
969 $post->edit = '';
972 if (empty($discussion->name)) {
973 if (empty($discussion)) {
974 $discussion = new stdClass();
976 $discussion->name = $forum->name;
978 if ($forum->type == 'single') {
979 // There is only one discussion thread for this forum type. We should
980 // not show the discussion name (same as forum name in this case) in
981 // the breadcrumbs.
982 $strdiscussionname = '';
983 } else {
984 // Show the discussion name in the breadcrumbs.
985 $strdiscussionname = format_string($discussion->name).':';
988 $forcefocus = empty($reply) ? NULL : 'message';
990 if (!empty($discussion->id)) {
991 $PAGE->navbar->add(format_string($toppost->subject, true), "discuss.php?d=$discussion->id");
994 if ($post->parent) {
995 $PAGE->navbar->add(get_string('reply', 'forum'));
998 if ($edit) {
999 $PAGE->navbar->add(get_string('edit', 'forum'));
1002 $PAGE->set_title("$course->shortname: $strdiscussionname ".format_string($toppost->subject));
1003 $PAGE->set_heading($course->fullname);
1005 echo $OUTPUT->header();
1006 echo $OUTPUT->heading(format_string($forum->name), 2);
1008 // checkup
1009 if (!empty($parent) && !forum_user_can_see_post($forum, $discussion, $post, null, $cm)) {
1010 print_error('cannotreply', 'forum');
1012 if (empty($parent) && empty($edit) && !forum_user_can_post_discussion($forum, $groupid, -1, $cm, $modcontext)) {
1013 print_error('cannotcreatediscussion', 'forum');
1016 if ($forum->type == 'qanda'
1017 && !has_capability('mod/forum:viewqandawithoutposting', $modcontext)
1018 && !empty($discussion->id)
1019 && !forum_user_has_posted($forum->id, $discussion->id, $USER->id)) {
1020 echo $OUTPUT->notification(get_string('qandanotify','forum'));
1023 // If there is a warning message and we are not editing a post we need to handle the warning.
1024 if (!empty($thresholdwarning) && !$edit) {
1025 // Here we want to throw an exception if they are no longer allowed to post.
1026 forum_check_blocking_threshold($thresholdwarning);
1029 if (!empty($parent)) {
1030 if (!$discussion = $DB->get_record('forum_discussions', array('id' => $parent->discussion))) {
1031 print_error('notpartofdiscussion', 'forum');
1034 forum_print_post($parent, $discussion, $forum, $cm, $course, false, false, false);
1035 if (empty($post->edit)) {
1036 if ($forum->type != 'qanda' || forum_user_can_see_discussion($forum, $discussion, $modcontext)) {
1037 $forumtracked = forum_tp_is_tracked($forum);
1038 $posts = forum_get_all_discussion_posts($discussion->id, "created ASC", $forumtracked);
1039 forum_print_posts_threaded($course, $cm, $forum, $discussion, $parent, 0, false, $forumtracked, $posts);
1042 } else {
1043 if (!empty($forum->intro)) {
1044 echo $OUTPUT->box(format_module_intro('forum', $forum, $cm->id), 'generalbox', 'intro');
1046 if (!empty($CFG->enableplagiarism)) {
1047 require_once($CFG->libdir.'/plagiarismlib.php');
1048 echo plagiarism_print_disclosure($cm->id);
1053 if (!empty($formheading)) {
1054 echo $OUTPUT->heading($formheading, 2, array('class' => 'accesshide'));
1057 $data = new StdClass();
1058 if (isset($postid)) {
1059 $data->tags = core_tag_tag::get_item_tags_array('mod_forum', 'forum_posts', $postid);
1060 $mform_post->set_data($data);
1063 $mform_post->display();
1065 echo $OUTPUT->footer();