Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/user/ -> renderer.php (source)

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401] [Versions 401 and 402] [Versions 401 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   * 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', '&nbsp;');
  72          $content .= html_writer::end_tag('form');
  73  
  74          return $content;
  75      }
  76  
  77      /**
  78       * Displays the list of tagged users
  79       *
  80       * @param array $userlist
  81       * @param bool $exclusivemode if set to true it means that no other entities tagged with this tag
  82       *             are displayed on the page and the per-page limit may be bigger
  83       * @return string
  84       */
  85      public function user_list($userlist, $exclusivemode) {
  86          $tagfeed = new core_tag\output\tagfeed();
  87          foreach ($userlist as $user) {
  88              $userpicture = $this->output->user_picture($user, array('size' => $exclusivemode ? 100 : 35));
  89              $fullname = fullname($user);
  90              if (user_can_view_profile($user)) {
  91                  $profilelink = new moodle_url('/user/view.php', array('id' => $user->id));
  92                  $fullname = html_writer::link($profilelink, $fullname);
  93              }
  94              $tagfeed->add($userpicture, $fullname);
  95          }
  96  
  97          $items = $tagfeed->export_for_template($this->output);
  98  
  99          if ($exclusivemode) {
 100              $output = '<div><ul class="inline-list">';
 101              foreach ($items['items'] as $item) {
 102                  $output .= '<li><div class="user-box">'. $item['img'] . $item['heading'] ."</div></li>\n";
 103              }
 104              $output .= "</ul></div>\n";
 105              return $output;
 106          }
 107  
 108          return $this->output->render_from_template('core_tag/tagfeed', $items);
 109      }
 110  
 111      /**
 112       * Renders the unified filter element for the course participants page.
 113       * @deprecated since 3.9
 114       * @throws coding_exception
 115       */
 116      public function unified_filter() {
 117          throw new coding_exception('unified_filter cannot be used any more, please use participants_filter instead');
 118  
 119      }
 120  
 121      /**
 122       * Render the data required for the participants filter on the course participants page.
 123       *
 124       * @param context $context The context of the course being displayed
 125       * @param string $tableregionid Container of the table to be updated by this filter, is used to retrieve the table
 126       * @return string
 127       */
 128      public function participants_filter(context $context, string $tableregionid): string {
 129          $renderable = new \core_user\output\participants_filter($context, $tableregionid);
 130          $templatecontext = $renderable->export_for_template($this->output);
 131  
 132          return $this->output->render_from_template('core_user/participantsfilter', $templatecontext);
 133      }
 134  
 135      /**
 136       * Returns a formatted filter option.
 137       *
 138       * @param int $filtertype The filter type (e.g. status, role, group, enrolment, last access).
 139       * @param string $criteria The string label of the filter type.
 140       * @param int $value The value for the filter option.
 141       * @param string $label The string representation of the filter option's value.
 142       * @return array The formatted option with the ['filtertype:value' => 'criteria: label'] format.
 143       */
 144      protected function format_filter_option($filtertype, $criteria, $value, $label) {
 145          $optionlabel = get_string('filteroption', 'moodle', (object)['criteria' => $criteria, 'value' => $label]);
 146          $optionvalue = "$filtertype:$value";
 147          return [$optionvalue => $optionlabel];
 148      }
 149  
 150      /**
 151       * Handles cases when after reloading the applied filters are missing in the filter options.
 152       *
 153       * @param array $filtersapplied The applied filters.
 154       * @param array $filteroptions The filter options.
 155       * @return array The formatted options with the ['filtertype:value' => 'criteria: label'] format.
 156       */
 157      private function handle_missing_applied_filters($filtersapplied, $filteroptions) {
 158          global $DB;
 159  
 160          foreach ($filtersapplied as $filter) {
 161              if (!array_key_exists($filter, $filteroptions)) {
 162                  $filtervalue = explode(':', $filter);
 163                  if (count($filtervalue) !== 2) {
 164                      continue;
 165                  }
 166                  $key = $filtervalue[0];
 167                  $value = $filtervalue[1];
 168  
 169                  switch($key) {
 170                      case USER_FILTER_LAST_ACCESS:
 171                          $now = usergetmidnight(time());
 172                          $criteria = get_string('usersnoaccesssince');
 173                          // Days.
 174                          for ($i = 1; $i < 7; $i++) {
 175                              $timestamp = strtotime('-' . $i . ' days', $now);
 176                              if ($timestamp < $value) {
 177                                  break;
 178                              }
 179                              $val = get_string('numdays', 'moodle', $i);
 180                              $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val);
 181                          }
 182                          // Weeks.
 183                          for ($i = 1; $i < 10; $i++) {
 184                              $timestamp = strtotime('-'.$i.' weeks', $now);
 185                              if ($timestamp < $value) {
 186                                  break;
 187                              }
 188                              $val = get_string('numweeks', 'moodle', $i);
 189                              $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val);
 190                          }
 191                          // Months.
 192                          for ($i = 2; $i < 12; $i++) {
 193                              $timestamp = strtotime('-'.$i.' months', $now);
 194                              if ($timestamp < $value) {
 195                                  break;
 196                              }
 197                              $val = get_string('nummonths', 'moodle', $i);
 198                              $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val);
 199                          }
 200                          // Try a year.
 201                          $timestamp = strtotime('-1 year', $now);
 202                          if ($timestamp >= $value) {
 203                              $val = get_string('numyear', 'moodle', 1);
 204                              $filteroptions += $this->format_filter_option(USER_FILTER_LAST_ACCESS, $criteria, $timestamp, $val);
 205                          }
 206                          break;
 207                      case USER_FILTER_ROLE:
 208                          $criteria = get_string('role');
 209                          if ($role = $DB->get_record('role', array('id' => $value))) {
 210                              $role = role_get_name($role);
 211                              $filteroptions += $this->format_filter_option(USER_FILTER_ROLE, $criteria, $value, $role);
 212                          }
 213                          break;
 214                  }
 215              }
 216          }
 217          return $filteroptions;
 218      }
 219  }