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.
/enrol/mnet/ -> lib.php (source)
   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   * MNet enrolment plugin
  19   *
  20   * @package    enrol_mnet
  21   * @copyright  2010 David Mudrak <david@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   * MNet enrolment plugin implementation for Moodle 2.x enrolment framework
  29   */
  30  class enrol_mnet_plugin extends enrol_plugin {
  31  
  32      /**
  33       * Returns localised name of enrol instance
  34       *
  35       * @param object|null $instance enrol_mnet instance
  36       * @return string
  37       */
  38      public function get_instance_name($instance) {
  39          global $DB;
  40  
  41          if (empty($instance)) {
  42              $enrol = $this->get_name();
  43              return get_string('pluginname', 'enrol_'.$enrol);
  44  
  45          } else if (empty($instance->name)) {
  46              $enrol = $this->get_name();
  47              if ($role = $DB->get_record('role', array('id'=>$instance->roleid))) {
  48                  $role = role_get_name($role, context_course::instance($instance->courseid, IGNORE_MISSING));
  49              } else {
  50                  $role = get_string('error');
  51              }
  52              if (empty($instance->customint1)) {
  53                  $host = get_string('remotesubscribersall', 'enrol_mnet');
  54              } else {
  55                  $host = $DB->get_field('mnet_host', 'name', array('id'=>$instance->customint1));
  56              }
  57              return get_string('pluginname', 'enrol_'.$enrol) . ' (' . format_string($host) . ' - ' . $role .')';
  58  
  59          } else {
  60              return format_string($instance->name);
  61          }
  62      }
  63  
  64      /**
  65       * Returns true if a new instance can be added to this course.
  66       *
  67       * The link is returned only if there are some MNet peers that we publish enrolment service to.
  68       *
  69       * @param int $courseid id of the course to add the instance to
  70       * @return boolean
  71       */
  72      public function can_add_instance($courseid) {
  73          global $CFG, $DB;
  74          require_once($CFG->dirroot.'/mnet/service/enrol/locallib.php');
  75  
  76          $service = mnetservice_enrol::get_instance();
  77          if (!$service->is_available()) {
  78              return false;
  79          }
  80          $coursecontext = context_course::instance($courseid);
  81          if (!has_capability('moodle/course:enrolconfig', $coursecontext)) {
  82              return false;
  83          }
  84          $subscribers = $service->get_remote_subscribers();
  85          if (empty($subscribers)) {
  86              return false;
  87          }
  88  
  89          return true;
  90      }
  91  
  92      /**
  93       * Is it possible to delete enrol instance via standard UI?
  94       *
  95       * @param stdClass $instance
  96       * @return bool
  97       */
  98      public function can_delete_instance($instance) {
  99          $context = context_course::instance($instance->courseid);
 100          return has_capability('enrol/mnet:config', $context);
 101      }
 102  
 103      /**
 104       * Is it possible to hide/show enrol instance via standard UI?
 105       *
 106       * @param stdClass $instance
 107       * @return bool
 108       */
 109      public function can_hide_show_instance($instance) {
 110          $context = context_course::instance($instance->courseid);
 111          return has_capability('enrol/mnet:config', $context);
 112      }
 113  
 114      /**
 115       * Return an array of valid options for the hosts property.
 116       *
 117       * @return array
 118       */
 119      protected function get_valid_hosts_options() {
 120          global $CFG;
 121          require_once($CFG->dirroot.'/mnet/service/enrol/locallib.php');
 122  
 123          $service = mnetservice_enrol::get_instance();
 124  
 125          $subscribers = $service->get_remote_subscribers();
 126          $hosts = array(0 => get_string('remotesubscribersall', 'enrol_mnet'));
 127          foreach ($subscribers as $hostid => $subscriber) {
 128              $hosts[$hostid] = $subscriber->appname.': '.$subscriber->hostname.' ('.$subscriber->hosturl.')';
 129          }
 130          return $hosts;
 131      }
 132  
 133      /**
 134       * Return an array of valid options for the roles property.
 135       *
 136       * @param context $context
 137       * @return array
 138       */
 139      protected function get_valid_roles_options($context) {
 140          $roles = get_assignable_roles($context);
 141          return $roles;
 142      }
 143  
 144      /**
 145       * Add elements to the edit instance form.
 146       *
 147       * @param stdClass $instance
 148       * @param MoodleQuickForm $mform
 149       * @param context $context
 150       * @return bool
 151       */
 152      public function edit_instance_form($instance, MoodleQuickForm $mform, $context) {
 153          global $CFG;
 154  
 155          $hosts = $this->get_valid_hosts_options();
 156          $mform->addElement('select', 'customint1', get_string('remotesubscriber', 'enrol_mnet'), $hosts);
 157          $mform->addHelpButton('customint1', 'remotesubscriber', 'enrol_mnet');
 158          $mform->addRule('customint1', get_string('required'), 'required', null, 'client');
 159  
 160          $roles = $this->get_valid_roles_options($context);
 161          $mform->addElement('select', 'roleid', get_string('roleforremoteusers', 'enrol_mnet'), $roles);
 162          $mform->addHelpButton('roleid', 'roleforremoteusers', 'enrol_mnet');
 163          $mform->addRule('roleid', get_string('required'), 'required', null, 'client');
 164          $mform->setDefault('roleid', $this->get_config('roleid'));
 165  
 166          $mform->addElement('text', 'name', get_string('instancename', 'enrol_mnet'));
 167          $mform->addHelpButton('name', 'instancename', 'enrol_mnet');
 168          $mform->setType('name', PARAM_TEXT);
 169      }
 170  
 171      /**
 172       * We are a good plugin and don't invent our own UI/validation code path.
 173       *
 174       * @return boolean
 175       */
 176      public function use_standard_editing_ui() {
 177          return true;
 178      }
 179  
 180      /**
 181       * Perform custom validation of the data used to edit the instance.
 182       *
 183       * @param array $data array of ("fieldname"=>value) of submitted data
 184       * @param array $files array of uploaded files "element_name"=>tmp_file_path
 185       * @param object $instance The instance loaded from the DB
 186       * @param context $context The context of the instance we are editing
 187       * @return array of "element_name"=>"error_description" if there are errors,
 188       *         or an empty array if everything is OK.
 189       * @return void
 190       */
 191      public function edit_instance_validation($data, $files, $instance, $context) {
 192          global $DB;
 193          $errors = array();
 194  
 195          $validroles = array_keys($this->get_valid_roles_options($context));
 196          $validhosts = array_keys($this->get_valid_hosts_options());
 197  
 198          $params = array('enrol' => 'mnet', 'courseid' => $instance->courseid, 'customint1' => $data['customint1']);
 199          if ($DB->record_exists('enrol', $params)) {
 200              $errors['customint1'] = get_string('error_multiplehost', 'enrol_mnet');
 201          }
 202  
 203          $tovalidate = array(
 204              'customint1' => $validhosts,
 205              'roleid' => $validroles,
 206              'name' => PARAM_TEXT
 207          );
 208          $typeerrors = $this->validate_param_types($data, $tovalidate);
 209          $errors = array_merge($errors, $typeerrors);
 210  
 211          return $errors;
 212      }
 213  }