See Release Notes
Long Term Support Release
Differences Between: [Versions 39 and 311] [Versions 39 and 400] [Versions 39 and 401] [Versions 39 and 402] [Versions 39 and 403]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Profile field filter. 19 * 20 * @package core_user 21 * @category user 22 * @copyright 1999 Martin Dougiamas http://dougiamas.com 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 require_once($CFG->dirroot.'/user/filters/lib.php'); 27 28 /** 29 * User filter based on values of custom profile fields. 30 * 31 * @copyright 1999 Martin Dougiamas http://dougiamas.com 32 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 33 */ 34 class user_filter_profilefield extends user_filter_type { 35 36 /** 37 * Constructor 38 * @param string $name the name of the filter instance 39 * @param string $label the label of the filter instance 40 * @param boolean $advanced advanced form element flag 41 */ 42 public function __construct($name, $label, $advanced) { 43 parent::__construct($name, $label, $advanced); 44 } 45 46 /** 47 * Old syntax of class constructor. Deprecated in PHP7. 48 * 49 * @deprecated since Moodle 3.1 50 */ 51 public function user_filter_profilefield($name, $label, $advanced) { 52 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); 53 self::__construct($name, $label, $advanced); 54 } 55 56 /** 57 * Returns an array of comparison operators 58 * @return array of comparison operators 59 */ 60 public function get_operators() { 61 return array(0 => get_string('contains', 'filters'), 62 1 => get_string('doesnotcontain', 'filters'), 63 2 => get_string('isequalto', 'filters'), 64 3 => get_string('startswith', 'filters'), 65 4 => get_string('endswith', 'filters'), 66 5 => get_string('isempty', 'filters'), 67 6 => get_string('isnotdefined', 'filters'), 68 7 => get_string('isdefined', 'filters')); 69 } 70 71 /** 72 * Returns an array of custom profile fields 73 * @return array of profile fields 74 */ 75 public function get_profile_fields() { 76 global $DB; 77 $order = $DB->sql_order_by_text('name'); 78 if (!$fields = $DB->get_records_menu('user_info_field', null, $order, 'id, name')) { 79 return null; 80 } 81 $res = array(0 => get_string('anyfield', 'filters')); 82 83 return $res + $fields; 84 } 85 86 /** 87 * Adds controls specific to this filter in the form. 88 * @param object $mform a MoodleForm object to setup 89 */ 90 public function setupForm(&$mform) { 91 $profilefields = $this->get_profile_fields(); 92 if (empty($profilefields)) { 93 return; 94 } 95 $objs = array(); 96 $objs['field'] = $mform->createElement('select', $this->_name.'_fld', null, $profilefields); 97 $objs['op'] = $mform->createElement('select', $this->_name.'_op', null, $this->get_operators()); 98 $objs['value'] = $mform->createElement('text', $this->_name, null); 99 $objs['field']->setLabel(get_string('profilefilterfield', 'filters')); 100 $objs['op']->setLabel(get_string('profilefilterlimiter', 'filters')); 101 $objs['value']->setLabel(get_string('valuefor', 'filters', $this->_label)); 102 $grp =& $mform->addElement('group', $this->_name.'_grp', $this->_label, $objs, '', false); 103 $mform->setType($this->_name, PARAM_RAW); 104 if ($this->_advanced) { 105 $mform->setAdvanced($this->_name.'_grp'); 106 } 107 } 108 109 /** 110 * Retrieves data from the form data 111 * @param object $formdata data submited with the form 112 * @return mixed array filter data or false when filter not set 113 */ 114 public function check_data($formdata) { 115 $profilefields = $this->get_profile_fields(); 116 117 if (empty($profilefields)) { 118 return false; 119 } 120 121 $field = $this->_name; 122 $operator = $field.'_op'; 123 $profile = $field.'_fld'; 124 125 if (property_exists($formdata, $profile)) { 126 if ($formdata->$operator < 5 and $formdata->$field === '') { 127 return false; 128 } 129 130 return array('value' => (string)$formdata->$field, 131 'operator' => (int)$formdata->$operator, 132 'profile' => (int)$formdata->$profile); 133 } 134 } 135 136 /** 137 * Returns the condition to be used with SQL where 138 * @param array $data filter settings 139 * @return array sql string and $params 140 */ 141 public function get_sql_filter($data) { 142 global $CFG, $DB; 143 static $counter = 0; 144 $name = 'ex_profilefield'.$counter++; 145 146 $profilefields = $this->get_profile_fields(); 147 if (empty($profilefields)) { 148 return ''; 149 } 150 151 $profile = $data['profile']; 152 $operator = $data['operator']; 153 $value = $data['value']; 154 155 $params = array(); 156 if (!array_key_exists($profile, $profilefields)) { 157 return array('', array()); 158 } 159 160 $where = ""; 161 $op = " IN "; 162 163 if ($operator < 5 and $value === '') { 164 return ''; 165 } 166 167 switch($operator) { 168 case 0: // Contains. 169 $where = $DB->sql_like('data', ":$name", false, false); 170 $params[$name] = "%$value%"; 171 break; 172 case 1: // Does not contain. 173 $where = $DB->sql_like('data', ":$name", false, false, true); 174 $params[$name] = "%$value%"; 175 break; 176 case 2: // Equal to. 177 $where = $DB->sql_like('data', ":$name", false, false); 178 $params[$name] = "$value"; 179 break; 180 case 3: // Starts with. 181 $where = $DB->sql_like('data', ":$name", false, false); 182 $params[$name] = "$value%"; 183 break; 184 case 4: // Ends with. 185 $where = $DB->sql_like('data', ":$name", false, false); 186 $params[$name] = "%$value"; 187 break; 188 case 5: // Empty. 189 $where = "data = :$name"; 190 $params[$name] = ""; 191 break; 192 case 6: // Is not defined. 193 $op = " NOT IN "; 194 break; 195 case 7: // Is defined. 196 break; 197 } 198 if ($profile) { 199 if ($where !== '') { 200 $where = " AND $where"; 201 } 202 $where = "fieldid=$profile $where"; 203 } 204 if ($where !== '') { 205 $where = "WHERE $where"; 206 } 207 return array("id $op (SELECT userid FROM {user_info_data} $where)", $params); 208 } 209 210 /** 211 * Returns a human friendly description of the filter used as label. 212 * @param array $data filter settings 213 * @return string active filter label 214 */ 215 public function get_label($data) { 216 $operators = $this->get_operators(); 217 $profilefields = $this->get_profile_fields(); 218 219 if (empty($profilefields)) { 220 return ''; 221 } 222 223 $profile = $data['profile']; 224 $operator = $data['operator']; 225 $value = $data['value']; 226 227 if (!array_key_exists($profile, $profilefields)) { 228 return ''; 229 } 230 231 $a = new stdClass(); 232 $a->label = $this->_label; 233 $a->value = $value; 234 $a->profile = $profilefields[$profile]; 235 $a->operator = $operators[$operator]; 236 237 switch($operator) { 238 case 0: // Contains. 239 case 1: // Doesn't contain. 240 case 2: // Equal to. 241 case 3: // Starts with. 242 case 4: // Ends with. 243 return get_string('profilelabel', 'filters', $a); 244 case 5: // Empty. 245 case 6: // Is not defined. 246 case 7: // Is defined. 247 return get_string('profilelabelnovalue', 'filters', $a); 248 } 249 return ''; 250 } 251 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body