public function display($forum) { $params = $forum->get_link_params_array(); if ($forum->get_group_mode()) { $params['group'] = mod_forumng::get_activity_group($forum->get_course_module()); } return parent::get_button($forum, get_string('markallread', 'forumngfeature_markallread'), 'markread.php', true, $params); }
public function get_form($discussion, $all, $selected = array()) { global $CFG, $PAGE; foreach ($selected as $postid) { $params['selectd' . $postid] = $postid; } $params['id'] = $discussion->get_course_module_id(); $params['group'] = mod_forumng::get_activity_group($discussion->get_course_module()); $params['clone'] = optional_param('clone', 0, PARAM_INT); $params['fromselect'] = true; $customdata = array('params' => $params, 'isdiscussion' => false, 'edit' => false, 'ispost' => true, 'islock' => true, 'post' => null, 'isroot' => true, 'forum' => $discussion); return new mod_forumng_editpost_form('lockall.php', $customdata); }
public function get_form($forum, $all, $selected = array()) { global $CFG, $PAGE; foreach ($selected as $discussionid) { $params['selectd' . $discussionid] = $discussionid; } $params['id'] = $forum->get_course_module_id(); $params['clone'] = optional_param('clone', 0, PARAM_INT); $group = mod_forumng::get_activity_group($forum->get_course_module()); if (empty($group)) { $group = 0; } $params['group'] = $group; $params['multigroups'] = optional_param('multigroups', 0, PARAM_INT); $customdata = array('params' => $params, 'forum' => $forum); return new mod_forumng_moveall_form('movealltogroups.php', $customdata); }
*/ require_once '../../../../config.php'; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; require_once $CFG->dirroot . '/mod/forumng/feature/usage/locallib.php'; $cmid = required_param('id', PARAM_INT); $cloneid = optional_param('clone', 0, PARAM_INT); $ratings = optional_param('ratings', 0, PARAM_INT); $pageparams = array('id' => $cmid); if ($cloneid) { $pageparams['clone'] = $cloneid; } $forum = mod_forumng::get_from_cmid($cmid, $cloneid); $course = $forum->get_course(); $cm = $forum->get_course_module(); $context = $forum->get_context(); $groupid = mod_forumng::get_activity_group($cm, true); if ($groupid != mod_forumng::NO_GROUPS && $groupid != mod_forumng::ALL_GROUPS) { $pageparams['group'] = $groupid; $groupwhere = 'AND (fd.groupid = ? OR fd.groupid IS NULL)'; $groupparams = array($groupid); } else { $groupwhere = ''; $groupparams = array(); } $ajaxparams = $pageparams; // Check access. $forum->require_view($groupid); require_capability('forumngfeature/usage:view', $forum->get_context()); // Print page header. $thisurl = new moodle_url('/mod/forumng/feature/usage/usage.php', $pageparams); $mainrenderer = $forum->init_page($thisurl, get_string('title', 'forumngfeature_usage'));
redirect('../../view.php?' . $forum->get_link_params(mod_forumng::PARAM_PLAIN)); } $targetgroup = optional_param('group', 0, PARAM_INT); $target = optional_param('forum', 0, PARAM_INT); if ($target == 0) { $target = required_param('target', PARAM_INT); } $targetforum = mod_forumng::get_from_cmid($target, mod_forumng::CLONE_DIRECT); // Sets up chosen target group. $chosentargetgroup = optional_param('chosengroup', 0, PARAM_INT); if (!$targetgroup) { $targetgroup = $chosentargetgroup; } if (!$targetgroup) { $cm = $forum->get_course_module(); $targetgroup = mod_forumng::get_activity_group($cm, false); } // Security check against user and their capabilities. $forum->require_view($targetgroup); check_move_permissions($forum, $targetforum); // If it is a clone, find the original. $targetforum = $targetforum->get_real_forum(); $targetgroupmode = $targetforum->get_group_mode(); // Get selected ids. $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]; } }
/** * Display subscribe options. * @param mod_forumng $forum Forum * @param string $text Textual note * @param int $subscribed * @param bool $button True if subscribe/unsubscribe button should be shown * @param bool $viewlink True if 'view subscribers' link should be shown * @return string HTML code for this area */ public function render_subscribe_options($forum, $text, $subscribed, $button, $viewlink) { $out = '<div class="forumng-subscribe-options">' . '<h3>' . get_string('subscription', 'forumng') . '</h3>' . '<p>' . $text . '</p>'; $cm = $forum->get_course_module(); if ($button) { $outsubmit = ''; $currentgroupid = mod_forumng::get_activity_group($cm, true); if ($currentgroupid == mod_forumng::NO_GROUPS) { $currentgroupid = 0; } if ($subscribed == mod_forumng::FULLY_SUBSCRIBED || $subscribed == mod_forumng::FULLY_SUBSCRIBED_GROUPMODE) { $outsubmit .= '<input type="submit" name="submitunsubscribe" value="' . get_string('unsubscribeshort', 'forumng') . '" />'; } else { if ($subscribed == mod_forumng::PARTIALLY_SUBSCRIBED) { // Print both subscribe button and unsubscribe button. $outsubmit .= '<input type="submit" name="submitsubscribe" value="' . get_string('subscribelong', 'forumng') . '" />' . '<input type="submit" name="submitunsubscribe" value="' . get_string('unsubscribelong', 'forumng') . '" />'; } else { if ($subscribed == mod_forumng::NOT_SUBSCRIBED) { // Default unsubscribed, print subscribe button. $outsubmit .= '<input type="submit" name="submitsubscribe" value="' . get_string('subscribeshort', 'forumng') . '" />'; } else { if ($subscribed == mod_forumng::THIS_GROUP_PARTIALLY_SUBSCRIBED) { $outsubmit .= '<input type="submit" name="submitsubscribe_thisgroup" value="' . get_string('subscribegroup', 'forumng') . '" />' . '<input type="submit" name="submitunsubscribe_thisgroup" value="' . get_string('unsubscribegroup_partial', 'forumng') . '" />' . '<input type="hidden" name="g" value="' . $currentgroupid . '" />'; } else { if ($subscribed == mod_forumng::THIS_GROUP_SUBSCRIBED) { $outsubmit .= '<input type="submit" name="submitunsubscribe_thisgroup" value="' . get_string('unsubscribegroup', 'forumng') . '" />' . '<input type="hidden" name="g" value="' . $currentgroupid . '" />'; } else { if ($subscribed == mod_forumng::THIS_GROUP_NOT_SUBSCRIBED) { $outsubmit .= '<input type="submit" name="submitsubscribe_thisgroup" value="' . get_string('subscribegroup', 'forumng') . '" />' . '<input type="hidden" name="g" value="' . $currentgroupid . '" />'; } } } } } } $out .= ' <form action="subscribe.php" method="post"><div>' . $forum->get_link_params(mod_forumng::PARAM_FORM) . '<input type="hidden" name="back" value="view" />' . $outsubmit . '</div></form>'; } if ($subscribed != mod_forumng::NOT_SUBSCRIBED) { $out .= $this->render_subscribe_info($forum->get_context()); } if ($viewlink) { $out .= ' <div class="forumng-subscribe-admin">' . '<a href="subscribers.php?' . $forum->get_link_params(mod_forumng::PARAM_HTML) . '">' . get_string('viewsubscribers', 'forumng') . '</a></div>'; } $out .= '</div>'; return $out; }
$canunsubscribesomething = true; $submitbutton = "<input type='submit' name='submitunsubscribe'\n value='{$strunsubscribe}'/>"; } else { $cansubscribesomething = true; $submitbutton = "<input type='submit' name='submitsubscribe'\n value='{$strsubscribe}'/>"; } $subscribetext .= " " . "<form method='post' action='subscribe.php'><div>" . $forum->get_link_params(mod_forumng::PARAM_FORM) . "<input type='hidden' name='back' value='index' />" . $submitbutton . "</div></form>"; } $subscribetext .= '</div>'; $row[] = $subscribetext; } // If this forum has RSS/Atom feeds, show link if ($showrss) { if ($type = $forum->get_effective_feed_option()) { // Get group (may end up being none) $groupid = mod_forumng::get_activity_group($forum->get_course_module(), false); $row[] = $forum->display_feed_links($groupid); } else { $row[] = ' '; } } $table->data[] = $row; } print html_writer::table($table); // 'Subscribe all' links if ($canmaybesubscribe) { print '<div class="forumng-allsubscribe">'; $subscribedisabled = $cansubscribesomething ? '' : 'disabled="disabled"'; $unsubscribedisabled = $canunsubscribesomething ? '' : 'disabled="disabled"'; print "<form method='post' action='subscribe.php'><div>" . "<input type='hidden' name='course' value='{$course->id}' />" . "<input type='hidden' name='back' value='index' />" . "<input type='submit' name='submitsubscribe' value='" . get_string('allsubscribe', 'forumng') . "' {$subscribedisabled}/>" . "<input type='submit' name='submitunsubscribe' value='" . get_string('allunsubscribe', 'forumng') . "' {$unsubscribedisabled}/>" . "</div></form> "; print '</div>';
/** * Checks forum object created in test_get_forum() * In function so same tests can be carried out on multiple forum setups * @param object $forum * @param object $course * @param object $cm */ private function check_forum_settings(mod_forumng $forum, $course, $cm) { $this->assertEquals('TEST', $forum->get_name()); $this->assertEquals('abc123', $forum->get_intro()); $this->assertEquals('abc123', $forum->get_intro(true)); // Pick up errors in abbreviation. $this->assertEquals(FORMAT_MOODLE, $forum->get_intro_format()); $this->assertEquals($cm->instance, $forum->get_id()); $this->assertEquals($course->id, $forum->get_course_id()); $this->assertEquals($course->id, $forum->get_course()->id); $this->assertEquals($cm->id, $forum->get_course_module_id()); $this->assertEquals(mod_forumng::NO_GROUPS, $forum->get_activity_group($cm)); $context = context_module::instance($cm->id); $this->assertEquals($context->id, $forum->get_context()->id); $this->assertInstanceOf('forumngtype', $forum->get_type()); }
public function load_data() { global $DB, $COURSE; // Load base data $this->load_base_data($this->forumngid); // Get all files used in the discussions. if ($this->discussionids == '') { // Fallback in case nothing sent - get every discussion in forum! $this->discussionids = array(); $groupid = mod_forumng::get_activity_group($this->cm, true); if ($groupid == -1) { $groupid = null; } $discussions = $DB->get_records('forumng_discussions', array('forumngid' => $this->cm->instance, 'groupid' => $groupid), '', 'id, postid'); foreach ($discussions as $discussionrec) { if (!$discussionrec->postid) { continue; } $discussion = mod_forumng_discussion::get_from_id($discussionrec->id, $this->cloneid); if ($discussion->can_view()) { $this->discussionids[] = $discussion->get_id(); } } } else { $this->posts = $this->discussionids; // Set so decode works. $this->discussionids = $this->decode_string_to_array(); $this->posts = ''; } if (empty($this->discussionids)) { throw new moodle_exception('exportallnodisc', 'forumngfeature_export', $this->get_return_url()); } foreach ($this->discussionids as $discussionid) { $this->discussionid = $discussionid; $this->add_files(); } }
/** * 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(); } } }