Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

MDL-22404 add cohort ID to user filters

We are using only ID because there might be hundreds of cohorts in the system at different contexts. There is no special access control because filtering is supposed to be used by admins only.
  • Loading branch information...
commit 74275cf6e5595494ae4e8c5f68e518b805af0c05 1 parent 1187c38
@skodak skodak authored stronk7 committed
Showing with 148 additions and 1 deletion.
  1. +145 −0 user/filters/cohort.php
  2. +3 −1 user/filters/lib.php
View
145 user/filters/cohort.php
@@ -0,0 +1,145 @@
+<?php
+
+defined('MOODLE_INTERNAL') || die();
+
+require_once($CFG->dirroot.'/user/filters/lib.php');
+
+/**
+ * Generic filter for cohort membership.
+ */
+class user_filter_cohort extends user_filter_type {
+ /**
+ * Constructor
+ * @param boolean $advanced advanced form element flag
+ */
+ function user_filter_cohort($advanced) {
+ parent::user_filter_type('cohort', get_string('idnumber', 'core_cohort'), $advanced);
+ }
+
+ /**
+ * Returns an array of comparison operators
+ * @return array of comparison operators
+ */
+ function getOperators() {
+ return array(0 => get_string('contains', 'filters'),
+ 1 => get_string('doesnotcontain','filters'),
+ 2 => get_string('isequalto','filters'),
+ 3 => get_string('startswith','filters'),
+ 4 => get_string('endswith','filters'));
+ }
+
+ /**
+ * Adds controls specific to this filter in the form.
+ * @param object $mform a MoodleForm object to setup
+ */
+ function setupForm(&$mform) {
+ $objs = array();
+ $objs[] =& $mform->createElement('select', $this->_name.'_op', null, $this->getOperators());
+ $objs[] =& $mform->createElement('text', $this->_name, null);
+ $grp =& $mform->addElement('group', $this->_name.'_grp', $this->_label, $objs, '', false);
+ $mform->disabledIf($this->_name, $this->_name.'_op', 'eq', 5);
+ if ($this->_advanced) {
+ $mform->setAdvanced($this->_name.'_grp');
+ }
+ $mform->setDefault($this->_name.'_op', 2);
+ }
+
+ /**
+ * Retrieves data from the form data
+ * @param object $formdata data submited with the form
+ * @return mixed array filter data or false when filter not set
+ */
+ function check_data($formdata) {
+ $field = $this->_name;
+ $operator = $field.'_op';
+
+ if (array_key_exists($operator, $formdata)) {
+ if ($formdata->$field == '') {
+ return false;
+ }
+ return array('operator'=>(int)$formdata->$operator, 'value'=>$formdata->$field);
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the condition to be used with SQL where
+ * @param array $data filter settings
+ * @return array sql string and $params
+ */
+ function get_sql_filter($data) {
+ global $DB;
+ static $counter = 0;
+ $name = 'ex_cohort'.$counter++;
+
+ $operator = $data['operator'];
+ $value = $data['value'];
+
+ $params = array();
+
+ if ($value === '') {
+ return '';
+ }
+
+ switch($operator) {
+ case 0: // contains
+ $res = $DB->sql_like('idnumber', ":$name", false, false);
+ $params[$name] = "%$value%";
+ break;
+ case 1: // does not contain
+ $res = $DB->sql_like('idnumber', ":$name", false, false, true);
+ $params[$name] = "%$value%";
+ break;
+ case 2: // equal to
+ $res = $DB->sql_like('idnumber', ":$name", false, false);
+ $params[$name] = "$value";
+ break;
+ case 3: // starts with
+ $res = $DB->sql_like('idnumber', ":$name", false, false);
+ $params[$name] = "$value%";
+ break;
+ case 4: // ends with
+ $res = $DB->sql_like('idnumber', ":$name", false, false);
+ $params[$name] = "%$value";
+ break;
+ default:
+ return '';
+ }
+
+ $sql = "id IN (SELECT userid
+ FROM {cohort_members}
+ JOIN {cohort} ON {cohort_members}.cohortid = {cohort}.id
+ WHERE $res)";
+
+ return array($sql, $params);
+ }
+
+ /**
+ * Returns a human friendly description of the filter used as label.
+ * @param array $data filter settings
+ * @return string active filter label
+ */
+ function get_label($data) {
+ $operator = $data['operator'];
+ $value = $data['value'];
+ $operators = $this->getOperators();
+
+ $a = new stdClass();
+ $a->label = $this->_label;
+ $a->value = '"'.s($value).'"';
+ $a->operator = $operators[$operator];
+
+
+ switch ($operator) {
+ case 0: // contains
+ case 1: // doesn't contain
+ case 2: // equal to
+ case 3: // starts with
+ case 4: // ends with
+ return get_string('textlabel', 'filters', $a);
+ }
+
+ return '';
+ }
+}
View
4 user/filters/lib.php
@@ -8,6 +8,7 @@
require_once($CFG->dirroot.'/user/filters/globalrole.php');
require_once($CFG->dirroot.'/user/filters/profilefield.php');
require_once($CFG->dirroot.'/user/filters/yesno.php');
+require_once($CFG->dirroot.'/user/filters/cohort.php');
require_once($CFG->dirroot.'/user/filters/user_filter_forms.php');
@@ -34,7 +35,7 @@ function user_filtering($fieldnames=null, $baseurl=null, $extraparams=null) {
if (empty($fieldnames)) {
$fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
- 'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1,
+ 'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1, 'cohort'=>1,
'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'timemodified'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
}
@@ -115,6 +116,7 @@ function get_field($fieldname, $advanced) {
case 'lastaccess': return new user_filter_date('lastaccess', get_string('lastaccess'), $advanced, 'lastaccess');
case 'lastlogin': return new user_filter_date('lastlogin', get_string('lastlogin'), $advanced, 'lastlogin');
case 'timemodified': return new user_filter_date('timemodified', get_string('lastmodified'), $advanced, 'timemodified');
+ case 'cohort': return new user_filter_cohort($advanced);
case 'auth':
$plugins = get_plugin_list('auth');
$choices = array();
Please sign in to comment.
Something went wrong with that request. Please try again.