* other mean to sort the records, e.g. we cannot use IDs as a greater ID can have a lower
* timemodified.
*
+ * For blog-style forums, the calculation is based on the original creation time of the
+ * blog post.
+ *
* Please note that this does not check whether or not the discussion passed is accessible
* by the user, it simply uses it as a reference to find the neighbours. On the other hand,
* the returned neighbours are checked and are accessible to the current user.
*
* @param object $cm The CM record.
* @param object $discussion The discussion record.
+ * @param object $forum The forum instance record.
* @return array That always contains the keys 'prev' and 'next'. When there is a result
* they contain the record with minimal information such as 'id' and 'name'.
* When the neighbour is not found the value is false.
*/
-function forum_get_discussion_neighbours($cm, $discussion) {
+function forum_get_discussion_neighbours($cm, $discussion, $forum) {
global $CFG, $DB, $USER;
- if ($cm->instance != $discussion->forum) {
+ if ($cm->instance != $discussion->forum or $discussion->forum != $forum->id or $forum->id != $cm->instance) {
throw new coding_exception('Discussion is not part of the same forum.');
}
}
}
- $params['forumid'] = $cm->instance;
- $params['discid'] = $discussion->id;
- $params['disctimemodified'] = $discussion->timemodified;
+ if ($forum->type === 'blog') {
+ $params['forumid'] = $cm->instance;
+ $params['discid1'] = $discussion->id;
+ $params['discid2'] = $discussion->id;
- $sql = "SELECT d.id, d.name, d.timemodified, d.groupid, d.timestart, d.timeend
- FROM {forum_discussions} d
- WHERE d.forum = :forumid
- AND d.id <> :discid
- $timelimit
- $groupselect";
+ $sql = "SELECT d.id, d.name, d.timemodified, d.groupid, d.timestart, d.timeend
+ FROM {forum_discussions} d
+ JOIN {forum_posts} p ON d.firstpost = p.id
+ WHERE d.forum = :forumid
+ AND d.id <> :discid1
+ $timelimit
+ $groupselect";
+
+ $sub = "SELECT pp.created
+ FROM {forum_discussions} dd
+ JOIN {forum_posts} pp ON dd.firstpost = pp.id
+ WHERE dd.id = :discid2";
+
+ $prevsql = $sql . " AND p.created < ($sub)
+ ORDER BY p.created DESC";
+
+ $nextsql = $sql . " AND p.created > ($sub)
+ ORDER BY p.created ASC";
+
+ $neighbours['prev'] = $DB->get_record_sql($prevsql, $params, IGNORE_MULTIPLE);
+ $neighbours['next'] = $DB->get_record_sql($nextsql, $params, IGNORE_MULTIPLE);
+
+ } else {
+ $params['forumid'] = $cm->instance;
+ $params['discid'] = $discussion->id;
+ $params['disctimemodified'] = $discussion->timemodified;
- $prevsql = $sql . " AND d.timemodified < :disctimemodified
- ORDER BY d.timemodified DESC";
+ $sql = "SELECT d.id, d.name, d.timemodified, d.groupid, d.timestart, d.timeend
+ FROM {forum_discussions} d
+ WHERE d.forum = :forumid
+ AND d.id <> :discid
+ $timelimit
+ $groupselect";
- $nextsql = $sql . " AND d.timemodified > :disctimemodified
- ORDER BY d.timemodified ASC";
+ $prevsql = $sql . " AND d.timemodified < :disctimemodified
+ ORDER BY d.timemodified DESC";
- $neighbours['prev'] = $DB->get_record_sql($prevsql, $params, IGNORE_MULTIPLE);
- $neighbours['next'] = $DB->get_record_sql($nextsql, $params, IGNORE_MULTIPLE);
+ $nextsql = $sql . " AND d.timemodified > :disctimemodified
+ ORDER BY d.timemodified ASC";
+
+ $neighbours['prev'] = $DB->get_record_sql($prevsql, $params, IGNORE_MULTIPLE);
+ $neighbours['next'] = $DB->get_record_sql($nextsql, $params, IGNORE_MULTIPLE);
+ }
return $neighbours;
}
* @param boolean $cantrack Is tracking enabled for this forum.
* @param boolean $forumtracked Is the user tracking this forum.
* @param boolean $canviewparticipants True if user has the viewparticipants permission for this course
+ * @param boolean $canviewhiddentimedposts True if user has the viewhiddentimedposts permission for this forum
*/
-function forum_print_discussion_header(&$post, $forum, $group=-1, $datestring="",
- $cantrack=true, $forumtracked=true, $canviewparticipants=true, $modcontext=NULL) {
+function forum_print_discussion_header(&$post, $forum, $group = -1, $datestring = "",
+ $cantrack = true, $forumtracked = true, $canviewparticipants = true, $modcontext = null,
+ $canviewhiddentimedposts = false) {
- global $COURSE, $USER, $CFG, $OUTPUT;
+ global $COURSE, $USER, $CFG, $OUTPUT, $PAGE;
static $rowcount;
static $strmarkalldread;
$post->subject = format_string($post->subject,true);
+ $timeddiscussion = !empty($CFG->forum_enabletimedposts) && ($post->timestart || $post->timeend);
+ $timedoutsidewindow = '';
+ if ($timeddiscussion && ($post->timestart > time() || ($post->timeend != 0 && $post->timeend < time()))) {
+ $timedoutsidewindow = ' dimmed_text';
+ }
+
echo "\n\n";
- echo '<tr class="discussion r'.$rowcount.'">';
+ echo '<tr class="discussion r'.$rowcount.$timedoutsidewindow.'">';
// Topic
echo '<td class="topic starter">';
+
+ $canalwaysseetimedpost = $USER->id == $post->userid || $canviewhiddentimedposts;
+ if ($timeddiscussion && $canalwaysseetimedpost) {
+ echo $PAGE->get_renderer('mod_forum')->timed_discussion_tooltip($post, empty($timedoutsidewindow));
+ }
+
echo '<a href="'.$CFG->wwwroot.'/mod/forum/discuss.php?d='.$post->discussion.'">'.$post->subject.'</a>';
echo "</td>\n";
}
$canviewparticipants = has_capability('moodle/course:viewparticipants',$context);
+ $canviewhiddentimedposts = has_capability('mod/forum:viewhiddentimedposts', $context);
$strdatestring = get_string('strftimerecentfull');
$group = -1;
}
forum_print_discussion_header($discussion, $forum, $group, $strdatestring, $cantrack, $forumtracked,
- $canviewparticipants, $context);
+ $canviewparticipants, $context, $canviewhiddentimedposts);
break;
default:
$link = false;