コード例 #1
0
/**
 * 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);
}
コード例 #2
0
 /**
  * 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', '&nbsp;');
                                 $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();
         }
     }
 }