MDL-22404 add cohort ID to user filters
[moodle.git] / user / filters / cohort.php
1 <?php
3 defined('MOODLE_INTERNAL') || die();
5 require_once($CFG->dirroot.'/user/filters/lib.php');
7 /**
8  * Generic filter for cohort membership.
9  */
10 class user_filter_cohort extends user_filter_type {
11     /**
12      * Constructor
13      * @param boolean $advanced advanced form element flag
14      */
15     function user_filter_cohort($advanced) {
16         parent::user_filter_type('cohort', get_string('idnumber', 'core_cohort'), $advanced);
17     }
19     /**
20      * Returns an array of comparison operators
21      * @return array of comparison operators
22      */
23     function getOperators() {
24         return array(0 => get_string('contains', 'filters'),
25                      1 => get_string('doesnotcontain','filters'),
26                      2 => get_string('isequalto','filters'),
27                      3 => get_string('startswith','filters'),
28                      4 => get_string('endswith','filters'));
29     }
31     /**
32      * Adds controls specific to this filter in the form.
33      * @param object $mform a MoodleForm object to setup
34      */
35     function setupForm(&$mform) {
36         $objs = array();
37         $objs[] =& $mform->createElement('select', $this->_name.'_op', null, $this->getOperators());
38         $objs[] =& $mform->createElement('text', $this->_name, null);
39         $grp =& $mform->addElement('group', $this->_name.'_grp', $this->_label, $objs, '', false);
40         $mform->disabledIf($this->_name, $this->_name.'_op', 'eq', 5);
41         if ($this->_advanced) {
42             $mform->setAdvanced($this->_name.'_grp');
43         }
44         $mform->setDefault($this->_name.'_op', 2);
45     }
47     /**
48      * Retrieves data from the form data
49      * @param object $formdata data submited with the form
50      * @return mixed array filter data or false when filter not set
51      */
52     function check_data($formdata) {
53         $field    = $this->_name;
54         $operator = $field.'_op';
56         if (array_key_exists($operator, $formdata)) {
57             if ($formdata->$field == '') {
58                 return false;
59             }
60             return array('operator'=>(int)$formdata->$operator, 'value'=>$formdata->$field);
61         }
63         return false;
64     }
66     /**
67      * Returns the condition to be used with SQL where
68      * @param array $data filter settings
69      * @return array sql string and $params
70      */
71     function get_sql_filter($data) {
72         global $DB;
73         static $counter = 0;
74         $name = 'ex_cohort'.$counter++;
76         $operator = $data['operator'];
77         $value    = $data['value'];
79         $params = array();
81         if ($value === '') {
82             return '';
83         }
85         switch($operator) {
86             case 0: // contains
87                 $res = $DB->sql_like('idnumber', ":$name", false, false);
88                 $params[$name] = "%$value%";
89                 break;
90             case 1: // does not contain
91                 $res = $DB->sql_like('idnumber', ":$name", false, false, true);
92                 $params[$name] = "%$value%";
93                 break;
94             case 2: // equal to
95                 $res = $DB->sql_like('idnumber', ":$name", false, false);
96                 $params[$name] = "$value";
97                 break;
98             case 3: // starts with
99                 $res = $DB->sql_like('idnumber', ":$name", false, false);
100                 $params[$name] = "$value%";
101                 break;
102             case 4: // ends with
103                 $res = $DB->sql_like('idnumber', ":$name", false, false);
104                 $params[$name] = "%$value";
105                 break;
106             default:
107                 return '';
108         }
110         $sql = "id IN (SELECT userid
111                          FROM {cohort_members}
112                          JOIN {cohort} ON {cohort_members}.cohortid = {cohort}.id
113                         WHERE $res)";
115         return array($sql, $params);
116     }
118     /**
119      * Returns a human friendly description of the filter used as label.
120      * @param array $data filter settings
121      * @return string active filter label
122      */
123     function get_label($data) {
124         $operator  = $data['operator'];
125         $value     = $data['value'];
126         $operators = $this->getOperators();
128         $a = new stdClass();
129         $a->label    = $this->_label;
130         $a->value    = '"'.s($value).'"';
131         $a->operator = $operators[$operator];
134         switch ($operator) {
135             case 0: // contains
136             case 1: // doesn't contain
137             case 2: // equal to
138             case 3: // starts with
139             case 4: // ends with
140                 return get_string('textlabel', 'filters', $a);
141         }
143         return '';
144     }