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.
   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   * override permissions table.
  19   *
  20   * @package    core_role
  21   * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  class core_role_override_permissions_table_advanced extends core_role_capability_table_with_risks {
  28      protected $strnotset;
  29      protected $haslockedcapabilities = false;
  30  
  31      /**
  32       * Constructor.
  33       *
  34       * This method loads loads all the information about the current state of
  35       * the overrides, then updates that based on any submitted data. It also
  36       * works out which capabilities should be locked for this user.
  37       *
  38       * @param object $context the context this table relates to.
  39       * @param integer $roleid the role being overridden.
  40       * @param boolean $safeoverridesonly If true, the user is only allowed to override
  41       *      capabilities with no risks.
  42       */
  43      public function __construct($context, $roleid, $safeoverridesonly) {
  44          parent::__construct($context, 'overriderolestable', $roleid);
  45          $this->displaypermissions = $this->allpermissions;
  46          $this->strnotset = get_string('notset', 'core_role');
  47  
  48          // Determine which capabilities should be locked.
  49          if ($safeoverridesonly) {
  50              foreach ($this->capabilities as $capid => $cap) {
  51                  if (!is_safe_capability($cap)) {
  52                      $this->capabilities[$capid]->locked = true;
  53                      $this->haslockedcapabilities = true;
  54                  }
  55              }
  56          }
  57      }
  58  
  59      /**
  60       * This method adds an additional class to a row if capability is other than inherited.
  61       *
  62       * @param stdClass $capability
  63       * @return array
  64       */
  65      protected function get_row_attributes($capability) {
  66          $rowattributes = parent::get_row_attributes($capability);
  67          if ($this->permissions[$capability->name] !== 0) {
  68              if (empty($rowattributes['class'])) {
  69                  $rowattributes['class'] = "overriddenpermission table-warning";
  70              } else {
  71                  $rowattributes['class'] .= " overriddenpermission table-warning";
  72              }
  73          }
  74          return $rowattributes;
  75      }
  76  
  77      protected function load_parent_permissions() {
  78          // Get the capabilities from the parent context, so that can be shown in the interface.
  79          $parentcontext = $this->context->get_parent_context();
  80          $this->parentpermissions = role_context_capabilities($this->roleid, $parentcontext);
  81      }
  82  
  83      public function has_locked_capabilities() {
  84          return $this->haslockedcapabilities;
  85      }
  86  
  87      protected function add_permission_cells($capability) {
  88          $disabled = '';
  89          if ($capability->locked || $this->parentpermissions[$capability->name] == CAP_PROHIBIT) {
  90              $disabled = ' disabled="disabled"';
  91          }
  92  
  93          // One cell for each possible permission.
  94          $content = '';
  95          foreach ($this->displaypermissions as $perm => $permname) {
  96              $strperm = $this->strperms[$permname];
  97              $extraclass = '';
  98              if ($perm != CAP_INHERIT && $perm == $this->parentpermissions[$capability->name]) {
  99                  $extraclass = ' capcurrent';
 100              }
 101              $checked = '';
 102              if ($this->permissions[$capability->name] == $perm) {
 103                  $checked = 'checked="checked" ';
 104              }
 105              $content .= '<td class="' . $permname . $extraclass . '">';
 106              $content .= '<label><input type="radio" name="' . $capability->name .
 107                  '" value="' . $perm . '" ' . $checked . $disabled . '/> ';
 108              if ($perm == CAP_INHERIT) {
 109                  $inherited = $this->parentpermissions[$capability->name];
 110                  if ($inherited == CAP_INHERIT) {
 111                      $inherited = $this->strnotset;
 112                  } else {
 113                      $inherited = $this->strperms[$this->allpermissions[$inherited]];
 114                  }
 115                  $strperm .= ' (' . $inherited . ')';
 116              }
 117              $content .= '<span class="note">' . $strperm . '</span>';
 118              $content .= '</label></td>';
 119          }
 120          return $content;
 121      }
 122  }