From 2789afa842fa8a9f117eb565148ad5eb292af2c1 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 19 May 2014 21:14:58 +0800 Subject: [PATCH] MDL-45627 mod_fourm: Move subscriber classes to separate class files --- .../classes/existing_subscriber_selector.php | 64 +++++ .../classes/potential_subscriber_selector.php | 156 ++++++++++++ .../classes/subscriber_selector_base.php | 87 +++++++ mod/forum/lib.php | 227 ------------------ mod/forum/subscribers.php | 6 +- 5 files changed, 310 insertions(+), 230 deletions(-) create mode 100644 mod/forum/classes/existing_subscriber_selector.php create mode 100644 mod/forum/classes/potential_subscriber_selector.php create mode 100644 mod/forum/classes/subscriber_selector_base.php diff --git a/mod/forum/classes/existing_subscriber_selector.php b/mod/forum/classes/existing_subscriber_selector.php new file mode 100644 index 00000000000..ae7ef99359e --- /dev/null +++ b/mod/forum/classes/existing_subscriber_selector.php @@ -0,0 +1,64 @@ +. + +/** + * A type of forum. + * + * @package mod_forum + * @copyright 2014 Andrew Robert Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot.'/user/selector/lib.php'); + +/** + * User selector control for removing subscribed users + * @package mod_forum + * @copyright 2009 Sam Hemelryk + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_forum_existing_subscriber_selector extends mod_forum_subscriber_selector_base { + + /** + * Finds all subscribed users + * + * @param string $search + * @return array + */ + public function find_users($search) { + global $DB; + list($wherecondition, $params) = $this->search_sql($search, 'u'); + $params['forumid'] = $this->forumid; + + // only active enrolled or everybody on the frontpage + list($esql, $eparams) = get_enrolled_sql($this->context, '', $this->currentgroup, true); + $fields = $this->required_fields_sql('u'); + list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext); + $params = array_merge($params, $eparams, $sortparams); + + $subscribers = $DB->get_records_sql("SELECT $fields + FROM {user} u + JOIN ($esql) je ON je.id = u.id + JOIN {forum_subscriptions} s ON s.userid = u.id + WHERE $wherecondition AND s.forum = :forumid + ORDER BY $sort", $params); + + return array(get_string("existingsubscribers", 'forum') => $subscribers); + } + +} diff --git a/mod/forum/classes/potential_subscriber_selector.php b/mod/forum/classes/potential_subscriber_selector.php new file mode 100644 index 00000000000..cc9c6c0376c --- /dev/null +++ b/mod/forum/classes/potential_subscriber_selector.php @@ -0,0 +1,156 @@ +. + +/** + * A type of forum. + * + * @package mod_forum + * @copyright 2014 Andrew Robert Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot.'/user/selector/lib.php'); + +/** + * A user selector control for potential subscribers to the selected forum + * @package mod_forum + * @copyright 2009 Sam Hemelryk + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_forum_potential_subscriber_selector extends mod_forum_subscriber_selector_base { + /** + * If set to true EVERYONE in this course is force subscribed to this forum + * @var bool + */ + protected $forcesubscribed = false; + /** + * Can be used to store existing subscribers so that they can be removed from + * the potential subscribers list + */ + protected $existingsubscribers = array(); + + /** + * Constructor method + * @param string $name + * @param array $options + */ + public function __construct($name, $options) { + parent::__construct($name, $options); + if (isset($options['forcesubscribed'])) { + $this->forcesubscribed=true; + } + } + + /** + * Returns an arary of options for this control + * @return array + */ + protected function get_options() { + $options = parent::get_options(); + if ($this->forcesubscribed===true) { + $options['forcesubscribed']=1; + } + return $options; + } + + /** + * Finds all potential users + * + * Potential subscribers are all enroled users who are not already subscribed. + * + * @param string $search + * @return array + */ + public function find_users($search) { + global $DB; + + $whereconditions = array(); + list($wherecondition, $params) = $this->search_sql($search, 'u'); + if ($wherecondition) { + $whereconditions[] = $wherecondition; + } + + if (!$this->forcesubscribed) { + $existingids = array(); + foreach ($this->existingsubscribers as $group) { + foreach ($group as $user) { + $existingids[$user->id] = 1; + } + } + if ($existingids) { + list($usertest, $userparams) = $DB->get_in_or_equal( + array_keys($existingids), SQL_PARAMS_NAMED, 'existing', false); + $whereconditions[] = 'u.id ' . $usertest; + $params = array_merge($params, $userparams); + } + } + + if ($whereconditions) { + $wherecondition = 'WHERE ' . implode(' AND ', $whereconditions); + } + + list($esql, $eparams) = get_enrolled_sql($this->context, '', $this->currentgroup, true); + $params = array_merge($params, $eparams); + + $fields = 'SELECT ' . $this->required_fields_sql('u'); + $countfields = 'SELECT COUNT(u.id)'; + + $sql = " FROM {user} u + JOIN ($esql) je ON je.id = u.id + $wherecondition"; + + list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext); + $order = ' ORDER BY ' . $sort; + + // Check to see if there are too many to show sensibly. + if (!$this->is_validating()) { + $potentialmemberscount = $DB->count_records_sql($countfields . $sql, $params); + if ($potentialmemberscount > $this->maxusersperpage) { + return $this->too_many_results($search, $potentialmemberscount); + } + } + + // If not, show them. + $availableusers = $DB->get_records_sql($fields . $sql . $order, array_merge($params, $sortparams)); + + if (empty($availableusers)) { + return array(); + } + + if ($this->forcesubscribed) { + return array(get_string("existingsubscribers", 'forum') => $availableusers); + } else { + return array(get_string("potentialsubscribers", 'forum') => $availableusers); + } + } + + /** + * Sets the existing subscribers + * @param array $users + */ + public function set_existing_subscribers(array $users) { + $this->existingsubscribers = $users; + } + + /** + * Sets this forum as force subscribed or not + */ + public function set_force_subscribed($setting=true) { + $this->forcesubscribed = true; + } +} diff --git a/mod/forum/classes/subscriber_selector_base.php b/mod/forum/classes/subscriber_selector_base.php new file mode 100644 index 00000000000..45da3b3b18a --- /dev/null +++ b/mod/forum/classes/subscriber_selector_base.php @@ -0,0 +1,87 @@ +. + +/** + * A type of forum. + * + * @package mod_forum + * @copyright 2014 Andrew Robert Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot.'/user/selector/lib.php'); + +/** + * Abstract class used by forum subscriber selection controls + * @package mod_forum + * @copyright 2009 Sam Hemelryk + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class mod_forum_subscriber_selector_base extends user_selector_base { + + /** + * The id of the forum this selector is being used for + * @var int + */ + protected $forumid = null; + /** + * The context of the forum this selector is being used for + * @var object + */ + protected $context = null; + /** + * The id of the current group + * @var int + */ + protected $currentgroup = null; + + /** + * Constructor method + * @param string $name + * @param array $options + */ + public function __construct($name, $options) { + $options['accesscontext'] = $options['context']; + 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']; + } + } + + /** + * Returns an array of options to seralise and store for searches + * + * @return array + */ + 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; + } + +} diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 15ae0a602e8..6bca6794aa3 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -25,7 +25,6 @@ defined('MOODLE_INTERNAL') || die(); /** Include required files */ require_once($CFG->libdir.'/filelib.php'); require_once($CFG->libdir.'/eventslib.php'); -require_once($CFG->dirroot.'/user/selector/lib.php'); /// CONSTANTS /////////////////////////////////////////////////////////// @@ -7834,232 +7833,6 @@ function forum_extend_settings_navigation(settings_navigation $settingsnav, navi } } -/** - * Abstract class used by forum subscriber selection controls - * @package mod_forum - * @copyright 2009 Sam Hemelryk - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -abstract class forum_subscriber_selector_base extends user_selector_base { - - /** - * The id of the forum this selector is being used for - * @var int - */ - protected $forumid = null; - /** - * The context of the forum this selector is being used for - * @var object - */ - protected $context = null; - /** - * The id of the current group - * @var int - */ - protected $currentgroup = null; - - /** - * Constructor method - * @param string $name - * @param array $options - */ - public function __construct($name, $options) { - $options['accesscontext'] = $options['context']; - 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']; - } - } - - /** - * Returns an array of options to seralise and store for searches - * - * @return array - */ - 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; - } - -} - -/** - * A user selector control for potential subscribers to the selected forum - * @package mod_forum - * @copyright 2009 Sam Hemelryk - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class forum_potential_subscriber_selector extends forum_subscriber_selector_base { - /** - * If set to true EVERYONE in this course is force subscribed to this forum - * @var bool - */ - protected $forcesubscribed = false; - /** - * Can be used to store existing subscribers so that they can be removed from - * the potential subscribers list - */ - protected $existingsubscribers = array(); - - /** - * Constructor method - * @param string $name - * @param array $options - */ - public function __construct($name, $options) { - parent::__construct($name, $options); - if (isset($options['forcesubscribed'])) { - $this->forcesubscribed=true; - } - } - - /** - * Returns an arary of options for this control - * @return array - */ - protected function get_options() { - $options = parent::get_options(); - if ($this->forcesubscribed===true) { - $options['forcesubscribed']=1; - } - return $options; - } - - /** - * Finds all potential users - * - * Potential subscribers are all enroled users who are not already subscribed. - * - * @param string $search - * @return array - */ - public function find_users($search) { - global $DB; - - $whereconditions = array(); - list($wherecondition, $params) = $this->search_sql($search, 'u'); - if ($wherecondition) { - $whereconditions[] = $wherecondition; - } - - if (!$this->forcesubscribed) { - $existingids = array(); - foreach ($this->existingsubscribers as $group) { - foreach ($group as $user) { - $existingids[$user->id] = 1; - } - } - if ($existingids) { - list($usertest, $userparams) = $DB->get_in_or_equal( - array_keys($existingids), SQL_PARAMS_NAMED, 'existing', false); - $whereconditions[] = 'u.id ' . $usertest; - $params = array_merge($params, $userparams); - } - } - - if ($whereconditions) { - $wherecondition = 'WHERE ' . implode(' AND ', $whereconditions); - } - - list($esql, $eparams) = get_enrolled_sql($this->context, '', $this->currentgroup, true); - $params = array_merge($params, $eparams); - - $fields = 'SELECT ' . $this->required_fields_sql('u'); - $countfields = 'SELECT COUNT(u.id)'; - - $sql = " FROM {user} u - JOIN ($esql) je ON je.id = u.id - $wherecondition"; - - list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext); - $order = ' ORDER BY ' . $sort; - - // Check to see if there are too many to show sensibly. - if (!$this->is_validating()) { - $potentialmemberscount = $DB->count_records_sql($countfields . $sql, $params); - if ($potentialmemberscount > $this->maxusersperpage) { - return $this->too_many_results($search, $potentialmemberscount); - } - } - - // If not, show them. - $availableusers = $DB->get_records_sql($fields . $sql . $order, array_merge($params, $sortparams)); - - if (empty($availableusers)) { - return array(); - } - - if ($this->forcesubscribed) { - return array(get_string("existingsubscribers", 'forum') => $availableusers); - } else { - return array(get_string("potentialsubscribers", 'forum') => $availableusers); - } - } - - /** - * Sets the existing subscribers - * @param array $users - */ - public function set_existing_subscribers(array $users) { - $this->existingsubscribers = $users; - } - - /** - * Sets this forum as force subscribed or not - */ - public function set_force_subscribed($setting=true) { - $this->forcesubscribed = true; - } -} - -/** - * User selector control for removing subscribed users - * @package mod_forum - * @copyright 2009 Sam Hemelryk - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class forum_existing_subscriber_selector extends forum_subscriber_selector_base { - - /** - * Finds all subscribed users - * - * @param string $search - * @return array - */ - public function find_users($search) { - global $DB; - list($wherecondition, $params) = $this->search_sql($search, 'u'); - $params['forumid'] = $this->forumid; - - // only active enrolled or everybody on the frontpage - list($esql, $eparams) = get_enrolled_sql($this->context, '', $this->currentgroup, true); - $fields = $this->required_fields_sql('u'); - list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext); - $params = array_merge($params, $eparams, $sortparams); - - $subscribers = $DB->get_records_sql("SELECT $fields - FROM {user} u - JOIN ($esql) je ON je.id = u.id - JOIN {forum_subscriptions} s ON s.userid = u.id - WHERE $wherecondition AND s.forum = :forumid - ORDER BY $sort", $params); - - return array(get_string("existingsubscribers", 'forum') => $subscribers); - } - -} - /** * Adds information about unread messages, that is only required for the course view page (and * similar), to the course-module object. diff --git a/mod/forum/subscribers.php b/mod/forum/subscribers.php index 51b6f54b891..710e70f0c7a 100644 --- a/mod/forum/subscribers.php +++ b/mod/forum/subscribers.php @@ -64,8 +64,8 @@ $event->trigger(); $forumoutput = $PAGE->get_renderer('mod_forum'); $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); +$existingselector = new mod_forum_existing_subscriber_selector('existingsubscribers', $options); +$subscriberselector = new mod_forum_potential_subscriber_selector('potentialsubscribers', $options); $subscriberselector->set_existing_subscribers($existingselector->find_users('')); if (data_submitted()) { @@ -118,4 +118,4 @@ if (empty($USER->subscriptionsediting)) { } else { echo $forumoutput->subscriber_selection_form($existingselector, $subscriberselector); } -echo $OUTPUT->footer(); \ No newline at end of file +echo $OUTPUT->footer();