public static function post_comment($course)
 {
     global $CFG;
     $postid = required_param('postid', PARAM_INT);
     require_once $CFG->dirroot . '/course/format/socialwall/pages/comment_form.php';
     $url = new \moodle_url('/course/format/socialwall/action.php');
     $commentform = new \comment_form($url, array('postid' => $postid, 'id' => $course->id));
     if ($data = $commentform->get_data()) {
         // Suitable capability checks are made in save_post!
         $comments = comments::instance();
         return $comments->save_comment_from_submit($data, $course);
     }
     return false;
 }
 /**
  * Render the form to write a timeline comment or a reply to a comment
  * 
  * @param string $actionlink the HTML output, where this HTML will be added
  * @param course_context $coursecontext
  * @param object $post
  * @param object $replycomment, if not null we render a form to write a reply to a comment.
  * @return type
  */
 protected function render_timeline_comments_form($actionlink, $coursecontext, $post, $replycomment = null)
 {
     $actionarea = '';
     $capcomment = has_capability('format/socialwall:writecomment', $coursecontext);
     // Replies are not in threaded fashion, is this a toplevel comment?
     $replycommentid = !isset($replycomment) ? 0 : $replycomment->id;
     $canreply = ($replycommentid == 0 or $replycomment->replycommentid == 0);
     if ($capcomment and $canreply) {
         $style = empty($post->locked) ? '' : 'display:none';
         $urlparams = array('courseid' => $post->courseid, 'postid' => $post->id, 'commentsformshow' => $post->id . '_' . $replycommentid);
         $url = new moodle_url('/course/view.php', $urlparams);
         $urltext = empty($replycommentid) ? get_string('writecomment', 'format_socialwall') : get_string('replycomment', 'format_socialwall');
         $actionlink .= html_writer::link($url, $urltext, array('id' => "showcommentform_{$post->id}_{$replycommentid}", 'style' => $style));
         $actionarea .= html_writer::tag('div', $actionlink, array('class' => 'tl-actionlink'));
     }
     if ($capcomment and $canreply) {
         $formparams = array('postid' => $post->id, 'courseid' => $post->courseid, 'replycommentid' => $replycommentid);
         $url = new moodle_url('/course/format/socialwall/action.php', $formparams);
         $commentform = new comment_form($url, $formparams, 'post', '', array('id' => 'tlcommentform_' . $post->id . '_' . $replycommentid));
         if (!$commentform->has_errors() and $this->commentsformshow != $post->id . '_' . $replycommentid) {
             $style = 'display:none';
         }
         $params = array('class' => 'tl-commentform', 'id' => "tlcommentformwrap_{$post->id}_{$replycommentid}", 'style' => $style);
         $actionarea .= html_writer::tag('div', $commentform->render(), $params);
     }
     return $actionarea;
 }
 /** renders a timeline post.
  * 
  * @global object $OUTPUT
  * @global record $USER
  * @param record $course
  * @param record $post
  * @param object $completion
  * @param array $authors the already retrieved authors for posts and comments
  * @return string HTML for post
  */
 protected function render_timeline_post($course, $post, $completion, $authors)
 {
     global $OUTPUT, $USER;
     $coursecontext = context_course::instance($post->courseid);
     list($postauthor, $l) = $this->get_timeline_author($post->fromuserid, $authors);
     $o = html_writer::tag('div', $l, array('class' => 'tl-leftcol'));
     // ... determine group for headline.
     if (empty($post->togroupid)) {
         $to = get_string('allparticipants');
     } else {
         $groups = groups_get_all_groups($post->courseid);
         $to = isset($groups[$post->togroupid]) ? get_string('group') . ' ' . $groups[$post->togroupid]->name : get_string('nonexistinggroup', 'format_socialwall');
     }
     $date = userdate($post->timecreated);
     $authorspan = html_writer::tag('span', fullname($postauthor), array('class' => 'tl-authorname'));
     $headline = get_string('postedonto', 'format_socialwall', array('author' => $authorspan, 'date' => $date, 'to' => $to));
     // ... add delete icon, if delete is possible.
     $candeletepost = ($post->fromuserid == $USER->id and has_capability('format/socialwall:deleteownpost', $coursecontext));
     $candeletepost = ($candeletepost or has_capability('format/socialwall:deleteanypost', $coursecontext));
     if ($candeletepost) {
         $url = new moodle_url('/course/format/socialwall/action.php', array('id' => $post->courseid, 'action' => 'deletepost', 'pid' => $post->id, 'sesskey' => sesskey()));
         $deletelink = html_writer::link($url, $OUTPUT->pix_icon('t/delete', get_string('delete')));
         $headline .= html_writer::tag('span', $deletelink, array('class' => 'tl-action-icons'));
     }
     // ...
     if (!empty($post->posttext)) {
         // ...user with cap format/socialwall:posthtml should be able to html.
         $headline .= html_writer::tag('div', format_text($post->posttext), array('class' => 'tl-posttext'));
     }
     if (!empty($post->attaches)) {
         $modinfo = get_fast_modinfo($post->courseid);
         $modulehtml = '';
         foreach ($post->attaches as $attachment) {
             $cm = $modinfo->get_cm($attachment->coursemoduleid);
             $modulehtml .= $this->courserenderer->course_section_cm_list_item($course, $completion, $cm, 0);
             if (isset($post->grades[$attachment->coursemoduleid])) {
                 $modulehtml .= $this->render_timeline_grades($authors, $post->grades[$attachment->coursemoduleid]);
             }
         }
         if (!empty($modulehtml)) {
             $headline .= html_writer::tag('ul', $modulehtml, array('class' => 'section tl-postattachment'));
         }
     }
     $p = '';
     if (has_capability('format/socialwall:lockcomment', $coursecontext)) {
         $class = !empty($post->locked) ? 'locked' : 'unlocked';
         $urlparams = array('id' => $post->courseid, 'postid' => $post->id, 'action' => 'lockpost', 'locked' => empty($post->locked), 'sesskey' => sesskey());
         $url = new moodle_url('/course/format/socialwall/action.php', $urlparams);
         if (!empty($post->locked)) {
             $pixicon = $OUTPUT->pix_icon('lockedpost', get_string('unlockpost', 'format_socialwall'), 'format_socialwall');
         } else {
             $pixicon = $OUTPUT->pix_icon('unlockedpost', get_string('lockpost', 'format_socialwall'), 'format_socialwall');
         }
         $link = html_writer::link($url, $pixicon, array('id' => 'lockpost_' . $post->id, 'class' => $class));
         $p .= html_writer::tag('div', $link, array('class' => 'tl-locked'));
     }
     if (has_capability('format/socialwall:makesticky', $coursecontext)) {
         $urlparams = array('id' => $post->courseid, 'postid' => $post->id, 'action' => 'makesticky', 'sticky' => empty($post->sticky), 'sesskey' => sesskey());
         $url = new moodle_url('/course/format/socialwall/action.php', $urlparams);
         if (!empty($post->sticky)) {
             $pixicon = $OUTPUT->pix_icon('stickypost', get_string('makeunsticky', 'format_socialwall'), 'format_socialwall');
         } else {
             $pixicon = $OUTPUT->pix_icon('unstickypost', get_string('makesticky', 'format_socialwall'), 'format_socialwall');
         }
         $link = html_writer::link($url, $pixicon);
         $p .= html_writer::tag('div', $link, array('class' => 'tl-sticky'));
     } else {
         // ...cannot edit stickyness of post.
         if (!empty($post->sticky)) {
             $pixicon = $OUTPUT->pix_icon('stickypost', get_string('sticky', 'format_socialwall'), 'format_socialwall');
             $p .= html_writer::tag('div', $pixicon, array('class' => 'tl-sticky'));
         }
     }
     $p .= html_writer::tag('div', $headline);
     $countoutput = '';
     if (!empty($course->enablelikes) and has_capability('format/socialwall:viewlikes', $coursecontext)) {
         $countlikessstr = get_string('countlikes', 'format_socialwall', $post->countlikes);
         $countoutput .= html_writer::tag('span', $countlikessstr, array('id' => 'tlcountlikes_' . $post->id));
     }
     $countcommentsstr = get_string('countcomments', 'format_socialwall', $post->countcomments);
     $countoutput .= html_writer::tag('span', $countcommentsstr, array('id' => 'tlcountcomments_' . $post->id));
     $actionarea = html_writer::tag('div', $countoutput, array('class' => 'tl-counts'));
     $actionlink = '';
     if (!empty($course->enablelikes) and has_capability('format/socialwall:like', $coursecontext)) {
         $class = !empty($post->userlike) ? 'likenomore' : 'like';
         $urlparams = array('id' => $post->courseid, 'postid' => $post->id, 'action' => 'likepost', 'userlike' => empty($post->userlike), 'sesskey' => sesskey());
         $url = new moodle_url('/course/format/socialwall/action.php', $urlparams);
         $urlparams = array('class' => $class, 'id' => "userlike_{$post->id}");
         $actionlink .= html_writer::link($url, get_string($class, 'format_socialwall'), $urlparams);
     }
     $capcomment = has_capability('format/socialwall:writecomment', $coursecontext);
     if ($capcomment) {
         $style = empty($post->locked) ? '' : 'display:none';
         $urlparams = array('id' => $post->courseid, 'postid' => $post->id, 'commentsformshow' => $post->id);
         $url = new moodle_url('/course/view.php', $urlparams);
         $urltext = get_string('writecomment', 'format_socialwall');
         $actionlink .= html_writer::link($url, $urltext, array('id' => "showcommentform_{$post->id}", 'style' => $style));
     }
     $actionarea .= html_writer::tag('div', $actionlink, array('class' => 'tl-actionlink'));
     if ($capcomment) {
         $url = new moodle_url('/course/format/socialwall/action.php');
         $formparams = array('postid' => $post->id, 'id' => $post->courseid);
         $commentform = new comment_form($url, $formparams, 'post', '', array('id' => 'tlcommentform_' . $post->id));
         if (!$commentform->has_errors() and $this->commentsformshow != $post->id) {
             $style = 'display:none';
         }
         $params = array('class' => 'tl-commentform', 'id' => "tlcommentformwrap_{$post->id}", 'style' => $style);
         $actionarea .= html_writer::tag('div', $commentform->render(), $params);
     }
     $p .= html_writer::tag('div', $actionarea, array('class' => 'tl-post-actionarea'));
     // ... print out all comments.
     $c = $this->render_timeline_comments($post, $authors, $coursecontext);
     $p .= html_writer::tag('ul', $c, array('class' => 'tl-comments', 'id' => 'tlcomments_' . $post->id));
     $morecommentscount = $post->countcomments - $course->tlnumcomments;
     if ($morecommentscount > 0) {
         $url = new moodle_url('/course/format/socialwall/action.php');
         $strmore = get_string('showall', 'format_socialwall', $morecommentscount);
         $l = html_writer::link('#', $strmore, array('id' => 'tlshowall_' . $post->id));
         $p .= html_writer::tag('div', $l, array('class' => 'tl-showall'));
     }
     $o .= html_writer::tag('div', $p, array('class' => 'tl-text'));
     $text = html_writer::tag('li', $o, array('class' => 'tl-post'));
     return filter_manager::instance()->filter_text($text, $coursecontext);
 }