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 namespace mod_bigbluebuttonbn\form; 17 18 use context; 19 use core_form\dynamic_form; 20 use mod_bigbluebuttonbn\instance; 21 use mod_bigbluebuttonbn\local\exceptions\bigbluebutton_exception; 22 use mod_bigbluebuttonbn\task\send_guest_emails; 23 use moodle_exception; 24 use moodle_url; 25 use MoodleQuickForm; 26 27 /** 28 * Popup form to add new guests to a meeting and show/copy credential to access the guest login page. 29 * 30 * @package mod_bigbluebuttonbn 31 * @copyright 2022 onwards, Blindside Networks Inc 32 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 33 * @author Laurent David (laurent [at] call-learning [dt] fr) 34 */ 35 class guest_add extends dynamic_form { 36 37 /** 38 * Max length for credential and url fields. 39 */ 40 const MAX_INPUT_LENGTH = 35; 41 42 /** 43 * Process the form submission, used if form was submitted via AJAX. 44 * 45 * @return array 46 */ 47 public function process_dynamic_submission(): array { 48 global $USER; 49 $data = $this->get_data(); 50 $allmails = []; 51 if (!empty($data->emails)) { 52 $emails = explode(',', $data->emails); 53 foreach ($emails as $email) { 54 $email = trim($email); 55 if (validate_email($email)) { 56 $allmails[] = $email; 57 } 58 } 59 $adhoctask = new send_guest_emails(); 60 $adhoctask->set_custom_data( 61 [ 62 'emails' => $allmails, 63 'useridfrom' => $USER->id 64 ] 65 ); 66 $adhoctask->set_instance_id($data->id); 67 \core\task\manager::queue_adhoc_task($adhoctask); 68 } 69 return [ 70 'result' => true, 71 'emails' => join(', ', $allmails), 72 'emailcount' => count($allmails), 73 'errors' => '' 74 ]; 75 } 76 77 /** 78 * Perform some validation. 79 * 80 * @param array $formdata 81 * @param array $files 82 * @return array 83 */ 84 public function validation($formdata, $files): array { 85 $errors = []; 86 $emailserrors = []; 87 if (!empty($formdata['emails'])) { 88 $emails = explode(',', $formdata['emails']); 89 foreach ($emails as $email) { 90 $email = trim($email); 91 if (!validate_email($email)) { 92 $emailserrors[] .= get_string('guestaccess_emails_invalidemail', 'mod_bigbluebuttonbn', $email); 93 } 94 } 95 } 96 if (!empty($emailserrors)) { 97 $errors['emails'] = \html_writer::alist($emailserrors); 98 } 99 return $errors; 100 } 101 102 /** 103 * Load in existing data as form defaults (not applicable). 104 * 105 * @return void 106 */ 107 public function set_data_for_dynamic_submission(): void { 108 $instance = $this->get_instance_from_params(); 109 $data = [ 110 'id' => $instance->get_instance_id(), 111 'groupid' => $instance->get_group_id(), 112 'guestjoinurl' => $instance->get_guest_access_url(), 113 'guestpassword' => $instance->get_guest_access_password(), 114 ]; 115 $this->set_data($data); 116 117 } 118 119 /** 120 * Get BigblueButton instance from context params 121 * 122 * @return instance 123 * @throws moodle_exception 124 */ 125 protected function get_instance_from_params(): instance { 126 $bbid = $this->optional_param('id', null, PARAM_INT); 127 $groupid = $this->optional_param('groupid', null, PARAM_INT); 128 if (empty($bbid)) { 129 throw new moodle_exception('guestaccess_add_no_id', 'mod_bigbluebuttonbn'); 130 } 131 $instance = instance::get_from_instanceid($bbid); 132 if ($groupid) { 133 $instance->set_group_id($groupid); 134 } 135 return $instance; 136 } 137 138 /** 139 * Form definition 140 */ 141 protected function definition() { 142 self::add_meeting_links_elements($this->_form); 143 $mform = $this->_form; 144 $mform->addElement('text', 'emails', 145 get_string('guestaccess_emails', 'mod_bigbluebuttonbn'), 146 ); 147 $mform->addHelpButton('emails', 'guestaccess_emails', 'mod_bigbluebuttonbn'); 148 $mform->setDefault('emails', ''); 149 $mform->setType('emails', PARAM_RAW); 150 $mform->addElement('hidden', 'id'); 151 $mform->setType('id', PARAM_INT); 152 $mform->addElement('hidden', 'groupid'); 153 $mform->setType('groupid', PARAM_INT); 154 } 155 156 /** 157 * Add meeting links element. Helper for this form and the mod_form (module form) 158 * 159 * @param MoodleQuickForm $mform 160 * @return void 161 */ 162 public static function add_meeting_links_elements(MoodleQuickForm &$mform): void { 163 global $CFG; 164 MoodleQuickForm::registerElementType('text_with_copy', 165 "$CFG->dirroot/mod/bigbluebuttonbn/classes/form/text_with_copy_element.php", 166 text_with_copy_element::class); 167 $mform->addElement('text_with_copy', 'guestjoinurl', 168 get_string('guestaccess_meeting_link', 'mod_bigbluebuttonbn'), 169 [ 170 'copylabel' => get_string('guestaccess_copy_link', 'mod_bigbluebuttonbn'), 171 'size' => self::MAX_INPUT_LENGTH, 172 'readonly' => 'readonly' 173 ] 174 ); 175 $mform->setType('guestjoinurl', PARAM_URL); 176 $mform->addElement('text_with_copy', 'guestpassword', 177 get_string('guestaccess_meeting_password', 'mod_bigbluebuttonbn'), 178 [ 179 'copylabel' => get_string('guestaccess_copy_password', 'mod_bigbluebuttonbn'), 180 'readonly' => 'readonly', 181 'size' => self::MAX_INPUT_LENGTH, 182 ] 183 ); 184 $mform->setType('guestpassword', PARAM_RAW); 185 } 186 187 /** 188 * Check if current user has access to this form, otherwise throw exception. 189 * 190 * @return void 191 * @throws moodle_exception 192 */ 193 protected function check_access_for_dynamic_submission(): void { 194 $context = $this->get_context_for_dynamic_submission(); 195 $instance = instance::get_from_cmid($context->instanceid); 196 if (!$instance->is_moderator()) { 197 throw new \restricted_context_exception(); 198 } 199 } 200 201 /** 202 * Return form context 203 * 204 * @return context 205 */ 206 protected function get_context_for_dynamic_submission(): context { 207 $instance = $this->get_instance_from_params(); 208 return $instance->get_context(); 209 } 210 211 /** 212 * Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX. 213 * 214 * @return moodle_url 215 */ 216 protected function get_page_url_for_dynamic_submission(): moodle_url { 217 $context = $this->get_context_for_dynamic_submission(); 218 return new moodle_url('/mod/bigbluebuttonbn/view.php', ['id' => $context->instanceid]); 219 } 220 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body