mod-forum MDL-17550 Converted subscribers.php to use the new user_selector control

At the same time I also converted weblib.php::check_theme_arrows to use UTF8 arrows rather than entities.
This commit is contained in:
Sam Hemelryk
2009-12-10 02:11:28 +00:00
parent 8379764371
commit c23c90093e
7 changed files with 364 additions and 199 deletions
+6 -6
View File
@@ -1926,8 +1926,8 @@ function check_theme_arrows() {
if (!isset($THEME->rarrow) and !isset($THEME->larrow)) {
// Default, looks good in Win XP/IE 6, Win/Firefox 1.5, Win/Netscape 8...
// Also OK in Win 9x/2K/IE 5.x
$THEME->rarrow = '►';
$THEME->larrow = '◄';
$THEME->rarrow = '►'; // ►
$THEME->larrow = '◄'; // ◄
if (empty($_SERVER['HTTP_USER_AGENT'])) {
$uagent = '';
} else {
@@ -1937,12 +1937,12 @@ function check_theme_arrows() {
|| false !== strpos($uagent, 'Mac')) {
// Looks good in Win XP/Mac/Opera 8/9, Mac/Firefox 2, Camino, Safari.
// Not broken in Mac/IE 5, Mac/Netscape 7 (?).
$THEME->rarrow = '▶';
$THEME->larrow = '◀';
$THEME->rarrow = '▶'; // ▶
$THEME->larrow = '◀'; // ◀
}
elseif (false !== strpos($uagent, 'Konqueror')) {
$THEME->rarrow = '→';
$THEME->larrow = '←';
$THEME->rarrow = '→'; // →
$THEME->larrow = '←'; // ←
}
elseif (isset($_SERVER['HTTP_ACCEPT_CHARSET'])
&& false === stripos($_SERVER['HTTP_ACCEPT_CHARSET'], 'utf-8')) {
+26
View File
@@ -0,0 +1,26 @@
#mod-forum-subscribers .subscriberdiv,
#mod-forum-subscribers .subscribertable {
width:100%;
background-color:#EEEEEE;
border:1px solid #BBBBBB;
}
#mod-forum-subscribers .subscriberdiv,
#mod-forum-subscribers .subscribertable tr td {
vertical-align:top;
padding:0.2em 0.3em;
}
#mod-forum-subscribers .subscribertable tr td.existing {
width:42%;
}
#mod-forum-subscribers .subscribertable tr td.actions {
width:16%;
padding-top:3em;
}
#mod-forum-subscribers .subscribertable tr td.actions .actionbutton {
margin:0.3em 0;
padding:0.5em 0;
width:100%;
}
#mod-forum-subscribers .subscribertable tr td.potential {
width:42%;
}
+123 -2
View File
@@ -16,7 +16,7 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package mod-forum
* @package forum
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -26,6 +26,7 @@ require_once($CFG->libdir.'/filelib.php');
require_once($CFG->libdir.'/eventslib.php');
require_once($CFG->libdir.'/portfoliolib.php');
require_once($CFG->libdir . '/completionlib.php');
require_once($CFG->dirroot.'/user/selector/lib.php');
/// CONSTANTS ///////////////////////////////////////////////////////////
@@ -7964,7 +7965,7 @@ function forum_get_extra_capabilities() {
}
/**
* @package mod-forum
* @package forum
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -8499,3 +8500,123 @@ function forum_extend_settings_navigation($settingsnav, $module=null) {
return $forumkey;
}
abstract class forum_subscriber_selector_base extends user_selector_base {
protected $forumid = null;
protected $context = null;
protected $currentgroup = null;
public function __construct($name, $options) {
parent::__construct($name, $options);
if (isset($options['context'])) {
$this->context = $options['context'];
}
if (isset($options['currentgroup'])) {
$this->currentgroup = $options['currentgroup'];
}
if (isset($options['forumid'])) {
$this->forumid = $options['forumid'];
}
}
protected function get_options() {
global $CFG;
$options = parent::get_options();
$options['file'] = substr(__FILE__, strlen($CFG->dirroot.'/'));
$options['context'] = $this->context;
$options['currentgroup'] = $this->currentgroup;
$options['forumid'] = $this->forumid;
return $options;
}
}
class forum_potential_subscriber_selector extends forum_subscriber_selector_base {
protected $forcesubscribed = false;
protected $existingsubscribers = array();
public function __construct($name, $options) {
parent::__construct($name, $options);
if (isset($options['forcesubscribed'])) {
$this->forcesubscribed=true;
}
}
protected function get_options() {
$options = parent::get_options();
if ($this->forcesubscribed===true) {
$options['forcesubscribed']=1;
}
return $options;
}
public function find_users($search) {
global $DB;
$availableusers = forum_get_potential_subscribers($this->context, $this->currentgroup, $this->required_fields_sql('u'), 'firstname ASC, lastname ASC');
if (empty($availableusers)) {
$availableusers = array();
} else if ($search) {
$search = strtolower($search);
foreach ($availableusers as $key=>$user) {
if (stripos($user->firstname, $search) === false && stripos($user->lastname, $search) === false) {
unset($availableusers[$key]);
}
}
}
// Unset any existing subscribers
if (count($this->existingsubscribers)>0 && !$this->forcesubscribed) {
foreach ($this->existingsubscribers as $group) {
foreach ($group as $user) {
if (array_key_exists($user->id, $availableusers)) {
unset($availableusers[$user->id]);
}
}
}
}
if ($this->forcesubscribed) {
return array(get_string("existingsubscribers", 'forum') => $availableusers);
} else {
return array(get_string("potentialsubscribers", 'forum') => $availableusers);
}
}
public function set_existing_subscribers(array $users) {
$this->existingsubscribers = $users;
}
public function set_force_subscribed($setting=true) {
$this->forcesubscribed = true;
}
}
class forum_existing_subscriber_selector extends forum_subscriber_selector_base {
public function find_users($search) {
global $DB;
list($wherecondition, $params) = $this->search_sql($search, 'u');
$fields = 'SELECT ' . $this->required_fields_sql('u');
$from = ' FROM {user} u LEFT JOIN {forum_subscriptions} s ON s.userid=u.id';
$wherecondition .= ' AND s.forum=?';
$params[] = $this->forumid;
$order = ' ORDER BY lastname ASC, firstname ASC';
if ($this->currentgroup) {
$from .= ", {groups_members} gm ";
$wherecondition .= " AND gm.groupid = ? AND u.id = gm.userid";
$params[] = $this->currentgroup;
}
if (!$subscribers = $DB->get_records_sql($fields.$from.' WHERE '.$wherecondition.$order, $params)) {
$subscribers = array();
}
return array(get_string("existingsubscribers", 'forum') => $subscribers);
}
}
+136
View File
@@ -0,0 +1,136 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file contains a custom renderer class used by the forum module.
*
* @package forum
* @copyright 2009 Sam Hemelryk
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* A custom renderer class that extends the moodle_renderer_base and
* is used by the forum module.
*
* @package forum
* @copyright 2009 Sam Hemelryk
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
**/
class moodle_mod_forum_renderer extends moodle_renderer_base {
/**
* A reference to the current general renderer probably {@see moodle_core_renderer}
* @var moodle_renderer_base
*/
protected $output;
/**
* Contructor method, calls the parent constructor
* @param moodle_page $page
* @param moodle_renderer_base $output Probably moodle_core_renderer
*/
public function __construct($page, $output) {
parent::__construct($page);
$this->output = $output;
}
/**
* This method is used to generate HTML for a subscriber selection form that
* uses two user_selector controls
*
* @param user_selector_base $existinguc
* @param user_selector_base $potentialuc
* @return string
*/
public function subscriber_selection_form(user_selector_base $existinguc, user_selector_base $potentialuc) {
$output = '';
$formattributes = array();
$formattributes['id'] = 'subscriberform';
$formattributes['action'] = '';
$formattributes['method'] = 'post';
$output .= $this->output_start_tag('form', $formattributes);
$output .= $this->output_empty_tag('input', array('type'=>'hidden', 'name'=>'sesskey', 'value'=>sesskey()));
$existingcell = new html_table_cell();
$existingcell->text = $existinguc->display(true);
$existingcell->set_classes(array('existing'));
$actioncell = new html_table_cell();
$actioncell->text = $this->output_start_tag('div', array());
$actioncell->text .= $this->output_empty_tag('input', array('type'=>'submit', 'name'=>'subscribe', 'value'=>$this->page->theme->larrow.' '.get_string('add'), 'class'=>'actionbutton'));
$actioncell->text .= $this->output_empty_tag('br', array());
$actioncell->text .= $this->output_empty_tag('input', array('type'=>'submit', 'name'=>'unsubscribe', 'value'=>$this->page->theme->rarrow.' '.get_string('remove'), 'class'=>'actionbutton'));
$actioncell->text .= $this->output_end_tag('div', array());
$actioncell->set_classes(array('actions'));
$potentialcell = new html_table_cell();
$potentialcell->text = $potentialuc->display(true);
$potentialcell->set_classes(array('potential'));
$table = new html_table();
$table->set_classes(array('subscribertable','boxaligncenter'));
$table->data = array(html_table_row::make(array($existingcell, $actioncell, $potentialcell)));
$output .= $this->output->table($table);
$output .= $this->output_end_tag('form');
return $output;
}
/**
* This function generates HTML to display a subscriber overview, primarily used on
* the subscribers page if editing was turned off
*
* @param array $users
* @param object $forum
* @param object $course
* @return string
*/
public function subscriber_overview($users, $forum , $course) {
$output = '';
if (!$users || !is_array($users) || count($users)===0) {
$output .= $this->output->heading(get_string("nosubscribers", "forum"));
} else {
$output .= $this->output->heading(get_string("subscribersto","forum", "'".format_string($forum->name)."'"));
$table = new html_table();
$table->cellpadding = 5;
$table->cellspacing = 5;
$table->tablealign = 'center';
$table->data = array();
foreach ($users as $user) {
$table->data[] = array($this->output->user_picture(moodle_user_picture::make($user, $course->id)), fullname($user), $user->email);
}
$output .= $this->output->table($table);
}
return $output;
}
/**
* This is used to display a control containing all of the subscribed users so that
* it can be searched
*
* @param user_selector_base $existingusers
* @return string
*/
public function subscribed_users(user_selector_base $existingusers) {
$output = $this->output->box_start('subscriberdiv boxaligncenter');
$output .= $this->output_tag('p', array(), get_string('forcessubscribe', 'forum'));
$output .= $existingusers->display(true);
$output .= $this->output->box_end();
return $output;
}
}
-71
View File
@@ -1,71 +0,0 @@
<form id="subscriberform" method="post" action="subscribers.php">
<input type="hidden" name="id" value="<?php echo $id?>" />
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />
<table align="center" border="0" cellpadding="5" cellspacing="0">
<tr>
<td valign="top">
<?php echo count($subscribers) . " ". $strexistingsubscribers ?>
</td>
<td></td>
<td valign="top">
<?php echo $strpotentialsubscribers ?>
</td>
</tr>
<tr>
<td valign="top">
<select name="removeselect[]" size="20" id="removeselect" multiple="multiple"
onFocus="getElementById('subscriberform').add.disabled=true;
getElementById('subscriberform').remove.disabled=false;
getElementById('subscriberform').addselect.selectedIndex=-1;">
<?php
foreach ($subscribers as $subscriber) {
$fullname = fullname($subscriber, true);
echo "<option value=\"$subscriber->id\">".$fullname.", ".$subscriber->email."</option>\n";
}
?>
</select></td>
<td valign="top">
<br />
<input name="add" type="submit" id="add" value="&larr;" />
<br />
<input name="remove" type="submit" id="remove" value="&rarr;" />
<br />
</td>
<td valign="top">
<select name="addselect[]" size="20" id="addselect" multiple="multiple"
onFocus="getElementById('subscriberform').add.disabled=false;
getElementById('subscriberform').remove.disabled=true;
getElementById('subscriberform').removeselect.selectedIndex=-1;">
<?php
if (isset($searchusers)) {
echo "<optgroup label=\"$strsearchresults (" . count($searchusers) . ")\">\n";
foreach ($searchusers as $user) {
$fullname = fullname($user, true);
echo "<option value=\"$user->id\">".$fullname.", ".$user->email."</option>\n";
}
echo "</optgroup>\n";
}
if (!empty($users)) {
foreach ($users as $user) {
$fullname = fullname($user, true);
echo "<option value=\"$user->id\">".$fullname.", ".$user->email."</option>\n";
}
}
?>
</select>
<br />
<input type="text" name="searchtext" size="30" value="<?php p($searchtext, true) ?>" />
<input name="search" id="search" type="submit" value="<?php p($strsearch) ?>" />
<?php
if (isset($searchusers)) {
echo '<input name="showall" id="showall" type="submit" value="'.s($strshowall).'" />'."\n";
}
?>
</td>
</tr>
</table>
</form>
+70 -117
View File
@@ -1,5 +1,28 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file is used to display and organise forum subscribers
*
* @package forum
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once("../../config.php");
require_once("lib.php");
@@ -16,14 +39,8 @@ if ($edit !== 0) {
}
$PAGE->set_url($url);
if (! $forum = $DB->get_record('forum', array('id'=>$id))) {
print_error('invalidforumid', 'forum');
}
if (! $course = $DB->get_record('course', array('id'=>$forum->course))) {
print_error('invalidcourseid');
}
$forum = $DB->get_record('forum', array('id'=>$id), '*', MUST_EXIST);
$course = $DB->get_record('course', array('id'=>$forum->course), '*', MUST_EXIST);
if (! $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) {
$cm->id = 0;
}
@@ -31,7 +48,6 @@ if (! $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) {
require_login($course->id, false, $cm);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
if (!has_capability('mod/forum:viewsubscribers', $context)) {
print_error('nopermissiontosubscribe', 'forum');
}
@@ -40,13 +56,45 @@ unset($SESSION->fromdiscussion);
add_to_log($course->id, "forum", "view subscribers", "subscribers.php?id=$forum->id", $forum->id, $cm->id);
$strsubscribeall = get_string("subscribeall", "forum");
$strsubscribenone = get_string("subscribenone", "forum");
$strsubscribers = get_string("subscribers", "forum");
$strforums = get_string("forums", "forum");
$forumoutput = $PAGE->theme->get_renderer('mod_forum', $PAGE);
$currentgroup = groups_get_activity_group($cm);
$options = array('forumid'=>$forum->id, 'currentgroup'=>$currentgroup, 'context'=>$context);
$existingselector = new forum_existing_subscriber_selector('existingsubscribers', $options);
$subscriberselector = new forum_potential_subscriber_selector('potentialsubscribers', $options);
$subscriberselector->set_existing_subscribers($existingselector->find_users(''));
if (data_submitted()) {
require_sesskey();
$subscribe = (bool)optional_param('subscribe', false, PARAM_RAW);
$unsubscribe = (bool)optional_param('unsubscribe', false, PARAM_RAW);
/** It has to be one or the other, not both or neither */
if (!($subscribe xor $unsubscribe)) {
print_error('invalidaction');
}
if ($subscribe) {
$users = $subscriberselector->get_selected_users();
foreach ($users as $user) {
if (!forum_subscribe($user->id, $id)) {
print_error('cannotaddsubscriber', 'forum', '', $user->id);
}
}
} else if ($unsubscribe) {
$users = $existingselector->get_selected_users();
foreach ($users as $user) {
if (!forum_unsubscribe($user->id, $id)) {
print_error('cannotremovesubscriber', 'forum', '', $user->id);
}
}
}
$subscriberselector->invalidate_selected_users();
$existingselector->invalidate_selected_users();
$subscriberselector->set_existing_subscribers($existingselector->find_users(''));
}
$strsubscribers = get_string("subscribers", "forum");
$PAGE->navbar->add($strsubscribers);
$PAGE->set_title($strsubscribers);
$PAGE->requires->css('mod/forum/forum.css');
if (has_capability('mod/forum:managesubscriptions', $context)) {
$PAGE->set_button(forum_update_subscriptions_button($course->id, $id));
if ($edit != -1) {
@@ -56,108 +104,13 @@ if (has_capability('mod/forum:managesubscriptions', $context)) {
unset($USER->subscriptionsediting);
}
echo $OUTPUT->header();
/// Check to see if groups are being used in this forum
groups_print_activity_menu($cm, $CFG->wwwroot . "/mod/forum/subscribers.php?id=$forum->id");
$currentgroup = groups_get_activity_group($cm);
$groupmode = groups_get_activity_groupmode($cm);
if (empty($USER->subscriptionsediting)) { /// Display an overview of subscribers
if (! $users = forum_subscribed_users($course, $forum, $currentgroup, $context) ) {
echo $OUTPUT->heading(get_string("nosubscribers", "forum"));
} else {
echo $OUTPUT->heading(get_string("subscribersto","forum", "'".format_string($forum->name)."'"));
echo '<table align="center" cellpadding="5" cellspacing="5">';
foreach ($users as $user) {
echo '<tr><td>';
echo $OUTPUT->user_picture(moodle_user_picture::make($user, $course->id));
echo '</td><td>';
echo fullname($user);
echo '</td><td>';
echo $user->email;
echo '</td></tr>';
}
echo "</table>";
}
echo $OUTPUT->footer();
exit;
echo $OUTPUT->heading(get_string('forum', 'forum').' '.$strsubscribers);
if (empty($USER->subscriptionsediting)) {
echo $forumoutput->subscriber_overview(forum_subscribed_users($course, $forum, $currentgroup, $context), $forum, $course);
} else if (forum_is_forcesubscribed($forum)) {
$subscriberselector->set_force_subscribed(true);
echo $forumoutput->subscribed_users($subscriberselector);
} else {
echo $forumoutput->subscriber_selection_form($existingselector, $subscriberselector);
}
/// We are in editing mode.
$strexistingsubscribers = get_string("existingsubscribers", 'forum');
$strpotentialsubscribers = get_string("potentialsubscribers", 'forum');
$straddsubscriber = get_string("addsubscriber", 'forum');
$strremovesubscriber = get_string("removesubscriber", 'forum');
$strsearch = get_string("search");
$strsearchresults = get_string("searchresults");
$strshowall = get_string("showall");
$strsubscribers = get_string("subscribers", "forum");
$strforums = get_string("forums", "forum");
$searchtext = optional_param('searchtext', '', PARAM_RAW);
if ($frm = data_submitted() and confirm_sesskey()) {
/// A form was submitted so process the input
if (!empty($frm->add) and !empty($frm->addselect)) {
foreach ($frm->addselect as $addsubscriber) {
if (! forum_subscribe($addsubscriber, $id)) {
print_error('cannotaddsubscriber', 'forum', '', $addsubscriber);
}
}
} else if (!empty($frm->remove) and !empty($frm->removeselect)) {
foreach ($frm->removeselect as $removesubscriber) {
if (! forum_unsubscribe($removesubscriber, $id)) {
print_error('cannotremovesubscriber', 'forum', '', $removesubscriber);
}
}
} else if (!empty($frm->showall)) {
$searchtext = '';
}
}
/// Get all existing subscribers for this forum.
if (!$subscribers = forum_subscribed_users($course, $forum, $currentgroup, $context)) {
$subscribers = array();
}
/// Get all the potential subscribers excluding users already subscribed
$users = forum_get_potential_subscribers($context, $currentgroup, 'id,email,firstname,lastname', 'firstname ASC, lastname ASC');
if (!$users) {
$users = array();
}
foreach ($subscribers as $subscriber) {
unset($users[$subscriber->id]);
}
/// This is yucky, but do the search in PHP, becuase the list we are using comes from get_users_by_capability,
/// which does not allow searching in the database. Fortunately the list is only this list of users in this
/// course, which is normally OK, except on the site course of a big site. But before you can enter a search
/// term, you have already seen a page that lists everyone, since this code never does paging, so you have probably
/// already crashed your server if you are going to. This will be fixed properly for Moodle 2.0: MDL-17550.
if ($searchtext) {
$searchusers = array();
$lcsearchtext = moodle_strtolower($searchtext);
foreach ($users as $userid => $user) {
if (strpos(moodle_strtolower($user->email), $lcsearchtext) !== false ||
strpos(moodle_strtolower($user->firstname . ' ' . $user->lastname), $lcsearchtext) !== false) {
$searchusers[$userid] = $user;
}
unset($users[$userid]);
}
}
echo $OUTPUT->box_start('generalbox boxaligncenter');
include('subscriber.html');
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
echo $OUTPUT->footer();
+3 -3
View File
@@ -63,9 +63,9 @@ abstract class user_selector_base {
/** When searching, do we only match the starts of fields (better performace)
* or do we match occurrences anywhere? */
protected $searchanywhere = false;
// This is used by get selected users,
private $validatinguserids = null;
protected $validatinguserids = null;
// Used to ensure we only output the search options for one user selector on
// each page.
private static $searchoptionsoutput = false;
@@ -372,7 +372,7 @@ abstract class user_selector_base {
$users = array();
foreach ($groupedusers as $group) {
foreach ($group as $user) {
if (!isset($users[$user->id]) && empty($user->disabled)) {
if (!isset($users[$user->id]) && empty($user->disabled) && in_array($user->id, $userids)) {
$users[$user->id] = $user;
}
}