[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/enrol/ -> locallib.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   * This file contains the course_enrolment_manager class which is used to interface
  19   * with the functions that exist in enrollib.php in relation to a single course.
  20   *
  21   * @package    core_enrol
  22   * @copyright  2010 Sam Hemelryk
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  /**
  29   * This class provides a targeted tied together means of interfacing the enrolment
  30   * tasks together with a course.
  31   *
  32   * It is provided as a convenience more than anything else.
  33   *
  34   * @copyright 2010 Sam Hemelryk
  35   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  36   */
  37  class course_enrolment_manager {
  38  
  39      /**
  40       * The course context
  41       * @var stdClass
  42       */
  43      protected $context;
  44      /**
  45       * The course we are managing enrolments for
  46       * @var stdClass
  47       */
  48      protected $course = null;
  49      /**
  50       * Limits the focus of the manager to one enrolment plugin instance
  51       * @var string
  52       */
  53      protected $instancefilter = null;
  54      /**
  55       * Limits the focus of the manager to users with specified role
  56       * @var int
  57       */
  58      protected $rolefilter = 0;
  59      /**
  60       * Limits the focus of the manager to users who match search string
  61       * @var string
  62       */
  63      protected $searchfilter = '';
  64      /**
  65       * Limits the focus of the manager to users in specified group
  66       * @var int
  67       */
  68      protected $groupfilter = 0;
  69      /**
  70       * Limits the focus of the manager to users who match status active/inactive
  71       * @var int
  72       */
  73      protected $statusfilter = -1;
  74  
  75      /**
  76       * The total number of users enrolled in the course
  77       * Populated by course_enrolment_manager::get_total_users
  78       * @var int
  79       */
  80      protected $totalusers = null;
  81      /**
  82       * An array of users currently enrolled in the course
  83       * Populated by course_enrolment_manager::get_users
  84       * @var array
  85       */
  86      protected $users = array();
  87  
  88      /**
  89       * An array of users who have roles within this course but who have not
  90       * been enrolled in the course
  91       * @var array
  92       */
  93      protected $otherusers = array();
  94  
  95      /**
  96       * The total number of users who hold a role within the course but who
  97       * arn't enrolled.
  98       * @var int
  99       */
 100      protected $totalotherusers = null;
 101  
 102      /**
 103       * The current moodle_page object
 104       * @var moodle_page
 105       */
 106      protected $moodlepage = null;
 107  
 108      /**#@+
 109       * These variables are used to cache the information this class uses
 110       * please never use these directly instead use their get_ counterparts.
 111       * @access private
 112       * @var array
 113       */
 114      private $_instancessql = null;
 115      private $_instances = null;
 116      private $_inames = null;
 117      private $_plugins = null;
 118      private $_allplugins = null;
 119      private $_roles = null;
 120      private $_assignableroles = null;
 121      private $_assignablerolesothers = null;
 122      private $_groups = null;
 123      /**#@-*/
 124  
 125      /**
 126       * Constructs the course enrolment manager
 127       *
 128       * @param moodle_page $moodlepage
 129       * @param stdClass $course
 130       * @param string $instancefilter
 131       * @param int $rolefilter If non-zero, filters to users with specified role
 132       * @param string $searchfilter If non-blank, filters to users with search text
 133       * @param int $groupfilter if non-zero, filter users with specified group
 134       * @param int $statusfilter if not -1, filter users with active/inactive enrollment.
 135       */
 136      public function __construct(moodle_page $moodlepage, $course, $instancefilter = null,
 137              $rolefilter = 0, $searchfilter = '', $groupfilter = 0, $statusfilter = -1) {
 138          $this->moodlepage = $moodlepage;
 139          $this->context = context_course::instance($course->id);
 140          $this->course = $course;
 141          $this->instancefilter = $instancefilter;
 142          $this->rolefilter = $rolefilter;
 143          $this->searchfilter = $searchfilter;
 144          $this->groupfilter = $groupfilter;
 145          $this->statusfilter = $statusfilter;
 146      }
 147  
 148      /**
 149       * Returns the current moodle page
 150       * @return moodle_page
 151       */
 152      public function get_moodlepage() {
 153          return $this->moodlepage;
 154      }
 155  
 156      /**
 157       * Returns the total number of enrolled users in the course.
 158       *
 159       * If a filter was specificed this will be the total number of users enrolled
 160       * in this course by means of that instance.
 161       *
 162       * @global moodle_database $DB
 163       * @return int
 164       */
 165      public function get_total_users() {
 166          global $DB;
 167          if ($this->totalusers === null) {
 168              list($instancessql, $params, $filter) = $this->get_instance_sql();
 169              list($filtersql, $moreparams) = $this->get_filter_sql();
 170              $params += $moreparams;
 171              $sqltotal = "SELECT COUNT(DISTINCT u.id)
 172                             FROM {user} u
 173                             JOIN {user_enrolments} ue ON (ue.userid = u.id  AND ue.enrolid $instancessql)
 174                             JOIN {enrol} e ON (e.id = ue.enrolid)
 175                        LEFT JOIN {groups_members} gm ON u.id = gm.userid
 176                            WHERE $filtersql";
 177              $this->totalusers = (int)$DB->count_records_sql($sqltotal, $params);
 178          }
 179          return $this->totalusers;
 180      }
 181  
 182      /**
 183       * Returns the total number of enrolled users in the course.
 184       *
 185       * If a filter was specificed this will be the total number of users enrolled
 186       * in this course by means of that instance.
 187       *
 188       * @global moodle_database $DB
 189       * @return int
 190       */
 191      public function get_total_other_users() {
 192          global $DB;
 193          if ($this->totalotherusers === null) {
 194              list($ctxcondition, $params) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'ctx');
 195              $params['courseid'] = $this->course->id;
 196              $sql = "SELECT COUNT(DISTINCT u.id)
 197                        FROM {role_assignments} ra
 198                        JOIN {user} u ON u.id = ra.userid
 199                        JOIN {context} ctx ON ra.contextid = ctx.id
 200                   LEFT JOIN (
 201                             SELECT ue.id, ue.userid
 202                               FROM {user_enrolments} ue
 203                          LEFT JOIN {enrol} e ON e.id=ue.enrolid
 204                              WHERE e.courseid = :courseid
 205                           ) ue ON ue.userid=u.id
 206                       WHERE ctx.id $ctxcondition AND
 207                             ue.id IS NULL";
 208              $this->totalotherusers = (int)$DB->count_records_sql($sql, $params);
 209          }
 210          return $this->totalotherusers;
 211      }
 212  
 213      /**
 214       * Gets all of the users enrolled in this course.
 215       *
 216       * If a filter was specified this will be the users who were enrolled
 217       * in this course by means of that instance. If role or search filters were
 218       * specified then these will also be applied.
 219       *
 220       * @global moodle_database $DB
 221       * @param string $sort
 222       * @param string $direction ASC or DESC
 223       * @param int $page First page should be 0
 224       * @param int $perpage Defaults to 25
 225       * @return array
 226       */
 227      public function get_users($sort, $direction='ASC', $page=0, $perpage=25) {
 228          global $DB;
 229          if ($direction !== 'ASC') {
 230              $direction = 'DESC';
 231          }
 232          $key = md5("$sort-$direction-$page-$perpage");
 233          if (!array_key_exists($key, $this->users)) {
 234              list($instancessql, $params, $filter) = $this->get_instance_sql();
 235              list($filtersql, $moreparams) = $this->get_filter_sql();
 236              $params += $moreparams;
 237              $extrafields = get_extra_user_fields($this->get_context());
 238              $extrafields[] = 'lastaccess';
 239              $ufields = user_picture::fields('u', $extrafields);
 240              $sql = "SELECT DISTINCT $ufields, ul.timeaccess AS lastseen
 241                        FROM {user} u
 242                        JOIN {user_enrolments} ue ON (ue.userid = u.id  AND ue.enrolid $instancessql)
 243                        JOIN {enrol} e ON (e.id = ue.enrolid)
 244                   LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id)
 245                   LEFT JOIN {groups_members} gm ON u.id = gm.userid
 246                       WHERE $filtersql
 247                    ORDER BY u.$sort $direction";
 248              $this->users[$key] = $DB->get_records_sql($sql, $params, $page*$perpage, $perpage);
 249          }
 250          return $this->users[$key];
 251      }
 252  
 253      /**
 254       * Obtains WHERE clause to filter results by defined search and role filter
 255       * (instance filter is handled separately in JOIN clause, see
 256       * get_instance_sql).
 257       *
 258       * @return array Two-element array with SQL and params for WHERE clause
 259       */
 260      protected function get_filter_sql() {
 261          global $DB;
 262  
 263          // Search condition.
 264          $extrafields = get_extra_user_fields($this->get_context());
 265          list($sql, $params) = users_search_sql($this->searchfilter, 'u', true, $extrafields);
 266  
 267          // Role condition.
 268          if ($this->rolefilter) {
 269              // Get context SQL.
 270              $contextids = $this->context->get_parent_context_ids();
 271              $contextids[] = $this->context->id;
 272              list($contextsql, $contextparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED);
 273              $params += $contextparams;
 274  
 275              // Role check condition.
 276              $sql .= " AND (SELECT COUNT(1) FROM {role_assignments} ra WHERE ra.userid = u.id " .
 277                      "AND ra.roleid = :roleid AND ra.contextid $contextsql) > 0";
 278              $params['roleid'] = $this->rolefilter;
 279          }
 280  
 281          // Group condition.
 282          if ($this->groupfilter) {
 283              $sql .= " AND gm.groupid = :groupid";
 284              $params['groupid'] = $this->groupfilter;
 285          }
 286  
 287          // Status condition.
 288          if ($this->statusfilter === ENROL_USER_ACTIVE) {
 289              $sql .= " AND ue.status = :active AND e.status = :enabled AND ue.timestart < :now1
 290                      AND (ue.timeend = 0 OR ue.timeend > :now2)";
 291              $now = round(time(), -2); // rounding helps caching in DB
 292              $params += array('enabled' => ENROL_INSTANCE_ENABLED,
 293                               'active' => ENROL_USER_ACTIVE,
 294                               'now1' => $now,
 295                               'now2' => $now);
 296          } else if ($this->statusfilter === ENROL_USER_SUSPENDED) {
 297              $sql .= " AND (ue.status = :inactive OR e.status = :disabled OR ue.timestart > :now1
 298                      OR (ue.timeend <> 0 AND ue.timeend < :now2))";
 299              $now = round(time(), -2); // rounding helps caching in DB
 300              $params += array('disabled' => ENROL_INSTANCE_DISABLED,
 301                               'inactive' => ENROL_USER_SUSPENDED,
 302                               'now1' => $now,
 303                               'now2' => $now);
 304          }
 305  
 306          return array($sql, $params);
 307      }
 308  
 309      /**
 310       * Gets and array of other users.
 311       *
 312       * Other users are users who have been assigned roles or inherited roles
 313       * within this course but who have not been enrolled in the course
 314       *
 315       * @global moodle_database $DB
 316       * @param string $sort
 317       * @param string $direction
 318       * @param int $page
 319       * @param int $perpage
 320       * @return array
 321       */
 322      public function get_other_users($sort, $direction='ASC', $page=0, $perpage=25) {
 323          global $DB;
 324          if ($direction !== 'ASC') {
 325              $direction = 'DESC';
 326          }
 327          $key = md5("$sort-$direction-$page-$perpage");
 328          if (!array_key_exists($key, $this->otherusers)) {
 329              list($ctxcondition, $params) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'ctx');
 330              $params['courseid'] = $this->course->id;
 331              $params['cid'] = $this->course->id;
 332              $sql = "SELECT ra.id as raid, ra.contextid, ra.component, ctx.contextlevel, ra.roleid, u.*, ue.lastseen
 333                      FROM {role_assignments} ra
 334                      JOIN {user} u ON u.id = ra.userid
 335                      JOIN {context} ctx ON ra.contextid = ctx.id
 336                 LEFT JOIN (
 337                         SELECT ue.id, ue.userid, ul.timeaccess AS lastseen
 338                           FROM {user_enrolments} ue
 339                      LEFT JOIN {enrol} e ON e.id=ue.enrolid
 340                      LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = ue.userid)
 341                          WHERE e.courseid = :courseid
 342                         ) ue ON ue.userid=u.id
 343                     WHERE ctx.id $ctxcondition AND
 344                           ue.id IS NULL
 345                  ORDER BY u.$sort $direction, ctx.depth DESC";
 346              $this->otherusers[$key] = $DB->get_records_sql($sql, $params, $page*$perpage, $perpage);
 347          }
 348          return $this->otherusers[$key];
 349      }
 350  
 351      /**
 352       * Helper method used by {@link get_potential_users()} and {@link search_other_users()}.
 353       *
 354       * @param string $search the search term, if any.
 355       * @param bool $searchanywhere Can the search term be anywhere, or must it be at the start.
 356       * @return array with three elements:
 357       *     string list of fields to SELECT,
 358       *     string contents of SQL WHERE clause,
 359       *     array query params. Note that the SQL snippets use named parameters.
 360       */
 361      protected function get_basic_search_conditions($search, $searchanywhere) {
 362          global $DB, $CFG;
 363  
 364          // Add some additional sensible conditions
 365          $tests = array("u.id <> :guestid", 'u.deleted = 0', 'u.confirmed = 1');
 366          $params = array('guestid' => $CFG->siteguest);
 367          if (!empty($search)) {
 368              $conditions = get_extra_user_fields($this->get_context());
 369              $conditions[] = 'u.firstname';
 370              $conditions[] = 'u.lastname';
 371              $conditions[] = $DB->sql_fullname('u.firstname', 'u.lastname');
 372              if ($searchanywhere) {
 373                  $searchparam = '%' . $search . '%';
 374              } else {
 375                  $searchparam = $search . '%';
 376              }
 377              $i = 0;
 378              foreach ($conditions as $key => $condition) {
 379                  $conditions[$key] = $DB->sql_like($condition, ":con{$i}00", false);
 380                  $params["con{$i}00"] = $searchparam;
 381                  $i++;
 382              }
 383              $tests[] = '(' . implode(' OR ', $conditions) . ')';
 384          }
 385          $wherecondition = implode(' AND ', $tests);
 386  
 387          $extrafields = get_extra_user_fields($this->get_context(), array('username', 'lastaccess'));
 388          $extrafields[] = 'username';
 389          $extrafields[] = 'lastaccess';
 390          $ufields = user_picture::fields('u', $extrafields);
 391  
 392          return array($ufields, $params, $wherecondition);
 393      }
 394  
 395      /**
 396       * Helper method used by {@link get_potential_users()} and {@link search_other_users()}.
 397       *
 398       * @param string $search the search string, if any.
 399       * @param string $fields the first bit of the SQL when returning some users.
 400       * @param string $countfields fhe first bit of the SQL when counting the users.
 401       * @param string $sql the bulk of the SQL statement.
 402       * @param array $params query parameters.
 403       * @param int $page which page number of the results to show.
 404       * @param int $perpage number of users per page.
 405       * @param int $addedenrollment number of users added to enrollment.
 406       * @return array with two elememts:
 407       *      int total number of users matching the search.
 408       *      array of user objects returned by the query.
 409       */
 410      protected function execute_search_queries($search, $fields, $countfields, $sql, array $params, $page, $perpage, $addedenrollment=0) {
 411          global $DB, $CFG;
 412  
 413          list($sort, $sortparams) = users_order_by_sql('u', $search, $this->get_context());
 414          $order = ' ORDER BY ' . $sort;
 415  
 416          $totalusers = $DB->count_records_sql($countfields . $sql, $params);
 417          $availableusers = $DB->get_records_sql($fields . $sql . $order,
 418                  array_merge($params, $sortparams), ($page*$perpage) - $addedenrollment, $perpage);
 419  
 420          return array('totalusers' => $totalusers, 'users' => $availableusers);
 421      }
 422  
 423      /**
 424       * Gets an array of the users that can be enrolled in this course.
 425       *
 426       * @global moodle_database $DB
 427       * @param int $enrolid
 428       * @param string $search
 429       * @param bool $searchanywhere
 430       * @param int $page Defaults to 0
 431       * @param int $perpage Defaults to 25
 432       * @param int $addedenrollment Defaults to 0
 433       * @return array Array(totalusers => int, users => array)
 434       */
 435      public function get_potential_users($enrolid, $search='', $searchanywhere=false, $page=0, $perpage=25, $addedenrollment=0) {
 436          global $DB;
 437  
 438          list($ufields, $params, $wherecondition) = $this->get_basic_search_conditions($search, $searchanywhere);
 439  
 440          $fields      = 'SELECT '.$ufields;
 441          $countfields = 'SELECT COUNT(1)';
 442          $sql = " FROM {user} u
 443              LEFT JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid = :enrolid)
 444                  WHERE $wherecondition
 445                        AND ue.id IS NULL";
 446          $params['enrolid'] = $enrolid;
 447  
 448          return $this->execute_search_queries($search, $fields, $countfields, $sql, $params, $page, $perpage, $addedenrollment);
 449      }
 450  
 451      /**
 452       * Searches other users and returns paginated results
 453       *
 454       * @global moodle_database $DB
 455       * @param string $search
 456       * @param bool $searchanywhere
 457       * @param int $page Starting at 0
 458       * @param int $perpage
 459       * @return array
 460       */
 461      public function search_other_users($search='', $searchanywhere=false, $page=0, $perpage=25) {
 462          global $DB, $CFG;
 463  
 464          list($ufields, $params, $wherecondition) = $this->get_basic_search_conditions($search, $searchanywhere);
 465  
 466          $fields      = 'SELECT ' . $ufields;
 467          $countfields = 'SELECT COUNT(u.id)';
 468          $sql   = " FROM {user} u
 469                LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid = :contextid)
 470                    WHERE $wherecondition
 471                      AND ra.id IS NULL";
 472          $params['contextid'] = $this->context->id;
 473  
 474          return $this->execute_search_queries($search, $fields, $countfields, $sql, $params, $page, $perpage);
 475      }
 476  
 477      /**
 478       * Gets an array containing some SQL to user for when selecting, params for
 479       * that SQL, and the filter that was used in constructing the sql.
 480       *
 481       * @global moodle_database $DB
 482       * @return string
 483       */
 484      protected function get_instance_sql() {
 485          global $DB;
 486          if ($this->_instancessql === null) {
 487              $instances = $this->get_enrolment_instances();
 488              $filter = $this->get_enrolment_filter();
 489              if ($filter && array_key_exists($filter, $instances)) {
 490                  $sql = " = :ifilter";
 491                  $params = array('ifilter'=>$filter);
 492              } else {
 493                  $filter = 0;
 494                  if ($instances) {
 495                      list($sql, $params) = $DB->get_in_or_equal(array_keys($this->get_enrolment_instances()), SQL_PARAMS_NAMED);
 496                  } else {
 497                      // no enabled instances, oops, we should probably say something
 498                      $sql = "= :never";
 499                      $params = array('never'=>-1);
 500                  }
 501              }
 502              $this->instancefilter = $filter;
 503              $this->_instancessql = array($sql, $params, $filter);
 504          }
 505          return $this->_instancessql;
 506      }
 507  
 508      /**
 509       * Returns all of the enrolment instances for this course.
 510       *
 511       * NOTE: since 2.4 it includes instances of disabled plugins too.
 512       *
 513       * @return array
 514       */
 515      public function get_enrolment_instances() {
 516          if ($this->_instances === null) {
 517              $this->_instances = enrol_get_instances($this->course->id, false);
 518          }
 519          return $this->_instances;
 520      }
 521  
 522      /**
 523       * Returns the names for all of the enrolment instances for this course.
 524       *
 525       * NOTE: since 2.4 it includes instances of disabled plugins too.
 526       *
 527       * @return array
 528       */
 529      public function get_enrolment_instance_names() {
 530          if ($this->_inames === null) {
 531              $instances = $this->get_enrolment_instances();
 532              $plugins = $this->get_enrolment_plugins(false);
 533              foreach ($instances as $key=>$instance) {
 534                  if (!isset($plugins[$instance->enrol])) {
 535                      // weird, some broken stuff in plugin
 536                      unset($instances[$key]);
 537                      continue;
 538                  }
 539                  $this->_inames[$key] = $plugins[$instance->enrol]->get_instance_name($instance);
 540              }
 541          }
 542          return $this->_inames;
 543      }
 544  
 545      /**
 546       * Gets all of the enrolment plugins that are active for this course.
 547       *
 548       * @param bool $onlyenabled return only enabled enrol plugins
 549       * @return array
 550       */
 551      public function get_enrolment_plugins($onlyenabled = true) {
 552          if ($this->_plugins === null) {
 553              $this->_plugins = enrol_get_plugins(true);
 554          }
 555  
 556          if ($onlyenabled) {
 557              return $this->_plugins;
 558          }
 559  
 560          if ($this->_allplugins === null) {
 561              // Make sure we have the same objects in _allplugins and _plugins.
 562              $this->_allplugins = $this->_plugins;
 563              foreach (enrol_get_plugins(false) as $name=>$plugin) {
 564                  if (!isset($this->_allplugins[$name])) {
 565                      $this->_allplugins[$name] = $plugin;
 566                  }
 567              }
 568          }
 569  
 570          return $this->_allplugins;
 571      }
 572  
 573      /**
 574       * Gets all of the roles this course can contain.
 575       *
 576       * @return array
 577       */
 578      public function get_all_roles() {
 579          if ($this->_roles === null) {
 580              $this->_roles = role_fix_names(get_all_roles($this->context), $this->context);
 581          }
 582          return $this->_roles;
 583      }
 584  
 585      /**
 586       * Gets all of the assignable roles for this course.
 587       *
 588       * @return array
 589       */
 590      public function get_assignable_roles($otherusers = false) {
 591          if ($this->_assignableroles === null) {
 592              $this->_assignableroles = get_assignable_roles($this->context, ROLENAME_ALIAS, false); // verifies unassign access control too
 593          }
 594  
 595          if ($otherusers) {
 596              if (!is_array($this->_assignablerolesothers)) {
 597                  $this->_assignablerolesothers = array();
 598                  list($courseviewroles, $ignored) = get_roles_with_cap_in_context($this->context, 'moodle/course:view');
 599                  foreach ($this->_assignableroles as $roleid=>$role) {
 600                      if (isset($courseviewroles[$roleid])) {
 601                          $this->_assignablerolesothers[$roleid] = $role;
 602                      }
 603                  }
 604              }
 605              return $this->_assignablerolesothers;
 606          } else {
 607              return $this->_assignableroles;
 608          }
 609      }
 610  
 611      /**
 612       * Gets all of the groups for this course.
 613       *
 614       * @return array
 615       */
 616      public function get_all_groups() {
 617          if ($this->_groups === null) {
 618              $this->_groups = groups_get_all_groups($this->course->id);
 619              foreach ($this->_groups as $gid=>$group) {
 620                  $this->_groups[$gid]->name = format_string($group->name);
 621              }
 622          }
 623          return $this->_groups;
 624      }
 625  
 626      /**
 627       * Unenrols a user from the course given the users ue entry
 628       *
 629       * @global moodle_database $DB
 630       * @param stdClass $ue
 631       * @return bool
 632       */
 633      public function unenrol_user($ue) {
 634          global $DB;
 635          list ($instance, $plugin) = $this->get_user_enrolment_components($ue);
 636          if ($instance && $plugin && $plugin->allow_unenrol_user($instance, $ue) && has_capability("enrol/$instance->enrol:unenrol", $this->context)) {
 637              $plugin->unenrol_user($instance, $ue->userid);
 638              return true;
 639          }
 640          return false;
 641      }
 642  
 643      /**
 644       * Given a user enrolment record this method returns the plugin and enrolment
 645       * instance that relate to it.
 646       *
 647       * @param stdClass|int $userenrolment
 648       * @return array array($instance, $plugin)
 649       */
 650      public function get_user_enrolment_components($userenrolment) {
 651          global $DB;
 652          if (is_numeric($userenrolment)) {
 653              $userenrolment = $DB->get_record('user_enrolments', array('id'=>(int)$userenrolment));
 654          }
 655          $instances = $this->get_enrolment_instances();
 656          $plugins = $this->get_enrolment_plugins(false);
 657          if (!$userenrolment || !isset($instances[$userenrolment->enrolid])) {
 658              return array(false, false);
 659          }
 660          $instance = $instances[$userenrolment->enrolid];
 661          $plugin = $plugins[$instance->enrol];
 662          return array($instance, $plugin);
 663      }
 664  
 665      /**
 666       * Removes an assigned role from a user.
 667       *
 668       * @global moodle_database $DB
 669       * @param int $userid
 670       * @param int $roleid
 671       * @return bool
 672       */
 673      public function unassign_role_from_user($userid, $roleid) {
 674          global $DB;
 675          // Admins may unassign any role, others only those they could assign.
 676          if (!is_siteadmin() and !array_key_exists($roleid, $this->get_assignable_roles())) {
 677              if (defined('AJAX_SCRIPT')) {
 678                  throw new moodle_exception('invalidrole');
 679              }
 680              return false;
 681          }
 682          $user = $DB->get_record('user', array('id'=>$userid), '*', MUST_EXIST);
 683          $ras = $DB->get_records('role_assignments', array('contextid'=>$this->context->id, 'userid'=>$user->id, 'roleid'=>$roleid));
 684          foreach ($ras as $ra) {
 685              if ($ra->component) {
 686                  if (strpos($ra->component, 'enrol_') !== 0) {
 687                      continue;
 688                  }
 689                  if (!$plugin = enrol_get_plugin(substr($ra->component, 6))) {
 690                      continue;
 691                  }
 692                  if ($plugin->roles_protected()) {
 693                      continue;
 694                  }
 695              }
 696              role_unassign($ra->roleid, $ra->userid, $ra->contextid, $ra->component, $ra->itemid);
 697          }
 698          return true;
 699      }
 700  
 701      /**
 702       * Assigns a role to a user.
 703       *
 704       * @param int $roleid
 705       * @param int $userid
 706       * @return int|false
 707       */
 708      public function assign_role_to_user($roleid, $userid) {
 709          require_capability('moodle/role:assign', $this->context);
 710          if (!array_key_exists($roleid, $this->get_assignable_roles())) {
 711              if (defined('AJAX_SCRIPT')) {
 712                  throw new moodle_exception('invalidrole');
 713              }
 714              return false;
 715          }
 716          return role_assign($roleid, $userid, $this->context->id, '', NULL);
 717      }
 718  
 719      /**
 720       * Adds a user to a group
 721       *
 722       * @param stdClass $user
 723       * @param int $groupid
 724       * @return bool
 725       */
 726      public function add_user_to_group($user, $groupid) {
 727          require_capability('moodle/course:managegroups', $this->context);
 728          $group = $this->get_group($groupid);
 729          if (!$group) {
 730              return false;
 731          }
 732          return groups_add_member($group->id, $user->id);
 733      }
 734  
 735      /**
 736       * Removes a user from a group
 737       *
 738       * @global moodle_database $DB
 739       * @param StdClass $user
 740       * @param int $groupid
 741       * @return bool
 742       */
 743      public function remove_user_from_group($user, $groupid) {
 744          global $DB;
 745          require_capability('moodle/course:managegroups', $this->context);
 746          $group = $this->get_group($groupid);
 747          if (!groups_remove_member_allowed($group, $user)) {
 748              return false;
 749          }
 750          if (!$group) {
 751              return false;
 752          }
 753          return groups_remove_member($group, $user);
 754      }
 755  
 756      /**
 757       * Gets the requested group
 758       *
 759       * @param int $groupid
 760       * @return stdClass|int
 761       */
 762      public function get_group($groupid) {
 763          $groups = $this->get_all_groups();
 764          if (!array_key_exists($groupid, $groups)) {
 765              return false;
 766          }
 767          return $groups[$groupid];
 768      }
 769  
 770      /**
 771       * Edits an enrolment
 772       *
 773       * @param stdClass $userenrolment
 774       * @param stdClass $data
 775       * @return bool
 776       */
 777      public function edit_enrolment($userenrolment, $data) {
 778          //Only allow editing if the user has the appropriate capability
 779          //Already checked in /enrol/users.php but checking again in case this function is called from elsewhere
 780          list($instance, $plugin) = $this->get_user_enrolment_components($userenrolment);
 781          if ($instance && $plugin && $plugin->allow_manage($instance) && has_capability("enrol/$instance->enrol:manage", $this->context)) {
 782              if (!isset($data->status)) {
 783                  $data->status = $userenrolment->status;
 784              }
 785              $plugin->update_user_enrol($instance, $userenrolment->userid, $data->status, $data->timestart, $data->timeend);
 786              return true;
 787          }
 788          return false;
 789      }
 790  
 791      /**
 792       * Returns the current enrolment filter that is being applied by this class
 793       * @return string
 794       */
 795      public function get_enrolment_filter() {
 796          return $this->instancefilter;
 797      }
 798  
 799      /**
 800       * Gets the roles assigned to this user that are applicable for this course.
 801       *
 802       * @param int $userid
 803       * @return array
 804       */
 805      public function get_user_roles($userid) {
 806          $roles = array();
 807          $ras = get_user_roles($this->context, $userid, true, 'c.contextlevel DESC, r.sortorder ASC');
 808          $plugins = $this->get_enrolment_plugins(false);
 809          foreach ($ras as $ra) {
 810              if ($ra->contextid != $this->context->id) {
 811                  if (!array_key_exists($ra->roleid, $roles)) {
 812                      $roles[$ra->roleid] = null;
 813                  }
 814                  // higher ras, course always takes precedence
 815                  continue;
 816              }
 817              if (array_key_exists($ra->roleid, $roles) && $roles[$ra->roleid] === false) {
 818                  continue;
 819              }
 820              $changeable = true;
 821              if ($ra->component) {
 822                  $changeable = false;
 823                  if (strpos($ra->component, 'enrol_') === 0) {
 824                      $plugin = substr($ra->component, 6);
 825                      if (isset($plugins[$plugin])) {
 826                          $changeable = !$plugins[$plugin]->roles_protected();
 827                      }
 828                  }
 829              }
 830  
 831              $roles[$ra->roleid] = $changeable;
 832          }
 833          return $roles;
 834      }
 835  
 836      /**
 837       * Gets the enrolments this user has in the course - including all suspended plugins and instances.
 838       *
 839       * @global moodle_database $DB
 840       * @param int $userid
 841       * @return array
 842       */
 843      public function get_user_enrolments($userid) {
 844          global $DB;
 845          list($instancessql, $params, $filter) = $this->get_instance_sql();
 846          $params['userid'] = $userid;
 847          $userenrolments = $DB->get_records_select('user_enrolments', "enrolid $instancessql AND userid = :userid", $params);
 848          $instances = $this->get_enrolment_instances();
 849          $plugins = $this->get_enrolment_plugins(false);
 850          $inames = $this->get_enrolment_instance_names();
 851          foreach ($userenrolments as &$ue) {
 852              $ue->enrolmentinstance     = $instances[$ue->enrolid];
 853              $ue->enrolmentplugin       = $plugins[$ue->enrolmentinstance->enrol];
 854              $ue->enrolmentinstancename = $inames[$ue->enrolmentinstance->id];
 855          }
 856          return $userenrolments;
 857      }
 858  
 859      /**
 860       * Gets the groups this user belongs to
 861       *
 862       * @param int $userid
 863       * @return array
 864       */
 865      public function get_user_groups($userid) {
 866          return groups_get_all_groups($this->course->id, $userid, 0, 'g.id');
 867      }
 868  
 869      /**
 870       * Retursn an array of params that would go into the URL to return to this
 871       * exact page.
 872       *
 873       * @return array
 874       */
 875      public function get_url_params() {
 876          $args = array(
 877              'id' => $this->course->id
 878          );
 879          if (!empty($this->instancefilter)) {
 880              $args['ifilter'] = $this->instancefilter;
 881          }
 882          if (!empty($this->rolefilter)) {
 883              $args['role'] = $this->rolefilter;
 884          }
 885          if ($this->searchfilter !== '') {
 886              $args['search'] = $this->searchfilter;
 887          }
 888          if (!empty($this->groupfilter)) {
 889              $args['group'] = $this->groupfilter;
 890          }
 891          if ($this->statusfilter !== -1) {
 892              $args['status'] = $this->statusfilter;
 893          }
 894          return $args;
 895      }
 896  
 897      /**
 898       * Returns the course this object is managing enrolments for
 899       *
 900       * @return stdClass
 901       */
 902      public function get_course() {
 903          return $this->course;
 904      }
 905  
 906      /**
 907       * Returns the course context
 908       *
 909       * @return stdClass
 910       */
 911      public function get_context() {
 912          return $this->context;
 913      }
 914  
 915      /**
 916       * Gets an array of other users in this course ready for display.
 917       *
 918       * Other users are users who have been assigned or inherited roles within this
 919       * course but have not been enrolled.
 920       *
 921       * @param core_enrol_renderer $renderer
 922       * @param moodle_url $pageurl
 923       * @param string $sort
 924       * @param string $direction ASC | DESC
 925       * @param int $page Starting from 0
 926       * @param int $perpage
 927       * @return array
 928       */
 929      public function get_other_users_for_display(core_enrol_renderer $renderer, moodle_url $pageurl, $sort, $direction, $page, $perpage) {
 930  
 931          $userroles = $this->get_other_users($sort, $direction, $page, $perpage);
 932          $roles = $this->get_all_roles();
 933          $plugins = $this->get_enrolment_plugins(false);
 934  
 935          $context    = $this->get_context();
 936          $now = time();
 937          $extrafields = get_extra_user_fields($context);
 938  
 939          $users = array();
 940          foreach ($userroles as $userrole) {
 941              $contextid = $userrole->contextid;
 942              unset($userrole->contextid); // This would collide with user avatar.
 943              if (!array_key_exists($userrole->id, $users)) {
 944                  $users[$userrole->id] = $this->prepare_user_for_display($userrole, $extrafields, $now);
 945              }
 946              $a = new stdClass;
 947              $a->role = $roles[$userrole->roleid]->localname;
 948              if ($contextid == $this->context->id) {
 949                  $changeable = true;
 950                  if ($userrole->component) {
 951                      $changeable = false;
 952                      if (strpos($userrole->component, 'enrol_') === 0) {
 953                          $plugin = substr($userrole->component, 6);
 954                          if (isset($plugins[$plugin])) {
 955                              $changeable = !$plugins[$plugin]->roles_protected();
 956                          }
 957                      }
 958                  }
 959                  $roletext = get_string('rolefromthiscourse', 'enrol', $a);
 960              } else {
 961                  $changeable = false;
 962                  switch ($userrole->contextlevel) {
 963                      case CONTEXT_COURSE :
 964                          // Meta course
 965                          $roletext = get_string('rolefrommetacourse', 'enrol', $a);
 966                          break;
 967                      case CONTEXT_COURSECAT :
 968                          $roletext = get_string('rolefromcategory', 'enrol', $a);
 969                          break;
 970                      case CONTEXT_SYSTEM:
 971                      default:
 972                          $roletext = get_string('rolefromsystem', 'enrol', $a);
 973                          break;
 974                  }
 975              }
 976              if (!isset($users[$userrole->id]['roles'])) {
 977                  $users[$userrole->id]['roles'] = array();
 978              }
 979              $users[$userrole->id]['roles'][$userrole->roleid] = array(
 980                  'text' => $roletext,
 981                  'unchangeable' => !$changeable
 982              );
 983          }
 984          return $users;
 985      }
 986  
 987      /**
 988       * Gets an array of users for display, this includes minimal user information
 989       * as well as minimal information on the users roles, groups, and enrolments.
 990       *
 991       * @param core_enrol_renderer $renderer
 992       * @param moodle_url $pageurl
 993       * @param int $sort
 994       * @param string $direction ASC or DESC
 995       * @param int $page
 996       * @param int $perpage
 997       * @return array
 998       */
 999      public function get_users_for_display(course_enrolment_manager $manager, $sort, $direction, $page, $perpage) {
1000          $pageurl = $manager->get_moodlepage()->url;
1001          $users = $this->get_users($sort, $direction, $page, $perpage);
1002  
1003          $now = time();
1004          $straddgroup = get_string('addgroup', 'group');
1005          $strunenrol = get_string('unenrol', 'enrol');
1006          $stredit = get_string('edit');
1007  
1008          $allroles   = $this->get_all_roles();
1009          $assignable = $this->get_assignable_roles();
1010          $allgroups  = $this->get_all_groups();
1011          $context    = $this->get_context();
1012          $canmanagegroups = has_capability('moodle/course:managegroups', $context);
1013  
1014          $url = new moodle_url($pageurl, $this->get_url_params());
1015          $extrafields = get_extra_user_fields($context);
1016  
1017          $enabledplugins = $this->get_enrolment_plugins(true);
1018  
1019          $userdetails = array();
1020          foreach ($users as $user) {
1021              $details = $this->prepare_user_for_display($user, $extrafields, $now);
1022  
1023              // Roles
1024              $details['roles'] = array();
1025              foreach ($this->get_user_roles($user->id) as $rid=>$rassignable) {
1026                  $unchangeable = !$rassignable;
1027                  if (!is_siteadmin() and !isset($assignable[$rid])) {
1028                      $unchangeable = true;
1029                  }
1030                  $details['roles'][$rid] = array('text'=>$allroles[$rid]->localname, 'unchangeable'=>$unchangeable);
1031              }
1032  
1033              // Users
1034              $usergroups = $this->get_user_groups($user->id);
1035              $details['groups'] = array();
1036              foreach($usergroups as $gid=>$unused) {
1037                  $details['groups'][$gid] = $allgroups[$gid]->name;
1038              }
1039  
1040              // Enrolments
1041              $details['enrolments'] = array();
1042              foreach ($this->get_user_enrolments($user->id) as $ue) {
1043                  if (!isset($enabledplugins[$ue->enrolmentinstance->enrol])) {
1044                      $details['enrolments'][$ue->id] = array(
1045                          'text' => $ue->enrolmentinstancename,
1046                          'period' => null,
1047                          'dimmed' =>  true,
1048                          'actions' => array()
1049                      );
1050                      continue;
1051                  } else if ($ue->timestart and $ue->timeend) {
1052                      $period = get_string('periodstartend', 'enrol', array('start'=>userdate($ue->timestart), 'end'=>userdate($ue->timeend)));
1053                      $periodoutside = ($ue->timestart && $ue->timeend && ($now < $ue->timestart || $now > $ue->timeend));
1054                  } else if ($ue->timestart) {
1055                      $period = get_string('periodstart', 'enrol', userdate($ue->timestart));
1056                      $periodoutside = ($ue->timestart && $now < $ue->timestart);
1057                  } else if ($ue->timeend) {
1058                      $period = get_string('periodend', 'enrol', userdate($ue->timeend));
1059                      $periodoutside = ($ue->timeend && $now > $ue->timeend);
1060                  } else {
1061                      // If there is no start or end show when user was enrolled.
1062                      $period = get_string('periodnone', 'enrol', userdate($ue->timecreated));
1063                      $periodoutside = false;
1064                  }
1065                  $details['enrolments'][$ue->id] = array(
1066                      'text' => $ue->enrolmentinstancename,
1067                      'period' => $period,
1068                      'dimmed' =>  ($periodoutside or $ue->status != ENROL_USER_ACTIVE or $ue->enrolmentinstance->status != ENROL_INSTANCE_ENABLED),
1069                      'actions' => $ue->enrolmentplugin->get_user_enrolment_actions($manager, $ue)
1070                  );
1071              }
1072              $userdetails[$user->id] = $details;
1073          }
1074          return $userdetails;
1075      }
1076  
1077      /**
1078       * Prepare a user record for display
1079       *
1080       * This function is called by both {@link get_users_for_display} and {@link get_other_users_for_display} to correctly
1081       * prepare user fields for display
1082       *
1083       * Please note that this function does not check capability for moodle/coures:viewhiddenuserfields
1084       *
1085       * @param object $user The user record
1086       * @param array $extrafields The list of fields as returned from get_extra_user_fields used to determine which
1087       * additional fields may be displayed
1088       * @param int $now The time used for lastaccess calculation
1089       * @return array The fields to be displayed including userid, courseid, picture, firstname, lastseen and any
1090       * additional fields from $extrafields
1091       */
1092      private function prepare_user_for_display($user, $extrafields, $now) {
1093          $details = array(
1094              'userid'           => $user->id,
1095              'courseid'         => $this->get_course()->id,
1096              'picture'          => new user_picture($user),
1097              'firstname'        => fullname($user, has_capability('moodle/site:viewfullnames', $this->get_context())),
1098              'lastseen'         => get_string('never'),
1099              'lastcourseaccess' => get_string('never'),
1100          );
1101          foreach ($extrafields as $field) {
1102              $details[$field] = $user->{$field};
1103          }
1104  
1105          // Last time user has accessed the site.
1106          if ($user->lastaccess) {
1107              $details['lastseen'] = format_time($now - $user->lastaccess);
1108          }
1109  
1110          // Last time user has accessed the course.
1111          if ($user->lastseen) {
1112              $details['lastcourseaccess'] = format_time($now - $user->lastseen);
1113          }
1114          return $details;
1115      }
1116  
1117      public function get_manual_enrol_buttons() {
1118          $plugins = $this->get_enrolment_plugins(true); // Skip disabled plugins.
1119          $buttons = array();
1120          foreach ($plugins as $plugin) {
1121              $newbutton = $plugin->get_manual_enrol_button($this);
1122              if (is_array($newbutton)) {
1123                  $buttons += $newbutton;
1124              } else if ($newbutton instanceof enrol_user_button) {
1125                  $buttons[] = $newbutton;
1126              }
1127          }
1128          return $buttons;
1129      }
1130  
1131      public function has_instance($enrolpluginname) {
1132          // Make sure manual enrolments instance exists
1133          foreach ($this->get_enrolment_instances() as $instance) {
1134              if ($instance->enrol == $enrolpluginname) {
1135                  return true;
1136              }
1137          }
1138          return false;
1139      }
1140  
1141      /**
1142       * Returns the enrolment plugin that the course manager was being filtered to.
1143       *
1144       * If no filter was being applied then this function returns false.
1145       *
1146       * @return enrol_plugin
1147       */
1148      public function get_filtered_enrolment_plugin() {
1149          $instances = $this->get_enrolment_instances();
1150          $plugins = $this->get_enrolment_plugins(false);
1151  
1152          if (empty($this->instancefilter) || !array_key_exists($this->instancefilter, $instances)) {
1153              return false;
1154          }
1155  
1156          $instance = $instances[$this->instancefilter];
1157          return $plugins[$instance->enrol];
1158      }
1159  
1160      /**
1161       * Returns and array of users + enrolment details.
1162       *
1163       * Given an array of user id's this function returns and array of user enrolments for those users
1164       * as well as enough user information to display the users name and picture for each enrolment.
1165       *
1166       * @global moodle_database $DB
1167       * @param array $userids
1168       * @return array
1169       */
1170      public function get_users_enrolments(array $userids) {
1171          global $DB;
1172  
1173          $instances = $this->get_enrolment_instances();
1174          $plugins = $this->get_enrolment_plugins(false);
1175  
1176          if  (!empty($this->instancefilter)) {
1177              $instancesql = ' = :instanceid';
1178              $instanceparams = array('instanceid' => $this->instancefilter);
1179          } else {
1180              list($instancesql, $instanceparams) = $DB->get_in_or_equal(array_keys($instances), SQL_PARAMS_NAMED, 'instanceid0000');
1181          }
1182  
1183          $userfields = user_picture::fields('u');
1184          list($idsql, $idparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED, 'userid0000');
1185  
1186          list($sort, $sortparams) = users_order_by_sql('u');
1187  
1188          $sql = "SELECT ue.id AS ueid, ue.status, ue.enrolid, ue.userid, ue.timestart, ue.timeend, ue.modifierid, ue.timecreated, ue.timemodified, $userfields
1189                    FROM {user_enrolments} ue
1190               LEFT JOIN {user} u ON u.id = ue.userid
1191                   WHERE ue.enrolid $instancesql AND
1192                         u.id $idsql
1193                ORDER BY $sort";
1194  
1195          $rs = $DB->get_recordset_sql($sql, $idparams + $instanceparams + $sortparams);
1196          $users = array();
1197          foreach ($rs as $ue) {
1198              $user = user_picture::unalias($ue);
1199              $ue->id = $ue->ueid;
1200              unset($ue->ueid);
1201              if (!array_key_exists($user->id, $users)) {
1202                  $user->enrolments = array();
1203                  $users[$user->id] = $user;
1204              }
1205              $ue->enrolmentinstance = $instances[$ue->enrolid];
1206              $ue->enrolmentplugin = $plugins[$ue->enrolmentinstance->enrol];
1207              $users[$user->id]->enrolments[$ue->id] = $ue;
1208          }
1209          $rs->close();
1210          return $users;
1211      }
1212  }
1213  
1214  /**
1215   * A button that is used to enrol users in a course
1216   *
1217   * @copyright 2010 Sam Hemelryk
1218   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
1219   */
1220  class enrol_user_button extends single_button {
1221  
1222      /**
1223       * An array containing JS YUI modules required by this button
1224       * @var array
1225       */
1226      protected $jsyuimodules = array();
1227  
1228      /**
1229       * An array containing JS initialisation calls required by this button
1230       * @var array
1231       */
1232      protected $jsinitcalls = array();
1233  
1234      /**
1235       * An array strings required by JS for this button
1236       * @var array
1237       */
1238      protected $jsstrings = array();
1239  
1240      /**
1241       * Initialises the new enrol_user_button
1242       *
1243       * @staticvar int $count The number of enrol user buttons already created
1244       * @param moodle_url $url
1245       * @param string $label The text to display in the button
1246       * @param string $method Either post or get
1247       */
1248      public function __construct(moodle_url $url, $label, $method = 'post') {
1249          static $count = 0;
1250          $count ++;
1251          parent::__construct($url, $label, $method);
1252          $this->class = 'singlebutton enrolusersbutton';
1253          $this->formid = 'enrolusersbutton-'.$count;
1254      }
1255  
1256      /**
1257       * Adds a YUI module call that will be added to the page when the button is used.
1258       *
1259       * @param string|array $modules One or more modules to require
1260       * @param string $function The JS function to call
1261       * @param array $arguments An array of arguments to pass to the function
1262       * @param string $galleryversion Deprecated: The gallery version to use
1263       * @param bool $ondomready If true the call is postponed until the DOM is finished loading
1264       */
1265      public function require_yui_module($modules, $function, array $arguments = null, $galleryversion = null, $ondomready = false) {
1266          if ($galleryversion != null) {
1267              debugging('The galleryversion parameter to yui_module has been deprecated since Moodle 2.3.', DEBUG_DEVELOPER);
1268          }
1269  
1270          $js = new stdClass;
1271          $js->modules = (array)$modules;
1272          $js->function = $function;
1273          $js->arguments = $arguments;
1274          $js->ondomready = $ondomready;
1275          $this->jsyuimodules[] = $js;
1276      }
1277  
1278      /**
1279       * Adds a JS initialisation call to the page when the button is used.
1280       *
1281       * @param string $function The function to call
1282       * @param array $extraarguments An array of arguments to pass to the function
1283       * @param bool $ondomready If true the call is postponed until the DOM is finished loading
1284       * @param array $module A module definition
1285       */
1286      public function require_js_init_call($function, array $extraarguments = null, $ondomready = false, array $module = null) {
1287          $js = new stdClass;
1288          $js->function = $function;
1289          $js->extraarguments = $extraarguments;
1290          $js->ondomready = $ondomready;
1291          $js->module = $module;
1292          $this->jsinitcalls[] = $js;
1293      }
1294  
1295      /**
1296       * Requires strings for JS that will be loaded when the button is used.
1297       *
1298       * @param type $identifiers
1299       * @param string $component
1300       * @param mixed $a
1301       */
1302      public function strings_for_js($identifiers, $component = 'moodle', $a = null) {
1303          $string = new stdClass;
1304          $string->identifiers = (array)$identifiers;
1305          $string->component = $component;
1306          $string->a = $a;
1307          $this->jsstrings[] = $string;
1308      }
1309  
1310      /**
1311       * Initialises the JS that is required by this button
1312       *
1313       * @param moodle_page $page
1314       */
1315      public function initialise_js(moodle_page $page) {
1316          foreach ($this->jsyuimodules as $js) {
1317              $page->requires->yui_module($js->modules, $js->function, $js->arguments, null, $js->ondomready);
1318          }
1319          foreach ($this->jsinitcalls as $js) {
1320              $page->requires->js_init_call($js->function, $js->extraarguments, $js->ondomready, $js->module);
1321          }
1322          foreach ($this->jsstrings as $string) {
1323              $page->requires->strings_for_js($string->identifiers, $string->component, $string->a);
1324          }
1325      }
1326  }
1327  
1328  /**
1329   * User enrolment action
1330   *
1331   * This class is used to manage a renderable ue action such as editing an user enrolment or deleting
1332   * a user enrolment.
1333   *
1334   * @copyright  2011 Sam Hemelryk
1335   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
1336   */
1337  class user_enrolment_action implements renderable {
1338  
1339      /**
1340       * The icon to display for the action
1341       * @var pix_icon
1342       */
1343      protected $icon;
1344  
1345      /**
1346       * The title for the action
1347       * @var string
1348       */
1349      protected $title;
1350  
1351      /**
1352       * The URL to the action
1353       * @var moodle_url
1354       */
1355      protected $url;
1356  
1357      /**
1358       * An array of HTML attributes
1359       * @var array
1360       */
1361      protected $attributes = array();
1362  
1363      /**
1364       * Constructor
1365       * @param pix_icon $icon
1366       * @param string $title
1367       * @param moodle_url $url
1368       * @param array $attributes
1369       */
1370      public function __construct(pix_icon $icon, $title, $url, array $attributes = null) {
1371          $this->icon = $icon;
1372          $this->title = $title;
1373          $this->url = new moodle_url($url);
1374          if (!empty($attributes)) {
1375              $this->attributes = $attributes;
1376          }
1377          $this->attributes['title'] = $title;
1378      }
1379  
1380      /**
1381       * Returns the icon for this action
1382       * @return pix_icon
1383       */
1384      public function get_icon() {
1385          return $this->icon;
1386      }
1387  
1388      /**
1389       * Returns the title for this action
1390       * @return string
1391       */
1392      public function get_title() {
1393          return $this->title;
1394      }
1395  
1396      /**
1397       * Returns the URL for this action
1398       * @return moodle_url
1399       */
1400      public function get_url() {
1401          return $this->url;
1402      }
1403  
1404      /**
1405       * Returns the attributes to use for this action
1406       * @return array
1407       */
1408      public function get_attributes() {
1409          return $this->attributes;
1410      }
1411  }
1412  
1413  class enrol_ajax_exception extends moodle_exception {
1414      /**
1415       * Constructor
1416       * @param string $errorcode The name of the string from error.php to print
1417       * @param string $module name of module
1418       * @param string $link The url where the user will be prompted to continue. If no url is provided the user will be directed to the site index page.
1419       * @param object $a Extra words and phrases that might be required in the error string
1420       * @param string $debuginfo optional debugging information
1421       */
1422      public function __construct($errorcode, $link = '', $a = NULL, $debuginfo = null) {
1423          parent::__construct($errorcode, 'enrol', $link, $a, $debuginfo);
1424      }
1425  }
1426  
1427  /**
1428   * This class is used to manage a bulk operations for enrolment plugins.
1429   *
1430   * @copyright 2011 Sam Hemelryk
1431   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
1432   */
1433  abstract class enrol_bulk_enrolment_operation {
1434  
1435      /**
1436       * The course enrolment manager
1437       * @var course_enrolment_manager
1438       */
1439      protected $manager;
1440  
1441      /**
1442       * The enrolment plugin to which this operation belongs
1443       * @var enrol_plugin
1444       */
1445      protected $plugin;
1446  
1447      /**
1448       * Contructor
1449       * @param course_enrolment_manager $manager
1450       * @param stdClass $plugin
1451       */
1452      public function __construct(course_enrolment_manager $manager, enrol_plugin $plugin = null) {
1453          $this->manager = $manager;
1454          $this->plugin = $plugin;
1455      }
1456  
1457      /**
1458       * Returns a moodleform used for this operation, or false if no form is required and the action
1459       * should be immediatly processed.
1460       *
1461       * @param moodle_url|string $defaultaction
1462       * @param mixed $defaultcustomdata
1463       * @return enrol_bulk_enrolment_change_form|moodleform|false
1464       */
1465      public function get_form($defaultaction = null, $defaultcustomdata = null) {
1466          return false;
1467      }
1468  
1469      /**
1470       * Returns the title to use for this bulk operation
1471       *
1472       * @return string
1473       */
1474      abstract public function get_title();
1475  
1476      /**
1477       * Returns the identifier for this bulk operation.
1478       * This should be the same identifier used by the plugins function when returning
1479       * all of its bulk operations.
1480       *
1481       * @return string
1482       */
1483      abstract public function get_identifier();
1484  
1485      /**
1486       * Processes the bulk operation on the given users
1487       *
1488       * @param course_enrolment_manager $manager
1489       * @param array $users
1490       * @param stdClass $properties
1491       */
1492      abstract public function process(course_enrolment_manager $manager, array $users, stdClass $properties);
1493  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1