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.
<?php

namespace IMSGlobal\LTI\ToolProvider;
use IMSGlobal\LTI\ToolProvider\DataConnector\DataConnector;

/**
 * Class to represent a tool consumer user
 *
 * @author  Stephen P Vickers <svickers@imsglobal.org>
 * @copyright  IMS Global Learning Consortium Inc
 * @date  2016
 * @version 3.0.2
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */
> #[\AllowDynamicProperties]
class User { /** * User's first name. * * @var string $firstname */ public $firstname = ''; /** * User's last name (surname or family name). * * @var string $lastname */ public $lastname = ''; /** * User's fullname. * * @var string $fullname */ public $fullname = ''; /** * User's email address. * * @var string $email */ public $email = ''; /** * User's image URI. * * @var string $image */ public $image = ''; /** * Roles for user. * * @var array $roles */ public $roles = array(); /** * Groups for user. * * @var array $groups */ public $groups = array(); /** * User's result sourcedid. * * @var string $ltiResultSourcedId */ public $ltiResultSourcedId = null; /** * Date/time the record was created. * * @var object $created */ public $created = null; /** * Date/time the record was last updated. * * @var object $updated */ public $updated = null; /** * Resource link object. * * @var ResourceLink $resourceLink */ private $resourceLink = null; /** * Resource link record ID. * * @var int $resourceLinkId */ private $resourceLinkId = null; /** * User record ID value. * * @var string $id */ private $id = null; /** * user ID as supplied in the last connection request. * * @var string $ltiUserId */ public $ltiUserId = null; /** * Data connector object or string. * * @var mixed $dataConnector */ private $dataConnector = null; /** * Class constructor. */ public function __construct() { $this->initialize(); } /** * Initialise the user. */ public function initialize() { $this->firstname = ''; $this->lastname = ''; $this->fullname = ''; $this->email = ''; $this->image = ''; $this->roles = array(); $this->groups = array(); $this->ltiResultSourcedId = null; $this->created = null; $this->updated = null; } /** * Initialise the user. * * Pseudonym for initialize(). */ public function initialise() { $this->initialize(); } /** * Save the user to the database. * * @return boolean True if the user object was successfully saved */ public function save() { if (!empty($this->ltiResultSourcedId) && !is_null($this->resourceLinkId)) { $ok = $this->getDataConnector()->saveUser($this); } else { $ok = true; } return $ok; } /** * Delete the user from the database. * * @return boolean True if the user object was successfully deleted */ public function delete() { $ok = $this->getDataConnector()->deleteUser($this); return $ok; } /** * Get resource link. * * @return ResourceLink Resource link object */ public function getResourceLink() { if (is_null($this->resourceLink) && !is_null($this->resourceLinkId)) { $this->resourceLink = ResourceLink::fromRecordId($this->resourceLinkId, $this->getDataConnector()); } return $this->resourceLink; } /** * Get record ID of user. * * @return int Record ID of user */ public function getRecordId() { return $this->id; } /** * Set record ID of user. * * @param int $id Record ID of user */ public function setRecordId($id) { $this->id = $id; } /** * Set resource link ID of user. * * @param int $resourceLinkId Resource link ID of user */ public function setResourceLinkId($resourceLinkId) { $this->resourceLinkId = $resourceLinkId; } /** * Get the data connector. * * @return mixed Data connector object or string */ public function getDataConnector() { return $this->dataConnector; } /** * Get the user ID (which may be a compound of the tool consumer and resource link IDs). * * @param int $idScope Scope to use for user ID (optional, default is null for consumer default setting) * * @return string User ID value */ public function getId($idScope = null) { if (empty($idScope)) { if (!is_null($this->resourceLink)) { $idScope = $this->resourceLink->getConsumer()->idScope; } else { $idScope = ToolProvider::ID_SCOPE_ID_ONLY; } } switch ($idScope) { case ToolProvider::ID_SCOPE_GLOBAL: $id = $this->getResourceLink()->getKey() . ToolProvider::ID_SCOPE_SEPARATOR . $this->ltiUserId; break; case ToolProvider::ID_SCOPE_CONTEXT: $id = $this->getResourceLink()->getKey(); if ($this->resourceLink->ltiContextId) { $id .= ToolProvider::ID_SCOPE_SEPARATOR . $this->resourceLink->ltiContextId; } $id .= ToolProvider::ID_SCOPE_SEPARATOR . $this->ltiUserId; break; case ToolProvider::ID_SCOPE_RESOURCE: $id = $this->getResourceLink()->getKey(); if ($this->resourceLink->ltiResourceLinkId) { $id .= ToolProvider::ID_SCOPE_SEPARATOR . $this->resourceLink->ltiResourceLinkId; } $id .= ToolProvider::ID_SCOPE_SEPARATOR . $this->ltiUserId; break; default: $id = $this->ltiUserId; break; } return $id; } /** * Set the user's name. * * @param string $firstname User's first name. * @param string $lastname User's last name. * @param string $fullname User's full name. */ public function setNames($firstname, $lastname, $fullname) { $names = array(0 => '', 1 => ''); if (!empty($fullname)) { $this->fullname = trim($fullname); $names = preg_split("/[\s]+/", $this->fullname, 2); } if (!empty($firstname)) { $this->firstname = trim($firstname); $names[0] = $this->firstname; } else if (!empty($names[0])) { $this->firstname = $names[0]; } else { $this->firstname = 'User'; } if (!empty($lastname)) { $this->lastname = trim($lastname); $names[1] = $this->lastname; } else if (!empty($names[1])) { $this->lastname = $names[1]; } else { $this->lastname = $this->ltiUserId; } if (empty($this->fullname)) { $this->fullname = "{$this->firstname} {$this->lastname}"; } } /** * Set the user's email address. * * @param string $email Email address value * @param string $defaultEmail Value to use if no email is provided (optional, default is none) */ public function setEmail($email, $defaultEmail = null) { if (!empty($email)) { $this->email = $email; } else if (!empty($defaultEmail)) { $this->email = $defaultEmail; if (substr($this->email, 0, 1) === '@') { $this->email = $this->getId() . $this->email; } } else { $this->email = ''; } } /** * Check if the user is an administrator (at any of the system, institution or context levels). * * @return boolean True if the user has a role of administrator */ public function isAdmin() { return $this->hasRole('Administrator') || $this->hasRole('urn:lti:sysrole:ims/lis/SysAdmin') || $this->hasRole('urn:lti:sysrole:ims/lis/Administrator') || $this->hasRole('urn:lti:instrole:ims/lis/Administrator'); } /** * Check if the user is staff. * * @return boolean True if the user has a role of instructor, contentdeveloper or teachingassistant */ public function isStaff() { return ($this->hasRole('Instructor') || $this->hasRole('ContentDeveloper') || $this->hasRole('TeachingAssistant')); } /** * Check if the user is a learner. * * @return boolean True if the user has a role of learner */ public function isLearner() { return $this->hasRole('Learner'); } /** * Load the user from the database. * * @param int $id Record ID of user * @param DataConnector $dataConnector Database connection object * * @return User User object */ public static function fromRecordId($id, $dataConnector) { $user = new User(); $user->dataConnector = $dataConnector; $user->load($id); return $user; } /** * Class constructor from resource link. * * @param ResourceLink $resourceLink Resource_Link object * @param string $ltiUserId User ID value * @return User */ public static function fromResourceLink($resourceLink, $ltiUserId) { $user = new User(); $user->resourceLink = $resourceLink; if (!is_null($resourceLink)) { $user->resourceLinkId = $resourceLink->getRecordId(); $user->dataConnector = $resourceLink->getDataConnector(); } $user->ltiUserId = $ltiUserId; if (!empty($ltiUserId)) { $user->load(); } return $user; } ### ### PRIVATE METHODS ### /** * Check whether the user has a specified role name. * * @param string $role Name of role * * @return boolean True if the user has the specified role */ private function hasRole($role) { if (substr($role, 0, 4) !== 'urn:') { $role = 'urn:lti:role:ims/lis/' . $role; } return in_array($role, $this->roles); } /** * Load the user from the database. * * @param int $id Record ID of user (optional, default is null) * * @return boolean True if the user object was successfully loaded */ private function load($id = null) { $this->initialize(); $this->id = $id; $dataConnector = $this->getDataConnector(); if (!is_null($dataConnector)) { return $dataConnector->loadUser($this); } return false; } }