/** * Displays the view page (usually showing a list of discussions). * @param mod_forumng $forum Forum * @param int $groupid Group ID */ function print_view_page($forum, $groupid) { global $PAGE; $out = mod_forumng_utils::get_renderer(); $forumngid = $forum->get_id(); $baseurl = 'list.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN); $sortorder = optional_param('sort', '', PARAM_ALPHA); if (!$sortorder) { $sortlink = optional_param('sortlink', '', PARAM_ALPHA); if ($sortlink) { $sortorder = $sortlink; } else { $sortorder = 'd'; } } $page = optional_param('page', 0, PARAM_INT); if (!$page) { $page = 1; } $baseurl .= '&page=' . $page; $sortchar = substr($sortorder, 0, 1); if (strlen($sortorder) == 2) { $sortreverse = substr($sortorder, 1, 1) == 'r' ? true : false; } else { $sortreverse = false; } $baseurl .= '&sort=' . $sortchar; $baseurl .= $sortreverse ? 'r' : ''; $sort = mod_forumng::get_sort_code($sortchar); $list = $forum->get_discussion_list($groupid, $forum->can_view_hidden(), $page, $sort, $sortreverse); $normal = $list->get_normal_discussions(); $fg = new forumngtype_general(); // Remove discussions from list if the forumtype thinks we can't see them or they are not deleted. foreach ($normal as $key => $value) { if (!$fg->can_view_discussion($value) || !$value->is_deleted()) { unset($normal[$key]); } } $pagecount = get_page_count(count($normal), $page); // Intro. print $out->render_intro($forum); print display_paging_bar($baseurl, $pagecount, $page); if (count($normal) > 0) { print $out->render_discussion_list_start($forum, $groupid, $baseurl, $sort, $sortreverse); foreach ($normal as $discussion) { if ($discussion->is_deleted()) { print $out->render_discussion_list_item($discussion, $groupid, $discussion == end($normal)); } } print $out->render_discussion_list_end($forum, $groupid); } else { print '<p class="forumng-nodiscussions">' . get_string('nodeleteddiscussions', 'forumngfeature_deletedposts') . '</p>'; } print display_paging_bar($baseurl, $pagecount, $page); }
/** * Displays the view page (usually showing a list of discussions). * @param mod_forumng $forum Forum * @param int $groupid Group ID */ public function print_view_page($forum, $groupid) { global $SESSION, $PAGE, $USER; $out = mod_forumng_utils::get_renderer(); $forumngid = $forum->get_id(); $baseurl = 'view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN); if (isset($SESSION->forumng_discussionlist[$forumngid]) && property_exists($SESSION->forumng_discussionlist[$forumngid], 'groupid') && $SESSION->forumng_discussionlist[$forumngid]->groupid != $groupid) { unset($SESSION->forumng_discussionlist[$forumngid]->page); unset($SESSION->forumng_discussionlist[$forumngid]->groupid); } // Remember the sort order and page number in session variables // Unset the page session variable when the sort links are clicked // or groupid has been changed (using the group dropdown box) $sortorder = optional_param('sort', '', PARAM_ALPHA); if (!$sortorder) { if (isset($SESSION->forumng_discussionlist[$forumngid]->sort)) { $sortorder = $SESSION->forumng_discussionlist[$forumngid]->sort; } else { $sortorder = 'd'; } } else { if (optional_param('sortlink', '', PARAM_ALPHA)) { if (!isset($SESSION->forumng_discussionlist[$forumngid])) { $SESSION->forumng_discussionlist[$forumngid] = new stdClass(); } $SESSION->forumng_discussionlist[$forumngid]->sort = $sortorder; unset($SESSION->forumng_discussionlist[$forumngid]->page); } } $page = optional_param('page', 0, PARAM_INT); if (!$page) { if (isset($SESSION->forumng_discussionlist[$forumngid]->page)) { $page = $SESSION->forumng_discussionlist[$forumngid]->page; } else { $page = 1; } } else { if (!isset($SESSION->forumng_discussionlist[$forumngid])) { $SESSION->forumng_discussionlist[$forumngid] = new stdClass(); } $SESSION->forumng_discussionlist[$forumngid]->page = $page; $SESSION->forumng_discussionlist[$forumngid]->groupid = $groupid; } $baseurl .= '&page=' . $page; $sortchar = substr($sortorder, 0, 1); if (strlen($sortorder) == 2) { $sortreverse = substr($sortorder, 1, 1) == 'r' ? true : false; } else { $sortreverse = false; } $baseurl .= '&sort=' . $sortchar; $baseurl .= $sortreverse ? 'r' : ''; $sort = mod_forumng::get_sort_code($sortchar); // Get tagid if used. $tag = optional_param('tag', null, PARAM_ALPHANUM); $list = $forum->get_discussion_list($groupid, $forum->can_view_hidden(), $page, $sort, $sortreverse, 0, true, $tag); $sticky = $list->get_sticky_discussions(); $normal = $list->get_normal_discussions(); // Remove discussions from list if the forumtype thinks we can't see // them foreach ($sticky as $key => $value) { if (!$this->can_view_discussion($value)) { unset($sticky[$key]); } } foreach ($normal as $key => $value) { if (!$this->can_view_discussion($value)) { unset($normal[$key]); } } // Intro print $out->render_intro($forum); // Flagged posts skip link. $flaggedposts = $forum->get_flagged_posts(); $flagdiscussions = $forum->get_flagged_discussions(); $flaggeddiscussions = array(); // Need to loop through flagged discussions removing any that can not be viewed by user. foreach ($flagdiscussions as $discussion) { if ($discussion->can_view($USER->id)) { // Add to flagged discussions. array_push($flaggeddiscussions, $discussion); } } if (count($flaggedposts) + count($flaggeddiscussions) > 0) { $output = html_writer::start_tag('div', array('class' => 'forumng-flagged-link')); $output .= $out->render_flagged_list_link($flaggeddiscussions, true); $output .= $out->render_flagged_list_link($flaggedposts); $output .= html_writer::end_tag('div'); echo $output; } // Draft posts $drafts = $forum->get_drafts(); if (count($drafts) > 0) { print $out->render_draft_list_start(); foreach ($drafts as $draft) { print $out->render_draft_list_item($forum, $draft, $draft == end($drafts)); } print $out->render_draft_list_end(); } // Print info about the start and end dates of the forum from the form setting $stringend = has_capability('mod/forumng:ignorepostlimits', $forum->get_context()) ? 'capable' : ''; $startdate = $forum->get_postingfrom(); $enddate = $forum->get_postinguntil(); // Before start date if (time() < $startdate) { $message = get_string('beforestartdate' . $stringend, 'forumng', mod_forumng_utils::display_date($startdate)); print "<div class='forumng-show-dates'>{$message}</div>"; } else { if (time() < $enddate) { $message = get_string('beforeenddate' . $stringend, 'forumng', mod_forumng_utils::display_date($enddate)); print "<div class='forumng-show-dates'>{$message}</div>"; } } // After end date if ($enddate && time() >= $enddate) { $message = get_string('afterenddate' . $stringend, 'forumng', mod_forumng_utils::display_date($enddate)); print "<div class='forumng-show-dates'>{$message}</div>"; } // Show Alert info. if ($forum->has_reporting_email()) { print $out->box(get_string('alert_intro', 'forumng'), 'generalbox', 'forumng-reportingon'); } // Post button - temporarily disabled when in all-groups mode print $groupid == null ? '' : $forum->display_post_button($groupid); if ($taglist = $forum->get_tags_used($groupid)) { print $out->render_tag_filter($taglist, $forum, $tag); } // Provide link to skip sticky discussions. if (count($sticky) > 0 && count($normal) > 0) { print $out->render_skip_link(key($normal)); } print $list->display_paging_bar($baseurl); if (count($sticky) + count($normal) > 0) { print $out->render_discussion_list_start($forum, $groupid, $baseurl, $sort, $sortreverse); foreach ($sticky as $discussion) { print $out->render_discussion_list_item($discussion, $groupid, count($normal) == 0 && $discussion == end($sticky)); } if (count($sticky) > 0 && count($normal) > 0) { print $out->render_discussion_list_divider($forum, $groupid); } foreach ($normal as $discussion) { print $out->render_discussion_list_item($discussion, $groupid, $discussion == end($normal)); } print $out->render_discussion_list_end($forum, $groupid); } else { print '<p class="forumng-nodiscussions">' . $this->get_string($forum, 'nodiscussions') . '</p>'; } print $list->display_paging_bar($baseurl); print $forum->display_forumngfeature_discussion_lists($groupid); // Flagged discussions. if (count($flaggeddiscussions) > 0) { print $out->render_flagged_list_start(true); foreach ($flaggeddiscussions as $discussion) { print $out->render_flagged_discuss_list_item($discussion, $discussion === end($flaggeddiscussions)); } print $out->render_flagged_list_end(); } // Flagged posts. if (count($flaggedposts) > 0) { print $out->render_flagged_list_start(); foreach ($flaggedposts as $post) { print $out->render_flagged_list_item($post, $post === end($flaggedposts)); } print $out->render_flagged_list_end(); } // Subscribe and view subscribers links print $forum->display_subscribe_options(); // Atom/RSS links print $forum->display_feed_links($groupid); // display the warning message for invalid archive setting print $forum->display_archive_warning(); // Display sharing information print $forum->display_sharing_info(); }
/** * This function handles all aspects of page processing and then calls * methods in $selector at the appropriate moments. * @param post_selector $selector Object that extends this base class */ public static function go($selector) { global $PAGE, $FULLME, $SESSION; $id = required_param('id', PARAM_INT); $cloneid = optional_param('clone', 0, PARAM_INT); $fromselect = optional_param('fromselect', 0, PARAM_INT); $all = optional_param('all', '', PARAM_RAW); $select = optional_param('select', '', PARAM_RAW); $isform = optional_param('postselectform', 0, PARAM_INT); $PAGE->set_url($FULLME); // Get basic objects. $forum = mod_forumng::get_from_cmid($id, $cloneid); $forumngid = $forum->get_id(); $params = array_merge($_REQUEST, $forum->get_link_params_array()); if (optional_param('cancel', '', PARAM_RAW)) { // CALL TYPE 6. redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } $cm = $forum->get_course_module(); $course = $forum->get_course(); $groupid = mod_forumng::get_activity_group($cm, true); // Page name and permissions. $pagename = $selector->get_page_name(); $buttonname = $selector->get_button_name(); $forum->require_view($groupid); $selector->require_capability($forum->get_context(), $forum); if (!($fromselect || $isform || $all)) { // Either an initial request (non-JS) to display the 'dialog' box, // or a request to show the list of posts with checkboxes for selection. // Both types share same navigation. $out = $forum->init_page(new moodle_url('/mod/forumng/view.php', $forum->get_link_params_array())); print $out->header(); if (!$select) { // Show initial dialog. print $out->box_start(); print html_writer::tag('h2', $buttonname); print html_writer::start_tag('form', array('action' => $_SERVER['PHP_SELF'], 'method' => 'get', 'id' => 'discsel')); print html_writer::start_tag('div'); foreach ($params as $param => $paramval) { print html_writer::empty_tag('input', array('name' => $param, 'type' => 'hidden', 'value' => $paramval)); } print html_writer::tag('p', get_string('selectordiscall', 'forumng')); print html_writer::start_tag('div', array('class' => 'forumng-buttons')); print html_writer::empty_tag('input', array('name' => 'all', 'type' => 'submit', 'value' => get_string('selectoralldisc', 'forumng'))); print html_writer::empty_tag('input', array('name' => 'select', 'type' => 'submit', 'value' => get_string('selectorselecteddisc', 'forumng'))); print html_writer::empty_tag('input', array('name' => 'cancel', 'type' => 'submit', 'value' => get_string('cancel'))); print html_writer::end_tag('div'); print html_writer::end_tag('div'); print html_writer::end_tag('form'); print $out->box_end(); } else { // Show list of posts to select. print html_writer::start_tag('div', array('class' => 'forumng-selectintro')); print html_writer::tag('p', get_string('selectdiscintro', 'forumng')); print html_writer::end_tag('div'); print html_writer::start_tag('form', array('action' => $_SERVER['PHP_SELF'], 'method' => 'post', 'id' => 'discsel')); print html_writer::start_tag('div'); print $forum->get_link_params(mod_forumng::PARAM_FORM); print html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'fromselect', 'value' => '1')); foreach ($params as $param => $paramval) { print html_writer::empty_tag('input', array('name' => $param, 'type' => 'hidden', 'value' => $paramval)); } // Now show discussions, allow for override at type level if following is no good. if (method_exists($forum->get_type(), 'print_select_page')) { print $forum->get_type()->print_select_page($forum, $groupid); } else { // Use default processing, get view and hack in selectors. ob_start(); $forum->get_type()->print_view_page($forum, $groupid); $discussionhtml = ob_get_contents(); ob_end_clean(); // Try and hack into the discussion list - must be xhtml... $doc = new DOMDocument('1.0', 'utf-8'); @$doc->loadHTML($discussionhtml); $docnew = new DOMDocument('1.0', 'utf-8'); $xpath = new DOMXPath($doc); $lists = $xpath->query("//table[contains(concat(' ',normalize-space(@class),' '),' forumng-discussionlist ')]"); // Remove all links. foreach ($lists as $list) { $links = $xpath->query("//a|//form", $list); foreach ($links as $node) { if ($node->nodeName == 'a') { // Disable links. $node->removeAttribute('href'); } else { // Remove any forms. $node->parentNode->removeChild($node); } } // Add in discussion select. $rows = $xpath->query("//table[@class='generaltable forumng-discussionlist']\n //tr[not(@class) or @class!='forumng-divider']", $list); for ($a = 0, $len = $rows->length; $a < $len; $a++) { // Add in select options for each row, checking types. $row = $rows->item($a); if ($a == 0) { $newcell = $doc->createElement('th', get_string('selectorselectdisc', 'mod_forumng')); $newcell->setAttribute('class', 'header'); $newcell->setAttribute('scope', 'col'); $row->appendChild($newcell); } else { $id = $row->getAttribute('id'); if (strpos($id, 'discrow') === false) { continue; } // Get discussion id from row id as added by renderer. $id = str_replace('discrow_', '', $id); // Check if we include checkbox or not. $classar = explode(' ', $row->getAttribute('class')); $includematches = array_intersect($selector->only_discussion_types(), $classar); $excludematches = array_intersect($selector->exclude_discussion_types(), $classar); if ((count($selector->only_discussion_types()) == 0 || count($includematches) > 0) && count($excludematches) == 0) { // OK to include, add checkbox and label. $select = $doc->createElement('input'); $select->setAttribute('type', 'checkbox'); $select->setAttribute('name', "selectd{$id}"); $select->setAttribute('id', "selectd{$id}"); $label = $doc->createElement('label', get_string('selectorselectdisc', 'mod_forumng')); $label->setAttribute('for', "selectd{$id}"); $label->setAttribute('class', 'accesshide'); $newcell = $doc->createElement('td'); $newcell->setAttribute('class', 'dselect'); $newcell->appendChild($select); $newcell->appendChild($label); $row->appendChild($newcell); } else { $newcell = $doc->createElement('td', ' '); $row->appendChild($newcell); } } } // Keep only discussion list by moving to new xml doc. $newnode = $docnew->importNode($list, true); $docnew->appendChild($newnode); } print $docnew->saveHTML(); } print html_writer::start_tag('div', array('class' => 'forumng-selectoutro')); print html_writer::empty_tag('input', array('type' => 'submit', 'value' => get_string('confirmselection', 'forumng'))); print html_writer::empty_tag('input', array('type' => 'submit', 'name' => 'cancel', 'value' => get_string('cancel'))); print html_writer::end_tag('div'); print html_writer::end_tag('div'); print html_writer::end_tag('form'); } // Display footer. print $out->footer(); } else { // Call types 3, 4, and 5 use the form (and may include list of postids). $postids = array(); $selectedids = array(); foreach ($_POST as $field => $value) { $matches = array(); if (!is_array($value) && (string) $value !== '0' && preg_match('~^selectd([0-9]+)$~', $field, $matches)) { $selectedids[] = $matches[1]; } } if (!empty($selectedids)) { // Check access. foreach ($selectedids as $id) { $discuss = mod_forumng_discussion::get_from_id($id, $cloneid); if ($forum->get_type()->can_view_discussion($discuss)) { $postids[] = $id; } } } else { if (!$all) { // No slections made. redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } // Work out discussion list for this page (e.g. selected All). $sortorder = optional_param('sort', 'd', PARAM_ALPHA); if (isset($SESSION->forumng_discussionlist[$forumngid]->sort)) { $sortorder = $SESSION->forumng_discussionlist[$forumngid]->sort; } $page = optional_param('page', 1, PARAM_INT); if (isset($SESSION->forumng_discussionlist[$forumngid]->page)) { $page = $SESSION->forumng_discussionlist[$forumngid]->page; } $sortchar = substr($sortorder, 0, 1); if (strlen($sortorder) == 2) { $sortreverse = substr($sortorder, 1, 1) == 'r' ? true : false; } else { $sortreverse = false; } $sort = mod_forumng::get_sort_code($sortchar); $list = $forum->get_discussion_list($groupid, $forum->can_view_hidden(), $page, $sort, $sortreverse); $discussionsarr = array_merge($list->get_sticky_discussions(), $list->get_normal_discussions()); // Double check ID is valid and user can view. for ($a = 0; $a < count($discussionsarr); $a++) { if ($forum->get_type()->can_view_discussion($discussionsarr[$a])) { $postids[] = $discussionsarr[$a]->get_id(); } } } $out = $forum->init_page(new moodle_url('/mod/forumng/view.php', $forum->get_link_params_array()), $pagename); // Get form to use. $mform = $selector->get_form($forum, $all, $postids); if (!$mform) { // Some options do not need a confirmation form; in that case, // just apply the action immediately. $selector->apply($forum, $all, $postids, null); exit; } // Check cancel. if ($mform->is_cancelled()) { redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } if ($fromform = $mform->get_data()) { // User submitted form to confirm process, which should now be // applied by selector. $selector->apply($forum, $all, $postids, $fromform); exit; } else { print $out->header(); // User requested form either via JavaScript or the other way, and // either with all messages or the whole discussion. // Print form. print $mform->display(); // Print optional content that goes after form. print $selector->get_content_after_form($forum, $all, $postids, $fromform); // Display footer. print $out->footer(); } } }