See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Base implementation of a userlist. * * @package core_privacy * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace core_privacy\local\request; defined('MOODLE_INTERNAL') || die(); /** * Base implementation of a userlist used to store a set of users. * * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class userlist_base implements // Implement an Iterator to fetch the Context objects. \Iterator, // Implement the Countable interface to allow the number of returned results to be queried easily. \Countable { /** * @var array List of user IDs. * * Note: this must not be updated using set_userids only as this * ensures uniqueness. */ private $userids = []; /** * @var string component the frankenstyle component name. */ protected $component = ''; /** * @var int Current position of the iterator. */ protected $iteratorposition = 0; /** @var \context The context that this userlist belongs to */ protected $context; /** * Constructor to create a new userlist. * * @param \context $context * @param string $component */ public function __construct(\context $context, string $component) { $this->context = $context; $this->set_component($component); } /** * Set the userids. * * @param array $userids The list of users. * @return $this */ protected function set_userids(array $userids) : userlist_base { $this->userids = array_values(array_unique($userids)); return $this; } /** * Add a set of additional userids. * * @param array $userids The list of users. * @return $this */ protected function add_userids(array $userids) : userlist_base { $this->set_userids(array_merge($this->get_userids(), $userids)); return $this; } /** * Get the list of user IDs that relate to this request. * * @return int[] */ public function get_userids() : array { return $this->userids; } /** * Get the complete list of user objects that relate to this request. * * @return \stdClass[] */ public function get_users() : array { $users = []; foreach ($this->userids as $userid) { if ($user = \core_user::get_user($userid)) { $users[] = $user; } } return $users; } /** * Sets the component for this userlist. * * @param string $component the frankenstyle component name. * @return $this */ protected function set_component($component) : userlist_base { $this->component = $component; return $this; } /** * Get the name of the component to which this userlist belongs. * * @return string the component name associated with this userlist. */ public function get_component() : string { return $this->component; } /** * Return the current user. * * @return \user */> #[\ReturnTypeWillChange]public function current() { $user = \core_user::get_user($this->userids[$this->iteratorposition]); if (false === $user) { // This user was not found. unset($this->userids[$this->iteratorposition]); // Check to see if there are any more users left. if ($this->count()) { // Move the pointer to the next record and try again. $this->next(); $user = $this->current(); } else { // There are no more context ids left.< return;> return null;} } return $user; } /** * Return the key of the current element. * * @return mixed */> #[\ReturnTypeWillChange]public function key() { return $this->iteratorposition; } /** * Move to the next user in the list. */< public function next() {> public function next(): void {++$this->iteratorposition; } /** * Check if the current position is valid. * * @return bool */< public function valid() {> public function valid(): bool {return isset($this->userids[$this->iteratorposition]) && $this->current(); } /** * Rewind to the first found user. * * The list of users is uniqued during the rewind. * The rewind is called at the start of most iterations. */< public function rewind() {> public function rewind(): void {$this->iteratorposition = 0; } /** * Return the number of users. */< public function count() {> public function count(): int {return count($this->userids); } /** * Get the context for this userlist * * @return \context */ public function get_context() : \context { return $this->context; } }