MDL-49746 course: sorting users by last access
[moodle.git] / enrol / renderer.php
CommitLineData
a70eb30f 1<?php
a70eb30f
SH
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 * This is the main renderer for the enrol section.
19 *
31ac2aef 20 * @package core_enrol
5379726a
PS
21 * @copyright 2010 Sam Hemelryk
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
a70eb30f
SH
23 */
24
25/**
26 * This is the core renderer
27 *
28 * @copyright 2010 Sam Hemelryk
29 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
30 */
31class core_enrol_renderer extends plugin_renderer_base {
32
33 /**
34 * Renders a course enrolment table
35 *
36 * @param course_enrolment_table $table
71638033 37 * @param moodleform $mform Form that contains filter controls
a70eb30f
SH
38 * @return string
39 */
71638033 40 public function render_course_enrolment_users_table(course_enrolment_users_table $table,
41 moodleform $mform) {
9fe92ae8 42
61c32b7b 43 $table->initialise_javascript();
9fe92ae8 44
b69ca6be
SH
45 $buttons = $table->get_manual_enrol_buttons();
46 $buttonhtml = '';
47 if (count($buttons) > 0) {
bbc3b079 48 $buttonhtml .= html_writer::start_tag('div', array('class' => 'enrol_user_buttons enrol-users-page-action'));
b69ca6be
SH
49 foreach ($buttons as $button) {
50 $buttonhtml .= $this->render($button);
51 }
52 $buttonhtml .= html_writer::end_tag('div');
a70eb30f 53 }
b69ca6be
SH
54
55 $content = '';
56 if (!empty($buttonhtml)) {
57 $content .= $buttonhtml;
2ec702c9 58 }
71638033 59 $content .= $mform->render();
60
a70eb30f 61 $content .= $this->output->render($table->get_paging_bar());
75ee207b
SH
62
63 // Check if the table has any bulk operations. If it does we want to wrap the table in a
64 // form so that we can capture and perform any required bulk operations.
65 if ($table->has_bulk_user_enrolment_operations()) {
66 $content .= html_writer::start_tag('form', array('action' => new moodle_url('/enrol/bulkchange.php'), 'method' => 'post'));
67 foreach ($table->get_combined_url_params() as $key => $value) {
68 if ($key == 'action') {
69 continue;
70 }
71 $content .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => $key, 'value' => $value));
72 }
73 $content .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'action', 'value' => 'bulkchange'));
74 $content .= html_writer::table($table);
75 $content .= html_writer::start_tag('div', array('class' => 'singleselect bulkuserop'));
76 $content .= html_writer::start_tag('select', array('name' => 'bulkuserop'));
77 $content .= html_writer::tag('option', get_string('withselectedusers', 'enrol'), array('value' => ''));
78 $options = array('' => get_string('withselectedusers', 'enrol'));
79 foreach ($table->get_bulk_user_enrolment_operations() as $operation) {
80 $content .= html_writer::tag('option', $operation->get_title(), array('value' => $operation->get_identifier()));
81 }
82 $content .= html_writer::end_tag('select');
83 $content .= html_writer::empty_tag('input', array('type' => 'submit', 'value' => get_string('go')));
84 $content .= html_writer::end_tag('div');
85
86 $content .= html_writer::end_tag('form');
87 } else {
88 $content .= html_writer::table($table);
89 }
a70eb30f 90 $content .= $this->output->render($table->get_paging_bar());
b69ca6be
SH
91 if (!empty($buttonhtml)) {
92 $content .= $buttonhtml;
2ec702c9 93 }
a70eb30f
SH
94 return $content;
95 }
96
b69ca6be
SH
97 /**
98 * Renderers the enrol_user_button.
99 *
100 * @param enrol_user_button $button
101 * @return string XHTML
102 */
103 protected function render_enrol_user_button(enrol_user_button $button) {
104 $attributes = array('type' => 'submit',
105 'value' => $button->label,
106 'disabled' => $button->disabled ? 'disabled' : null,
107 'title' => $button->tooltip);
108
109 if ($button->actions) {
110 $id = html_writer::random_id('single_button');
111 $attributes['id'] = $id;
112 foreach ($button->actions as $action) {
113 $this->add_action_handler($action, $id);
114 }
115 }
116 $button->initialise_js($this->page);
117
118 // first the input element
119 $output = html_writer::empty_tag('input', $attributes);
120
121 // then hidden fields
122 $params = $button->url->params();
123 if ($button->method === 'post') {
124 $params['sesskey'] = sesskey();
125 }
126 foreach ($params as $var => $val) {
127 $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => $var, 'value' => $val));
128 }
129
130 // then div wrapper for xhtml strictness
131 $output = html_writer::tag('div', $output);
132
133 // now the form itself around it
134 if ($button->method === 'get') {
135 $url = $button->url->out_omit_querystring(true); // url without params, the anchor part allowed
136 } else {
137 $url = $button->url->out_omit_querystring(); // url without params, the anchor part not allowed
138 }
139 if ($url === '') {
140 $url = '#'; // there has to be always some action
141 }
142 $attributes = array('method' => $button->method,
143 'action' => $url,
144 'id' => $button->formid);
145 $output = html_writer::tag('form', $output, $attributes);
146
147 // and finally one more wrapper with class
148 return html_writer::tag('div', $output, array('class' => $button->class));
149 }
150
6db3eee0
SH
151 /**
152 * Renders a course enrolment table
153 *
154 * @param course_enrolment_table $table
155 * @return string
156 */
157 protected function render_course_enrolment_other_users_table(course_enrolment_other_users_table $table) {
9fe92ae8 158
61c32b7b 159 $table->initialise_javascript();
9fe92ae8 160
6db3eee0 161 $content = '';
61c32b7b 162 $searchbutton = $table->get_user_search_button();
6db3eee0
SH
163 if ($searchbutton) {
164 $content .= $this->output->render($searchbutton);
165 }
166 $content .= html_writer::tag('div', get_string('otheruserdesc', 'enrol'), array('class'=>'otherusersdesc'));
167 $content .= $this->output->render($table->get_paging_bar());
168 $content .= html_writer::table($table);
169 $content .= $this->output->render($table->get_paging_bar());
61c32b7b 170 $searchbutton = $table->get_user_search_button();
6db3eee0
SH
171 if ($searchbutton) {
172 $content .= $this->output->render($searchbutton);
173 }
174 return $content;
175 }
176
a70eb30f
SH
177 /**
178 * Generates HTML to display the users roles and any available actions
179 *
180 * @param int $userid
181 * @param array $roles
182 * @param array $assignableroles
183 * @param moodle_url $pageurl
184 * @return string
185 */
186 public function user_roles_and_actions($userid, $roles, $assignableroles, $canassign, $pageurl) {
a70eb30f
SH
187 $iconenrolremove = $this->output->pix_url('t/delete');
188
3d907759
SH
189
190
191 // Get list of roles.
a70eb30f
SH
192 $rolesoutput = '';
193 foreach ($roles as $roleid=>$role) {
e9ca9d30 194 if ($canassign and (is_siteadmin() or isset($assignableroles[$roleid])) and !$role['unchangeable']) {
a70eb30f
SH
195 $strunassign = get_string('unassignarole', 'role', $role['text']);
196 $icon = html_writer::empty_tag('img', array('alt'=>$strunassign, 'src'=>$iconenrolremove));
cc6a0dd0 197 $url = new moodle_url($pageurl, array('action'=>'unassign', 'roleid'=>$roleid, 'user'=>$userid));
a70eb30f
SH
198 $rolesoutput .= html_writer::tag('div', $role['text'] . html_writer::link($url, $icon, array('class'=>'unassignrolelink', 'rel'=>$roleid, 'title'=>$strunassign)), array('class'=>'role role_'.$roleid));
199 } else {
200 $rolesoutput .= html_writer::tag('div', $role['text'], array('class'=>'role unchangeable', 'rel'=>$roleid));
201 }
202 }
203 $output = '';
204 if (!empty($assignableroles) && $canassign) {
205 $roleids = array_keys($roles);
206 $hasallroles = true;
207 foreach (array_keys($assignableroles) as $key) {
208 if (!in_array($key, $roleids)) {
209 $hasallroles = false;
210 break;
211 }
212 }
213 if (!$hasallroles) {
3d907759
SH
214 $url = new moodle_url($pageurl, array('action' => 'assign', 'user' => $userid));
215 $roleicon = $this->output->pix_icon('i/assignroles', get_string('assignroles', 'role'));
216 $link = html_writer::link($url, $roleicon, array('class' => 'assignrolelink'));
217 $output = html_writer::tag('div', $link, array('class'=>'addrole'));
a70eb30f
SH
218 }
219 }
220 $output .= html_writer::tag('div', $rolesoutput, array('class'=>'roles'));
221 return $output;
222 }
223
224 /**
225 * Generates the HTML to view the users groups and available group actions
226 *
227 * @param int $userid
228 * @param array $groups
229 * @param array $allgroups
230 * @param bool $canmanagegroups
231 * @param moodle_url $pageurl
232 * @return string
233 */
234 public function user_groups_and_actions($userid, $groups, $allgroups, $canmanagegroups, $pageurl) {
a70eb30f 235 $iconenrolremove = $this->output->pix_url('t/delete');
3d907759
SH
236
237 $groupicon = $this->output->pix_icon('i/group', get_string('addgroup', 'group'));
a70eb30f
SH
238
239 $groupoutput = '';
240 foreach($groups as $groupid=>$name) {
7881024e 241 if ($canmanagegroups and groups_remove_member_allowed($groupid, $userid)) {
a70eb30f
SH
242 $icon = html_writer::empty_tag('img', array('alt'=>get_string('removefromgroup', 'group', $name), 'src'=>$iconenrolremove));
243 $url = new moodle_url($pageurl, array('action'=>'removemember', 'group'=>$groupid, 'user'=>$userid));
244 $groupoutput .= html_writer::tag('div', $name . html_writer::link($url, $icon), array('class'=>'group', 'rel'=>$groupid));
245 } else {
246 $groupoutput .= html_writer::tag('div', $name, array('class'=>'group', 'rel'=>$groupid));
247 }
248 }
3d907759 249 $output = '';
a70eb30f 250 if ($canmanagegroups && (count($groups) < count($allgroups))) {
a70eb30f 251 $url = new moodle_url($pageurl, array('action'=>'addmember', 'user'=>$userid));
3d907759 252 $output .= html_writer::tag('div', html_writer::link($url, $groupicon), array('class'=>'addgroup'));
a70eb30f 253 }
3d907759
SH
254 $output = $output.html_writer::tag('div', $groupoutput, array('class'=>'groups'));
255 return $output;
a70eb30f
SH
256 }
257
258 /**
259 * Generates the HTML for the given enrolments + available actions
260 *
261 * @param int $userid
262 * @param array $enrolments
263 * @param moodle_url $pageurl
264 * @return string
265 */
291215f4 266 public function user_enrolments_and_actions($enrolments) {
a70eb30f 267 $output = '';
291215f4
SH
268 foreach ($enrolments as $ue) {
269 $enrolmentoutput = $ue['text'].' '.$ue['period'];
270 if ($ue['dimmed']) {
a70eb30f 271 $enrolmentoutput = html_writer::tag('span', $enrolmentoutput, array('class'=>'dimmed_text'));
291215f4
SH
272 } else {
273 $enrolmentoutput = html_writer::tag('span', $enrolmentoutput);
a70eb30f 274 }
291215f4
SH
275 foreach ($ue['actions'] as $action) {
276 $enrolmentoutput .= $this->render($action);
a70eb30f
SH
277 }
278 $output .= html_writer::tag('div', $enrolmentoutput, array('class'=>'enrolment'));
279 }
280 return $output;
281 }
282
291215f4
SH
283 /**
284 * Renders a user enrolment action
285 * @param user_enrolment_action $icon
286 * @return string
287 */
288 protected function render_user_enrolment_action(user_enrolment_action $icon) {
289 return html_writer::link($icon->get_url(), $this->output->render($icon->get_icon()), $icon->get_attributes());
290 }
a70eb30f
SH
291}
292
293/**
294 * Main course enrolment table
295 *
296 * This table is used to display the enrolment information for a course.
297 * It requires that a course enrolment manager be provided during constuct with
298 * provides all of the information for the table.
299 * The control then produces the table, the paging, and the associated JS actions
300 * for the page.
301 *
302 * @package core
303 * @subpackage enrol
304 * @copyright 2010 Sam Hemelryk
305 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
306 */
307class course_enrolment_table extends html_table implements renderable {
308
309 /**
310 * The get/post variable that is used to identify the page.
311 * Default: page
312 */
313 const PAGEVAR = 'page';
314
315 /**
316 * The get/post variable to is used to identify the number of items to display
317 * per page.
318 * Default: perpage
319 */
320 const PERPAGEVAR = 'perpage';
321
322 /**
323 * The get/post variable that is used to identify the sort field for the table.
324 * Default: sort
325 */
326 const SORTVAR = 'sort';
327
328 /**
329 * The get/post variable that is used to identify the sort direction for the table.
330 * Default: dir
331 */
332 const SORTDIRECTIONVAR = 'dir';
333
334 /**
335 * The default number of items per page.
23cee7a4 336 * Default: 100
a70eb30f 337 */
23cee7a4 338 const DEFAULTPERPAGE = 100;
a70eb30f
SH
339
340 /**
341 * The default sort, options are course_enrolment_table::$sortablefields
342 * Default: lastname
343 */
344 const DEFAULTSORT = 'lastname';
345
346 /**
347 * The default direction
348 * Default: ASC
349 */
350 const DEFAULTSORTDIRECTION = 'ASC';
351
352 /**
353 * The current page, starting from 0
354 * @var int
355 */
356 public $page = 0;
357
358 /**
359 * The total number of pages
360 * @var int
361 */
362 public $pages = 0;
363
364 /**
365 * The number of items to display per page
366 * @var int
367 */
368 public $perpage = 0;
369
a70eb30f
SH
370 /**
371 * The sort field for this table, should be one of course_enrolment_table::$sortablefields
372 * @var string
373 */
374 public $sort;
375
376 /**
377 * The sort direction, either ASC or DESC
378 * @var string
379 */
380 public $sortdirection;
381
382 /**
383 * The course manager this table is displaying for
384 * @var course_enrolment_manager
385 */
386 protected $manager;
387
388 /**
389 * The paging bar that controls the paging for this table
390 * @var paging_bar
391 */
392 protected $pagingbar = null;
393
394 /**
395 * The total number of users enrolled in the course
396 * @var int
397 */
398 protected $totalusers = null;
399
400 /**
401 * The users enrolled in this course
402 * @var array
403 */
404 protected $users = null;
405
406 /**
407 * The fields for this table
408 * @var array
409 */
410 protected $fields = array();
411
75ee207b
SH
412 /**
413 * An array of bulk user enrolment operations
414 * @var array
415 */
416 protected $bulkoperations = array();
417
6db3eee0
SH
418 /**
419 * An array of sortable fields
420 * @static
421 * @var array
422 */
95065006 423 protected static $sortablefields = array('firstname', 'lastname', 'firstnamephonetic', 'lastnamephonetic', 'middlename',
afc6a269 424 'alternatename', 'idnumber', 'email', 'phone1', 'phone2', 'institution', 'department', 'lastaccess', 'lastcourseaccess' );
a70eb30f
SH
425
426 /**
427 * Constructs the table
428 *
429 * @param course_enrolment_manager $manager
430 */
076995bf 431 public function __construct(course_enrolment_manager $manager) {
a70eb30f 432
61c32b7b 433 $this->manager = $manager;
5379726a 434
61c32b7b
PS
435 $this->page = optional_param(self::PAGEVAR, 0, PARAM_INT);
436 $this->perpage = optional_param(self::PERPAGEVAR, self::DEFAULTPERPAGE, PARAM_INT);
8975ff88 437 $this->sort = optional_param(self::SORTVAR, self::DEFAULTSORT, PARAM_ALPHANUM);
a70eb30f
SH
438 $this->sortdirection = optional_param(self::SORTDIRECTIONVAR, self::DEFAULTSORTDIRECTION, PARAM_ALPHA);
439
440 $this->attributes = array('class'=>'userenrolment');
441 if (!in_array($this->sort, self::$sortablefields)) {
442 $this->sort = self::DEFAULTSORT;
443 }
444 if ($this->page < 0) {
445 $this->page = 0;
446 }
447 if ($this->sortdirection !== 'ASC' && $this->sortdirection !== 'DESC') {
448 $this->sortdirection = self::DEFAULTSORTDIRECTION;
449 }
450
451 $this->id = html_writer::random_id();
75ee207b
SH
452
453 // Collect the bulk operations for the currently filtered plugin if there is one.
454 $plugin = $manager->get_filtered_enrolment_plugin();
005e57a2 455 if ($plugin and enrol_is_enabled($plugin->get_name())) {
75ee207b
SH
456 $this->bulkoperations = $plugin->get_bulk_operations($manager);
457 }
a70eb30f
SH
458 }
459
b69ca6be
SH
460 /**
461 * Returns an array of enrol_user_buttons that are created by the different
462 * enrolment plugins available.
463 *
464 * @return array
465 */
466 public function get_manual_enrol_buttons() {
467 return $this->manager->get_manual_enrol_buttons();
468 }
469
a70eb30f
SH
470 /**
471 * Gets the sort direction for a given field
472 *
473 * @param string $field
474 * @return string ASC or DESC
475 */
476 public function get_field_sort_direction($field) {
477 if ($field == $this->sort) {
478 return ($this->sortdirection == 'ASC')?'DESC':'ASC';
479 }
480 return self::DEFAULTSORTDIRECTION;
481 }
482
483 /**
484 * Sets the fields for this table. These get added to the tables head as well.
485 *
486 * You can also use a multi dimensional array for this to have multiple fields
487 * in a single column
488 *
489 * @param array $fields An array of fields to set
490 * @param string $output
491 */
9fe92ae8 492 public function set_fields($fields, $output) {
a70eb30f
SH
493 $this->fields = $fields;
494 $this->head = array();
495 $this->colclasses = array();
496 $this->align = array();
076995bf 497 $url = $this->manager->get_moodlepage()->url;
75ee207b
SH
498
499 if (!empty($this->bulkoperations)) {
500 // If there are bulk operations add a column for checkboxes.
501 $this->head[] = '';
502 $this->colclasses[] = 'field col_bulkops';
503 }
504
a70eb30f
SH
505 foreach ($fields as $name => $label) {
506 $newlabel = '';
507 if (is_array($label)) {
508 $bits = array();
509 foreach ($label as $n => $l) {
510 if ($l === false) {
511 continue;
512 }
513 if (!in_array($n, self::$sortablefields)) {
514 $bits[] = $l;
515 } else {
afc6a269
MG
516 $sorturl = new moodle_url($url, array(self::SORTVAR => $n, self::SORTDIRECTIONVAR => $this->get_field_sort_direction($n)));
517 $link = html_writer::link($sorturl, $fields[$name][$n]);
a70eb30f 518 if ($this->sort == $n) {
afc6a269 519 $link .= $this->get_direction_icon($output, $n);
a70eb30f
SH
520 }
521 $bits[] = html_writer::tag('span', $link, array('class'=>'subheading_'.$n));
522
523 }
524 }
525 $newlabel = join(' / ', $bits);
526 } else {
527 if (!in_array($name, self::$sortablefields)) {
528 $newlabel = $label;
529 } else {
afc6a269
MG
530 $sorturl = new moodle_url($url, array(self::SORTVAR => $name, self::SORTDIRECTIONVAR => $this->get_field_sort_direction($name)));
531 $newlabel = html_writer::link($sorturl, $fields[$name]);
a70eb30f 532 if ($this->sort == $name) {
afc6a269 533 $newlabel .= $this->get_direction_icon($output, $name);
a70eb30f
SH
534 }
535 }
536 }
537 $this->head[] = $newlabel;
538 $this->colclasses[] = 'field col_'.$name;
539 }
540 }
541 /**
542 * Sets the total number of users
543 *
544 * @param int $totalusers
545 */
546 public function set_total_users($totalusers) {
547 $this->totalusers = $totalusers;
548 $this->pages = ceil($this->totalusers / $this->perpage);
549 if ($this->page > $this->pages) {
550 $this->page = $this->pages;
551 }
552 }
a70eb30f
SH
553 /**
554 * Sets the users for this table
555 *
556 * @param array $users
61c32b7b 557 * @return void
a70eb30f 558 */
9fe92ae8 559 public function set_users(array $users) {
560 $this->users = $users;
75ee207b 561 $hasbulkops = !empty($this->bulkoperations);
a70eb30f
SH
562 foreach ($users as $userid=>$user) {
563 $user = (array)$user;
564 $row = new html_table_row();
565 $row->attributes = array('class' => 'userinforow');
566 $row->id = 'user_'.$userid;
567 $row->cells = array();
75ee207b
SH
568 if ($hasbulkops) {
569 // Add a checkbox into the first column.
570 $input = html_writer::empty_tag('input', array('type' => 'checkbox', 'name' => 'bulkuser[]', 'value' => $userid));
571 $row->cells[] = new html_table_cell($input);
572 }
a70eb30f
SH
573 foreach ($this->fields as $field => $label) {
574 if (is_array($label)) {
575 $bits = array();
576 foreach (array_keys($label) as $subfield) {
577 if (array_key_exists($subfield, $user)) {
578 $bits[] = html_writer::tag('div', $user[$subfield], array('class'=>'subfield subfield_'.$subfield));
579 }
580 }
581 if (empty($bits)) {
582 $bits[] = '&nbsp;';
583 }
584 $row->cells[] = new html_table_cell(join(' ', $bits));
585 } else {
586 if (!array_key_exists($field, $user)) {
587 $user[$field] = '&nbsp;';
588 }
589 $row->cells[] = new html_table_cell($user[$field]);
590 }
591 }
592 $this->data[] = $row;
593 }
9fe92ae8 594 }
595
61c32b7b 596 public function initialise_javascript() {
a70eb30f 597 if (has_capability('moodle/role:assign', $this->manager->get_context())) {
076995bf 598 $this->manager->get_moodlepage()->requires->strings_for_js(array(
6db3eee0
SH
599 'assignroles',
600 'confirmunassign',
601 'confirmunassigntitle',
602 'confirmunassignyes',
603 'confirmunassignno'
604 ), 'role');
605 $modules = array('moodle-enrol-rolemanager', 'moodle-enrol-rolemanager-skin');
606 $function = 'M.enrol.rolemanager.init';
607 $arguments = array(
608 'containerId'=>$this->id,
9fe92ae8 609 'userIds'=>array_keys($this->users),
9f15347e
SH
610 'courseId'=>$this->manager->get_course()->id,
611 'otherusers'=>isset($this->otherusers));
076995bf 612 $this->manager->get_moodlepage()->requires->yui_module($modules, $function, array($arguments));
a70eb30f
SH
613 }
614 }
5379726a 615
a70eb30f
SH
616 /**
617 * Gets the paging bar instance for this table
618 *
619 * @return paging_bar
620 */
621 public function get_paging_bar() {
622 if ($this->pagingbar == null) {
076995bf 623 $this->pagingbar = new paging_bar($this->totalusers, $this->page, $this->perpage, $this->manager->get_moodlepage()->url, self::PAGEVAR);
a70eb30f
SH
624 }
625 return $this->pagingbar;
626 }
627
628 /**
629 * Gets the direction icon for the sortable field within this table
630 *
631 * @param core_renderer $output
632 * @param string $field
633 * @return string
634 */
635 protected function get_direction_icon($output, $field) {
636 $direction = self::DEFAULTSORTDIRECTION;
637 if ($this->sort == $field) {
638 $direction = $this->sortdirection;
639 }
640 if ($direction === 'ASC') {
06b7ed0a
FM
641 return html_writer::empty_tag('img', array('alt' => '', 'class' => 'iconsort',
642 'src' => $output->pix_url('t/sort_asc')));
a70eb30f 643 } else {
06b7ed0a
FM
644 return html_writer::empty_tag('img', array('alt' => '', 'class' => 'iconsort',
645 'src' => $output->pix_url('t/sort_desc')));
a70eb30f
SH
646 }
647 }
648
649 /**
650 * Gets the params that will need to be added to the url in order to return to this page.
651 *
652 * @return array
653 */
654 public function get_url_params() {
655 return array(
656 self::PAGEVAR => $this->page,
657 self::PERPAGEVAR => $this->perpage,
658 self::SORTVAR => $this->sort,
659 self::SORTDIRECTIONVAR => $this->sortdirection
660 );
661 }
75ee207b
SH
662
663 /**
664 * Returns an array of URL params for both the table and the manager.
665 *
666 * @return array
667 */
668 public function get_combined_url_params() {
669 return $this->get_url_params() + $this->manager->get_url_params();
670 }
671
672 /**
673 * Sets the bulk operations for this table.
674 *
675 * @param array $bulkoperations
676 */
677 public function set_bulk_user_enrolment_operations(array $bulkoperations) {
678 $this->bulkoperations = $bulkoperations;
679 }
680
681 /**
682 * Returns an array of bulk operations.
683 *
684 * @return array
685 */
686 public function get_bulk_user_enrolment_operations() {
687 return $this->bulkoperations;
688 }
689
690 /**
691 * Returns true fi the table is aware of any bulk operations that can be performed on users
692 * selected from the currently filtered enrolment plugins.
693 *
694 * @return bool
695 */
696 public function has_bulk_user_enrolment_operations() {
697 return !empty($this->bulkoperations);
698 }
6db3eee0
SH
699}
700
701/**
702 * Table control used for enrolled users
703 *
704 * @copyright 2010 Sam Hemelryk
705 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
706 */
707class course_enrolment_users_table extends course_enrolment_table {
a70eb30f 708
6db3eee0
SH
709}
710
711/**
712 * Table used for other users
713 *
714 * Other users are users who have roles but are not enrolled.
715 *
716 * @copyright 2010 Sam Hemelryk
717 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
718 */
719class course_enrolment_other_users_table extends course_enrolment_table {
720
9f15347e
SH
721 public $otherusers = true;
722
6db3eee0
SH
723 /**
724 * Constructs the table
725 *
726 * @param course_enrolment_manager $manager
6db3eee0 727 */
076995bf
SH
728 public function __construct(course_enrolment_manager $manager) {
729 parent::__construct($manager);
6db3eee0
SH
730 $this->attributes = array('class'=>'userenrolment otheruserenrolment');
731 }
732
733 /**
734 * Gets a button to search users and assign them roles in the course.
735 *
736 * @staticvar int $count
737 * @param int $page
738 * @return single_button
739 */
61c32b7b 740 public function get_user_search_button() {
6db3eee0
SH
741 static $count = 0;
742 if (!has_capability('moodle/role:assign', $this->manager->get_context())) {
743 return false;
744 }
745 $count++;
61c32b7b 746 $url = new moodle_url('/admin/roles/assign.php', array('contextid'=>$this->manager->get_context()->id, 'sesskey'=>sesskey()));
6db3eee0
SH
747 $control = new single_button($url, get_string('assignroles', 'role'), 'get');
748 $control->class = 'singlebutton assignuserrole instance'.$count;
749 if ($count == 1) {
076995bf 750 $this->manager->get_moodlepage()->requires->strings_for_js(array(
6db3eee0
SH
751 'ajaxoneuserfound',
752 'ajaxxusersfound',
753 'ajaxnext25',
754 'enrol',
755 'enrolmentoptions',
756 'enrolusers',
3a0c9c63 757 'enrolxusers',
6db3eee0
SH
758 'errajaxfailedenrol',
759 'errajaxsearch',
3a0c9c63 760 'foundxcohorts',
6db3eee0
SH
761 'none',
762 'usersearch',
763 'unlimitedduration',
764 'startdatetoday',
765 'durationdays',
766 'enrolperiod'), 'enrol');
076995bf 767 $this->manager->get_moodlepage()->requires->string_for_js('assignrole', 'role');
6db3eee0
SH
768
769 $modules = array('moodle-enrol-otherusersmanager', 'moodle-enrol-otherusersmanager-skin');
770 $function = 'M.enrol.otherusersmanager.init';
6db3eee0
SH
771 $arguments = array(
772 'courseId'=> $this->manager->get_course()->id,
773 'ajaxUrl' => '/enrol/ajax.php',
076995bf
SH
774 'url' => $this->manager->get_moodlepage()->url->out(false));
775 $this->manager->get_moodlepage()->requires->yui_module($modules, $function, array($arguments));
6db3eee0
SH
776 }
777 return $control;
778 }
2ec702c9 779}