Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402] [Versions 401 and 402]
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 * Provides user rendering functionality such as printing private files tree and displaying a search utility 19 * 20 * @package core_user 21 * @copyright 2010 Dongsheng Cai <dongsheng@moodle.com> 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 /** 28 * Provides user rendering functionality such as printing private files tree and displaying a search utility 29 * @copyright 2010 Dongsheng Cai <dongsheng@moodle.com> 30 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 31 */ 32 class core_user_renderer extends plugin_renderer_base { 33 34 /** 35 * Prints user search utility that can search user by first initial of firstname and/or first initial of lastname 36 * Prints a header with a title and the number of users found within that subset 37 * @param string $url the url to return to, complete with any parameters needed for the return 38 * @param string $firstinitial the first initial of the firstname 39 * @param string $lastinitial the first initial of the lastname 40 * @param int $usercount the amount of users meeting the search criteria 41 * @param int $totalcount the amount of users of the set/subset being searched 42 * @param string $heading heading of the subset being searched, default is All Participants 43 * @return string html output 44 */ 45 public function user_search($url, $firstinitial, $lastinitial, $usercount, $totalcount, $heading = null) { 46 47 if ($firstinitial !== 'all') { 48 set_user_preference('ifirst', $firstinitial); 49 } 50 if ($lastinitial !== 'all') { 51 set_user_preference('ilast', $lastinitial); 52 } 53 54 if (!isset($heading)) { 55 $heading = get_string('allparticipants'); 56 } 57 58 $content = html_writer::start_tag('form', array('action' => new moodle_url($url))); 59 $content .= html_writer::start_tag('div'); 60 61 // Search utility heading. 62 $content .= $this->output->heading($heading.get_string('labelsep', 'langconfig').$usercount.'/'.$totalcount, 3); 63 64 // Initials bar. 65 $prefixfirst = 'sifirst'; 66 $prefixlast = 'silast'; 67 $content .= $this->output->initials_bar($firstinitial, 'firstinitial', get_string('firstname'), $prefixfirst, $url); 68 $content .= $this->output->initials_bar($lastinitial, 'lastinitial', get_string('lastname'), $prefixlast, $url); 69 70 $content .= html_writer::end_tag('div'); 71 $content .= html_writer::tag('div', ' '); 72 $content .= html_writer::end_tag('form'); 73 74 return $content; 75 } 76 77 /** 78 * Construct a partial user search that'll require form handling implemented by the caller. 79 * This allows the developer to have an initials bar setup that does not automatically redirect. 80 * 81 * @param string $url the url to return to, complete with any parameters needed for the return 82 * @param string $firstinitial the first initial of the firstname 83 * @param string $lastinitial the first initial of the lastname 84 * @param bool $minirender Return a trimmed down view of the initials bar. 85 * @return string html output 86 * @throws coding_exception 87 */ 88 public function partial_user_search(String $url, String $firstinitial, String $lastinitial, Bool $minirender = false): String { 89 90 $content = ''; 91 92 if ($firstinitial !== 'all') { 93 set_user_preference('ifirst', $firstinitial); 94 } 95 if ($lastinitial !== 'all') { 96 set_user_preference('ilast', $lastinitial); 97 } 98 99 // Initials bar. 100 $prefixfirst = 'sifirst'; 101 $prefixlast = 'silast'; 102 $content .= $this->output->initials_bar( 103 $firstinitial, 104 'firstinitial', 105 get_string('firstname'), 106 $prefixfirst, 107 $url, 108 null, 109 $minirender 110 ); 111 $content .= $this->output->initials_bar( 112 $lastinitial, 113 'lastinitial', 114 get_string('lastname'), 115 $prefixlast, 116 $url, 117 null, 118 $minirender 119 ); 120 121 return $content; 122 } 123 124 /** 125 * Displays the list of tagged users 126 * 127 * @param array $userlist 128 * @param bool $exclusivemode if set to true it means that no other entities tagged with this tag 129 * are displayed on the page and the per-page limit may be bigger 130 * @return string 131 */ 132 public function user_list($userlist, $exclusivemode) { 133 $tagfeed = new core_tag\output\tagfeed(); 134 foreach ($userlist as $user) { 135 $userpicture = $this->output->user_picture($user, array('size' => $exclusivemode ? 100 : 35)); 136 $fullname = fullname($user); 137 if (user_can_view_profile($user)) { 138 $profilelink = new moodle_url('/user/view.php', array('id' => $user->id)); 139 $fullname = html_writer::link($profilelink, $fullname); 140 } 141 $tagfeed->add($userpicture, $fullname); 142 } 143 144 $items = $tagfeed->export_for_template($this->output); 145 146 if ($exclusivemode) { 147 $output = '<div><ul class="inline-list">'; 148 foreach ($items['items'] as $item) { 149 $output .= '<li><div class="user-box">'. $item['img'] . $item['heading'] ."</div></li>\n"; 150 } 151 $output .= "</ul></div>\n"; 152 return $output; 153 } 154 155 return $this->output->render_from_template('core_tag/tagfeed', $items); 156 } 157 158 /** 159 * Renders the unified filter element for the course participants page. 160 * @deprecated since 3.9 161 * @throws coding_exception 162 */ 163 public function unified_filter() { 164 throw new coding_exception('unified_filter cannot be used any more, please use participants_filter instead'); 165 166 } 167 168 /** 169 * Render the data required for the participants filter on the course participants page. 170 * 171 * @param context $context The context of the course being displayed 172 * @param string $tableregionid Container of the table to be updated by this filter, is used to retrieve the table 173 * @return string 174 */ 175 public function participants_filter(context $context, string $tableregionid): string { 176 $renderable = new \core_user\output\participants_filter($context, $tableregionid); 177 $templatecontext = $renderable->export_for_template($this->output); 178 179 return $this->output->render_from_template('core_user/participantsfilter', $templatecontext); 180 } 181 182 /** 183 * Returns a formatted filter option. 184 * 185 * @param int $filtertype The filter type (e.g. status, role, group, enrolment, last access). 186 * @param string $criteria The string label of the filter type. 187 * @param int $value The value for the filter option. 188 * @param string $label The string representation of the filter option's value. 189 * @return array The formatted option with the ['filtertype:value' => 'criteria: label'] format. 190 */ 191 protected function format_filter_option($filtertype, $criteria, $value, $label) { 192 $optionlabel = get_string('filteroption', 'moodle', (object)['criteria' => $criteria, 'value' => $label]); 193 $optionvalue = "$filtertype:$value"; 194 return [$optionvalue => $optionlabel]; 195 } 196 197 /** 198 * Handles cases when after reloading the applied filters are missing in the filter options. 199 * 200 * @param array $filtersapplied The applied filters. 201 * @param array $filteroptions The filter options. 202 * @return array The formatted options with the ['filtertype:value' => 'criteria: label'] format. 203 */ 204 private function handle_missing_applied_filters($filtersapplied, $filteroptions) { 205 global $DB; 206 207 foreach ($filtersapplied as $filter) { 208 if (!array_key_exists($filter, $filteroptions)) { 209 $filtervalue = explode(':', $filter); 210 if (count($filtervalue) !== 2) { 211 continue; 212 } 213 $key = $filtervalue[0]; 214 $value = $filtervalue[1]; 215 216 switch($key) { 217 case USER_FILTER_LAST_ACCESS: 218 $now = usergetmidnight(time()); 219 $criteria = get_string('usersnoaccesssince'); 220 // Days. 221 for ($i = 1; $i < 7; $i++) { 222 $timestamp = strtotime('-' . $i . ' days', $now); 223 if ($timestamp < $value) { 224 break; 225 } 226 $val = get_string('numdays', 'moodle', $i); 227 $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val); 228 } 229 // Weeks. 230 for ($i = 1; $i < 10; $i++) { 231 $timestamp = strtotime('-'.$i.' weeks', $now); 232 if ($timestamp < $value) { 233 break; 234 } 235 $val = get_string('numweeks', 'moodle', $i); 236 $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val); 237 } 238 // Months. 239 for ($i = 2; $i < 12; $i++) { 240 $timestamp = strtotime('-'.$i.' months', $now); 241 if ($timestamp < $value) { 242 break; 243 } 244 $val = get_string('nummonths', 'moodle', $i); 245 $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val); 246 } 247 // Try a year. 248 $timestamp = strtotime('-1 year', $now); 249 if ($timestamp >= $value) { 250 $val = get_string('numyear', 'moodle', 1); 251 $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val); 252 } 253 break; 254 case USER_FILTER_ROLE: 255 $criteria = get_string('role'); 256 if ($role = $DB->get_record('role', array('id' => $value))) { 257 $role = role_get_name($role); 258 $filteroptions += $this->format_filter_option(USER_FILTER_ROLE, $criteria, $value, $role); 259 } 260 break; 261 } 262 } 263 } 264 return $filteroptions; 265 } 266 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body