3 // This file is part of Moodle - http://moodle.org/
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.
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/>.
19 * Edit and save a new post to a discussion
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(
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
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');
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();
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
144 $post->userid
= $USER->id
;
146 $post->messageformat
= editors_get_preferred_format();
147 $post->messagetrust
= 0;
149 if (isset($groupid)) {
150 $post->groupid
= $groupid;
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
;
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');
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
;
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');
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');
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.
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
))));
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);
342 'objectid' => $discussion->id
,
343 'context' => $modcontext,
345 'forumid' => $forum->id
,
349 $event = \mod_forum\event\discussion_deleted
::create($params);
350 $event->add_record_snapshot('forum_discussions', $discussion);
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
362 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id
));
364 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id
));
367 redirect(forum_go_back_to($discussionurl));
369 print_error('errorwhiledelete', 'forum');
374 } else { // User just asked to delete something
377 $PAGE->navbar
->add(get_string('delete', 'forum'));
378 $PAGE->set_title($course->shortname
);
379 $PAGE->set_heading($course->fullname
);
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);
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();
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');
433 $modcontext = context_module
::instance($cm->id
);
435 if (!has_capability('mod/forum:splitdiscussions', $modcontext)) {
436 print_error('cannotsplit', 'forum');
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..
478 'context' => $modcontext,
479 'objectid' => $discussion->id
,
481 'forumid' => $forum->id
,
484 $event = \mod_forum\event\discussion_updated
::create($params);
488 'context' => $modcontext,
489 'objectid' => $newid,
491 'forumid' => $forum->id
,
494 $event = \mod_forum\event\discussion_created
::create($params);
498 'context' => $modcontext,
499 'objectid' => $post->id
,
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);
510 redirect(forum_go_back_to(new moodle_url("/mod/forum/discuss.php", array('d' => $newid))));
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();
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);
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,
561 'coursecontext' => $coursecontext,
562 'modcontext' => $modcontext,
565 'subscribe' => \mod_forum\subscriptions
::is_subscribed($USER->id
, $forum,
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>';
583 $data->name
= fullname($USER);
584 $post->message
.= "\n\n(".get_string('editedby', 'forum', $data).')';
590 if (!empty($parent)) {
591 $heading = get_string("yourreply", "forum");
592 $formheading = get_string('reply', 'forum');
594 if ($forum->type
== 'qanda') {
595 $heading = get_string('yournewquestion', 'forum');
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;
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;
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,
627 'subject'=>$post->subject
,
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
) +
641 (isset($post->format
)?
array(
642 'format'=>$post->format
):
645 (isset($discussion->timestart
)?
array(
646 'timestart'=>$discussion->timestart
):
649 (isset($discussion->timeend
)?
array(
650 'timeend'=>$discussion->timeend
):
653 (isset($discussion->pinned
) ?
array(
654 'pinned' => $discussion->pinned
) :
657 (isset($post->groupid
)?
array(
658 'groupid'=>$post->groupid
):
661 (isset($discussion->id
)?
662 array('discussion'=>$discussion->id
):
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
)));
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";
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
;
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
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
;
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);
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");
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
755 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id
));
757 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id
), 'p' . $fromform->id
);
761 'context' => $modcontext,
762 'objectid' => $fromform->id
,
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);
779 forum_go_back_to($discussionurl),
780 $message . $subscribemessage,
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
);
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");
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
808 $discussionurl = new moodle_url("/mod/forum/view.php", array('f' => $forum->id
), 'p'.$fromform->id
);
810 $discussionurl = new moodle_url("/mod/forum/discuss.php", array('d' => $discussion->id
), 'p'.$fromform->id
);
814 'context' => $modcontext,
815 'objectid' => $fromform->id
,
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);
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
);
835 forum_go_back_to($discussionurl),
836 $message . $subscribemessage,
838 \core\output\notification
::NOTIFY_SUCCESS
842 print_error("couldnotadd", "forum", $errordestination);
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
;
856 if ($forum->type
== 'news' && !$fromform->parent
) {
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
;
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
);
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;
907 if ($discussion->id
= forum_add_discussion($discussion, $mform_post)) {
910 'context' => $modcontext,
911 'objectid' => $discussion->id
,
913 'forumid' => $forum->id
,
916 $event = \mod_forum\event\discussion_created
::create($params);
917 $event->add_record_snapshot('forum_discussions', $discussion);
920 if ($fromform->mailnow
) {
921 $message .= get_string("postmailnow", "forum");
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);
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.
942 forum_go_back_to($redirectto->out()),
943 $message . $subscribemessage,
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
);
963 $toppost = new stdClass();
964 $toppost->subject
= ($forum->type
== "news") ?
get_string("addanewtopic", "forum") :
965 get_string("addanewdiscussion", "forum");
968 if (empty($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
982 $strdiscussionname = '';
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");
995 $PAGE->navbar
->add(get_string('reply', 'forum'));
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);
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);
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();