Files
moodle/mod/bigbluebuttonbn/classes/form/guest_add.php
T
Shamim Rezaie 6225af4106 MDL-74638 mod_bigbluebuttonbn: Allow logged-in users to join as guest
Logged in users should also be able to join as guest. They may not
normally have access to the meeting maybe because not enrolled to the
course.
2022-11-11 15:27:26 +11:00

221 lines
7.4 KiB
PHP

<?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/>.
namespace mod_bigbluebuttonbn\form;
use context;
use core_form\dynamic_form;
use mod_bigbluebuttonbn\instance;
use mod_bigbluebuttonbn\local\exceptions\bigbluebutton_exception;
use mod_bigbluebuttonbn\task\send_guest_emails;
use moodle_exception;
use moodle_url;
use MoodleQuickForm;
/**
* Popup form to add new guests to a meeting and show/copy credential to access the guest login page.
*
* @package mod_bigbluebuttonbn
* @copyright 2022 onwards, Blindside Networks Inc
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @author Laurent David (laurent [at] call-learning [dt] fr)
*/
class guest_add extends dynamic_form {
/**
* Max length for credential and url fields.
*/
const MAX_INPUT_LENGTH = 35;
/**
* Process the form submission, used if form was submitted via AJAX.
*
* @return array
*/
public function process_dynamic_submission(): array {
global $USER;
$data = $this->get_data();
$allmails = [];
if (!empty($data->emails)) {
$emails = explode(',', $data->emails);
foreach ($emails as $email) {
$email = trim($email);
if (validate_email($email)) {
$allmails[] = $email;
}
}
$adhoctask = new send_guest_emails();
$adhoctask->set_custom_data(
[
'emails' => $allmails,
'useridfrom' => $USER->id
]
);
$adhoctask->set_instance_id($data->id);
\core\task\manager::queue_adhoc_task($adhoctask);
}
return [
'result' => true,
'emails' => join(', ', $allmails),
'emailcount' => count($allmails),
'errors' => ''
];
}
/**
* Perform some validation.
*
* @param array $formdata
* @param array $files
* @return array
*/
public function validation($formdata, $files): array {
$errors = [];
$emailserrors = [];
if (!empty($formdata['emails'])) {
$emails = explode(',', $formdata['emails']);
foreach ($emails as $email) {
$email = trim($email);
if (!validate_email($email)) {
$emailserrors[] .= get_string('guestaccess_emails_invalidemail', 'mod_bigbluebuttonbn', $email);
}
}
}
if (!empty($emailserrors)) {
$errors['emails'] = \html_writer::alist($emailserrors);
}
return $errors;
}
/**
* Load in existing data as form defaults (not applicable).
*
* @return void
*/
public function set_data_for_dynamic_submission(): void {
$instance = $this->get_instance_from_params();
$data = [
'id' => $instance->get_instance_id(),
'groupid' => $instance->get_group_id(),
'guestjoinurl' => $instance->get_guest_access_url(),
'guestpassword' => $instance->get_guest_access_password(),
];
$this->set_data($data);
}
/**
* Get BigblueButton instance from context params
*
* @return instance
* @throws moodle_exception
*/
protected function get_instance_from_params(): instance {
$bbid = $this->optional_param('id', null, PARAM_INT);
$groupid = $this->optional_param('groupid', null, PARAM_INT);
if (empty($bbid)) {
throw new moodle_exception('guestaccess_add_no_id', 'mod_bigbluebuttonbn');
}
$instance = instance::get_from_instanceid($bbid);
if ($groupid) {
$instance->set_group_id($groupid);
}
return $instance;
}
/**
* Form definition
*/
protected function definition() {
self::add_meeting_links_elements($this->_form);
$mform = $this->_form;
$mform->addElement('text', 'emails',
get_string('guestaccess_emails', 'mod_bigbluebuttonbn'),
);
$mform->addHelpButton('emails', 'guestaccess_emails', 'mod_bigbluebuttonbn');
$mform->setDefault('emails', '');
$mform->setType('emails', PARAM_RAW);
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'groupid');
$mform->setType('groupid', PARAM_INT);
}
/**
* Add meeting links element. Helper for this form and the mod_form (module form)
*
* @param MoodleQuickForm $mform
* @return void
*/
public static function add_meeting_links_elements(MoodleQuickForm &$mform): void {
global $CFG;
MoodleQuickForm::registerElementType('text_with_copy',
"$CFG->dirroot/mod/bigbluebuttonbn/classes/form/text_with_copy_element.php",
text_with_copy_element::class);
$mform->addElement('text_with_copy', 'guestjoinurl',
get_string('guestaccess_meeting_link', 'mod_bigbluebuttonbn'),
[
'copylabel' => get_string('guestaccess_copy_link', 'mod_bigbluebuttonbn'),
'size' => self::MAX_INPUT_LENGTH,
'readonly' => 'readonly'
]
);
$mform->setType('guestjoinurl', PARAM_URL);
$mform->addElement('text_with_copy', 'guestpassword',
get_string('guestaccess_meeting_password', 'mod_bigbluebuttonbn'),
[
'copylabel' => get_string('guestaccess_copy_password', 'mod_bigbluebuttonbn'),
'readonly' => 'readonly',
'size' => self::MAX_INPUT_LENGTH,
]
);
$mform->setType('guestpassword', PARAM_RAW);
}
/**
* Check if current user has access to this form, otherwise throw exception.
*
* @return void
* @throws moodle_exception
*/
protected function check_access_for_dynamic_submission(): void {
$context = $this->get_context_for_dynamic_submission();
$instance = instance::get_from_cmid($context->instanceid);
if (!$instance->is_moderator()) {
throw new \restricted_context_exception();
}
}
/**
* Return form context
*
* @return context
*/
protected function get_context_for_dynamic_submission(): context {
$instance = $this->get_instance_from_params();
return $instance->get_context();
}
/**
* Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX.
*
* @return moodle_url
*/
protected function get_page_url_for_dynamic_submission(): moodle_url {
$context = $this->get_context_for_dynamic_submission();
return new moodle_url('/mod/bigbluebuttonbn/view.php', ['id' => $context->instanceid]);
}
}