forked from moodle/moodle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lib.php
281 lines (252 loc) · 11.5 KB
/
lib.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
<?php
require_once($CFG->dirroot.'/user/filters/text.php');
require_once($CFG->dirroot.'/user/filters/date.php');
require_once($CFG->dirroot.'/user/filters/select.php');
require_once($CFG->dirroot.'/user/filters/simpleselect.php');
require_once($CFG->dirroot.'/user/filters/courserole.php');
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');
require_once($CFG->dirroot.'/user/filters/checkbox.php');
/**
* User filtering wrapper class.
*/
class user_filtering {
var $_fields;
var $_addform;
var $_activeform;
/**
* Contructor
* @param array array of visible user fields
* @param string base url used for submission/return, null if the same of current page
* @param array extra page parameters
*/
function user_filtering($fieldnames=null, $baseurl=null, $extraparams=null) {
global $SESSION;
if (!isset($SESSION->user_filtering)) {
$SESSION->user_filtering = array();
}
if (empty($fieldnames)) {
$fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
'confirmed'=>1, 'suspended'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1, 'cohort'=>1,
'firstaccess'=>1, 'lastaccess'=>1, 'neveraccessed'=>1, 'timemodified'=>1,
'nevermodified'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
}
$this->_fields = array();
foreach ($fieldnames as $fieldname=>$advanced) {
if ($field = $this->get_field($fieldname, $advanced)) {
$this->_fields[$fieldname] = $field;
}
}
// fist the new filter form
$this->_addform = new user_add_filter_form($baseurl, array('fields'=>$this->_fields, 'extraparams'=>$extraparams));
if ($adddata = $this->_addform->get_data()) {
foreach($this->_fields as $fname=>$field) {
$data = $field->check_data($adddata);
if ($data === false) {
continue; // nothing new
}
if (!array_key_exists($fname, $SESSION->user_filtering)) {
$SESSION->user_filtering[$fname] = array();
}
$SESSION->user_filtering[$fname][] = $data;
}
// clear the form
$_POST = array();
$this->_addform = new user_add_filter_form($baseurl, array('fields'=>$this->_fields, 'extraparams'=>$extraparams));
}
// now the active filters
$this->_activeform = new user_active_filter_form($baseurl, array('fields'=>$this->_fields, 'extraparams'=>$extraparams));
if ($adddata = $this->_activeform->get_data()) {
if (!empty($adddata->removeall)) {
$SESSION->user_filtering = array();
} else if (!empty($adddata->removeselected) and !empty($adddata->filter)) {
foreach($adddata->filter as $fname=>$instances) {
foreach ($instances as $i=>$val) {
if (empty($val)) {
continue;
}
unset($SESSION->user_filtering[$fname][$i]);
}
if (empty($SESSION->user_filtering[$fname])) {
unset($SESSION->user_filtering[$fname]);
}
}
}
// clear+reload the form
$_POST = array();
$this->_activeform = new user_active_filter_form($baseurl, array('fields'=>$this->_fields, 'extraparams'=>$extraparams));
}
// now the active filters
}
/**
* Creates known user filter if present
* @param string $fieldname
* @param boolean $advanced
* @return object filter
*/
function get_field($fieldname, $advanced) {
global $USER, $CFG, $DB, $SITE;
switch ($fieldname) {
case 'username': return new user_filter_text('username', get_string('username'), $advanced, 'username');
case 'realname': return new user_filter_text('realname', get_string('fullnameuser'), $advanced, $DB->sql_fullname());
case 'lastname': return new user_filter_text('lastname', get_string('lastname'), $advanced, 'lastname');
case 'firstname': return new user_filter_text('firstname', get_string('firstname'), $advanced, 'firstname');
case 'email': return new user_filter_text('email', get_string('email'), $advanced, 'email');
case 'city': return new user_filter_text('city', get_string('city'), $advanced, 'city');
case 'country': return new user_filter_select('country', get_string('country'), $advanced, 'country', get_string_manager()->get_list_of_countries(), $USER->country);
case 'confirmed': return new user_filter_yesno('confirmed', get_string('confirmed', 'admin'), $advanced, 'confirmed');
case 'suspended': return new user_filter_yesno('suspended', get_string('suspended', 'auth'), $advanced, 'suspended');
case 'profile': return new user_filter_profilefield('profile', get_string('profile'), $advanced);
case 'courserole': return new user_filter_courserole('courserole', get_string('courserole', 'filters'), $advanced);
case 'systemrole': return new user_filter_globalrole('systemrole', get_string('globalrole', 'role'), $advanced);
case 'firstaccess': return new user_filter_date('firstaccess', get_string('firstaccess', 'filters'), $advanced, 'firstaccess');
case 'lastaccess': return new user_filter_date('lastaccess', get_string('lastaccess'), $advanced, 'lastaccess');
case 'neveraccessed': return new user_filter_checkbox('neveraccessed', get_string('neveraccessed', 'filters'), $advanced, 'firstaccess', array('lastaccess_sck', 'lastaccess_eck', 'firstaccess_eck', 'firstaccess_sck'));
case 'timemodified': return new user_filter_date('timemodified', get_string('lastmodified'), $advanced, 'timemodified');
case 'nevermodified': return new user_filter_checkbox('nevermodified', get_string('nevermodified', 'filters'), $advanced, array('timemodified', 'timecreated'), array('timemodified_sck', 'timemodified_eck'));
case 'cohort': return new user_filter_cohort($advanced);
case 'auth':
$plugins = get_plugin_list('auth');
$choices = array();
foreach ($plugins as $auth => $unused) {
$choices[$auth] = get_string('pluginname', "auth_{$auth}");
}
return new user_filter_simpleselect('auth', get_string('authentication'), $advanced, 'auth', $choices);
case 'mnethostid':
// include all hosts even those deleted or otherwise problematic
if (!$hosts = $DB->get_records('mnet_host', null, 'id', 'id, wwwroot, name')) {
$hosts = array();
}
$choices = array();
foreach ($hosts as $host) {
if ($host->id == $CFG->mnet_localhost_id) {
$choices[$host->id] = format_string($SITE->fullname).' ('.get_string('local').')';
} else if (empty($host->wwwroot)) {
// All hosts
continue;
} else {
$choices[$host->id] = $host->name.' ('.$host->wwwroot.')';
}
}
if ($usedhosts = $DB->get_fieldset_sql("SELECT DISTINCT mnethostid FROM {user} WHERE deleted=0")) {
foreach ($usedhosts as $hostid) {
if (empty($hosts[$hostid])) {
$choices[$hostid] = 'id: '.$hostid.' ('.get_string('error').')';
}
}
}
if (count($choices) < 2) {
return null; // filter not needed
}
return new user_filter_simpleselect('mnethostid', get_string('mnetidprovider', 'mnet'), $advanced, 'mnethostid', $choices);
default: return null;
}
}
/**
* Returns sql where statement based on active user filters
* @param string $extra sql
* @param array named params (recommended prefix ex)
* @return array sql string and $params
*/
function get_sql_filter($extra='', array $params=null) {
global $SESSION;
$sqls = array();
if ($extra != '') {
$sqls[] = $extra;
}
$params = (array)$params;
if (!empty($SESSION->user_filtering)) {
foreach ($SESSION->user_filtering as $fname=>$datas) {
if (!array_key_exists($fname, $this->_fields)) {
continue; // filter not used
}
$field = $this->_fields[$fname];
foreach($datas as $i=>$data) {
list($s, $p) = $field->get_sql_filter($data);
$sqls[] = $s;
$params = $params + $p;
}
}
}
if (empty($sqls)) {
return array('', array());
} else {
$sqls = implode(' AND ', $sqls);
return array($sqls, $params);
}
}
/**
* Print the add filter form.
*/
function display_add() {
$this->_addform->display();
}
/**
* Print the active filter form.
*/
function display_active() {
$this->_activeform->display();
}
}
/**
* The base user filter class. All abstract classes must be implemented.
*/
class user_filter_type {
/**
* The name of this filter instance.
*/
var $_name;
/**
* The label of this filter instance.
*/
var $_label;
/**
* Advanced form element flag
*/
var $_advanced;
/**
* Constructor
* @param string $name the name of the filter instance
* @param string $label the label of the filter instance
* @param boolean $advanced advanced form element flag
*/
function user_filter_type($name, $label, $advanced) {
$this->_name = $name;
$this->_label = $label;
$this->_advanced = $advanced;
}
/**
* Returns the condition to be used with SQL where
* @param array $data filter settings
* @return string the filtering condition or null if the filter is disabled
*/
function get_sql_filter($data) {
print_error('mustbeoveride', 'debug', '', 'get_sql_filter');
}
/**
* 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) {
print_error('mustbeoveride', 'debug', '', 'check_data');
}
/**
* Adds controls specific to this filter in the form.
* @param object $mform a MoodleForm object to setup
*/
function setupForm(&$mform) {
print_error('mustbeoveride', 'debug', '', 'setupForm');
}
/**
* 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) {
print_error('mustbeoveride', 'debug', '', 'get_label');
}
}