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 * Class for manipulating with the template records. 19 * 20 * @package quizaccess_seb 21 * @author Dmitrii Metelkin <dmitriim@catalyst-au.net> 22 * @copyright 2020 Catalyst IT 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 namespace quizaccess_seb; 27 28 use core\notification; 29 use quizaccess_seb\local\table\template_list; 30 31 defined('MOODLE_INTERNAL') || die(); 32 33 /** 34 * Class for manipulating with the template records. 35 * 36 * @copyright 2020 Catalyst IT 37 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 38 */ 39 class template_controller { 40 /** 41 * View action. 42 */ 43 const ACTION_VIEW = 'view'; 44 45 /** 46 * Add action. 47 */ 48 const ACTION_ADD = 'add'; 49 50 /** 51 * Edit action. 52 */ 53 const ACTION_EDIT = 'edit'; 54 55 /** 56 * Delete action. 57 */ 58 const ACTION_DELETE = 'delete'; 59 60 /** 61 * Hide action. 62 */ 63 const ACTION_HIDE = 'hide'; 64 65 /** 66 * Show action. 67 */ 68 const ACTION_SHOW = 'show'; 69 70 71 /** 72 * Locally cached $OUTPUT object. 73 * @var \bootstrap_renderer 74 */ 75 protected $output; 76 77 /** 78 * region_manager constructor. 79 */ 80 public function __construct() { 81 global $OUTPUT; 82 83 $this->output = $OUTPUT; 84 } 85 86 /** 87 * Execute required action. 88 * 89 * @param string $action Action to execute. 90 */ 91 public function execute($action) { 92 93 $this->set_external_page(); 94 95 switch($action) { 96 case self::ACTION_ADD: 97 case self::ACTION_EDIT: 98 $this->edit($action, optional_param('id', null, PARAM_INT)); 99 break; 100 101 case self::ACTION_DELETE: 102 $this->delete(required_param('id', PARAM_INT)); 103 break; 104 105 case self::ACTION_HIDE: 106 $this->hide(required_param('id', PARAM_INT)); 107 break; 108 109 case self::ACTION_SHOW: 110 $this->show(required_param('id', PARAM_INT)); 111 break; 112 113 case self::ACTION_VIEW: 114 default: 115 $this->view(); 116 break; 117 } 118 } 119 120 /** 121 * Set external page for the manager. 122 */ 123 protected function set_external_page() { 124 admin_externalpage_setup('quizaccess_seb/template'); 125 } 126 127 /** 128 * Return record instance. 129 * 130 * @param int $id 131 * @param \stdClass|null $data 132 * 133 * @return \quizaccess_seb\template 134 */ 135 protected function get_instance($id = 0, \stdClass $data = null) { 136 return new template($id, $data); 137 } 138 139 /** 140 * Print out all records in a table. 141 */ 142 protected function display_all_records() { 143 $records = template::get_records([], 'id'); 144 145 $table = new template_list(); 146 $table->display($records); 147 } 148 149 /** 150 * Returns a text for create new record button. 151 * @return string 152 */ 153 protected function get_create_button_text() : string { 154 return get_string('addtemplate', 'quizaccess_seb'); 155 } 156 157 /** 158 * Returns form for the record. 159 * 160 * @param \quizaccess_seb\template|null $instance 161 * 162 * @return \quizaccess_seb\local\form\template 163 */ 164 protected function get_form($instance) : \quizaccess_seb\local\form\template { 165 global $PAGE; 166 167 return new \quizaccess_seb\local\form\template($PAGE->url->out(false), ['persistent' => $instance]); 168 } 169 170 /** 171 * View page heading string. 172 * @return string 173 */ 174 protected function get_view_heading() : string { 175 return get_string('managetemplates', 'quizaccess_seb'); 176 } 177 178 /** 179 * New record heading string. 180 * @return string 181 */ 182 protected function get_new_heading() : string { 183 return get_string('newtemplate', 'quizaccess_seb'); 184 } 185 186 /** 187 * Edit record heading string. 188 * @return string 189 */ 190 protected function get_edit_heading() : string { 191 return get_string('edittemplate', 'quizaccess_seb'); 192 } 193 194 /** 195 * Returns base URL for the manager. 196 * @return string 197 */ 198 public static function get_base_url() : string { 199 return '/mod/quiz/accessrule/seb/template.php'; 200 } 201 202 /** 203 * Execute edit action. 204 * 205 * @param string $action Could be edit or create. 206 * @param null|int $id Id of the region or null if creating a new one. 207 */ 208 protected function edit($action, $id = null) { 209 global $PAGE; 210 211 $PAGE->set_url(new \moodle_url(static::get_base_url(), ['action' => $action, 'id' => $id])); 212 $instance = null; 213 214 if ($id) { 215 $instance = $this->get_instance($id); 216 } 217 218 $form = $this->get_form($instance); 219 220 if ($form->is_cancelled()) { 221 redirect(new \moodle_url(static::get_base_url())); 222 } else if ($data = $form->get_data()) { 223 unset($data->submitbutton); 224 try { 225 if (empty($data->id)) { 226 $data->content = $form->get_file_content('content'); 227 $persistent = $this->get_instance(0, $data); 228 $persistent->create(); 229 230 \quizaccess_seb\event\template_created::create_strict( 231 $persistent, 232 \context_system::instance() 233 )->trigger(); 234 $this->trigger_enabled_event($persistent); 235 } else { 236 $instance->from_record($data); 237 $instance->update(); 238 239 \quizaccess_seb\event\template_updated::create_strict( 240 $instance, 241 \context_system::instance() 242 )->trigger(); 243 $this->trigger_enabled_event($instance); 244 } 245 notification::success(get_string('changessaved')); 246 } catch (\Exception $e) { 247 notification::error($e->getMessage()); 248 } 249 redirect(new \moodle_url(static::get_base_url())); 250 } else { 251 if (empty($instance)) { 252 $this->header($this->get_new_heading()); 253 } else { 254 if (!$instance->can_delete()) { 255 notification::warning(get_string('cantedit', 'quizaccess_seb')); 256 } 257 $this->header($this->get_edit_heading()); 258 } 259 } 260 261 $form->display(); 262 $this->footer(); 263 } 264 265 /** 266 * Execute delete action. 267 * 268 * @param int $id ID of the region. 269 */ 270 protected function delete($id) { 271 require_sesskey(); 272 $instance = $this->get_instance($id); 273 274 if ($instance->can_delete()) { 275 $instance->delete(); 276 notification::success(get_string('deleted')); 277 278 \quizaccess_seb\event\template_deleted::create_strict( 279 $id, 280 \context_system::instance() 281 )->trigger(); 282 283 redirect(new \moodle_url(static::get_base_url())); 284 } else { 285 notification::warning(get_string('cantdelete', 'quizaccess_seb')); 286 redirect(new \moodle_url(static::get_base_url())); 287 } 288 } 289 290 /** 291 * Execute view action. 292 */ 293 protected function view() { 294 global $PAGE; 295 296 $this->header($this->get_view_heading()); 297 $this->print_add_button(); 298 $this->display_all_records(); 299 300 // JS for Template management. 301 $PAGE->requires->js_call_amd('quizaccess_seb/managetemplates', 'setup'); 302 303 $this->footer(); 304 } 305 306 /** 307 * Show the template. 308 * 309 * @param int $id The ID of the template to show. 310 */ 311 protected function show(int $id) { 312 $this->show_hide($id, 1); 313 } 314 315 /** 316 * Hide the template. 317 * 318 * @param int $id The ID of the template to hide. 319 */ 320 protected function hide($id) { 321 $this->show_hide($id, 0); 322 } 323 324 /** 325 * Show or Hide the template. 326 * 327 * @param int $id The ID of the template to hide. 328 * @param int $visibility The intended visibility. 329 */ 330 protected function show_hide(int $id, int $visibility) { 331 require_sesskey(); 332 $template = $this->get_instance($id); 333 $template->set('enabled', $visibility); 334 $template->save(); 335 336 $this->trigger_enabled_event($template); 337 338 redirect(new \moodle_url(self::get_base_url())); 339 } 340 341 /** 342 * Print out add button. 343 */ 344 protected function print_add_button() { 345 echo $this->output->single_button( 346 new \moodle_url(static::get_base_url(), ['action' => self::ACTION_ADD]), 347 $this->get_create_button_text() 348 ); 349 } 350 351 /** 352 * Print out page header. 353 * @param string $title Title to display. 354 */ 355 protected function header($title) { 356 echo $this->output->header(); 357 echo $this->output->heading($title); 358 } 359 360 /** 361 * Print out the page footer. 362 * 363 * @return void 364 */ 365 protected function footer() { 366 echo $this->output->footer(); 367 } 368 369 /** 370 * Helper function to fire off an event that informs of if a template is enabled or not. 371 * 372 * @param template $template The template persistent object. 373 */ 374 private function trigger_enabled_event(template $template) { 375 $eventstring = ($template->get('enabled') == 0 ? 'disabled' : 'enabled'); 376 377 $func = '\quizaccess_seb\event\template_' . $eventstring; 378 $func::create_strict( 379 $template, 380 \context_system::instance() 381 )->trigger(); 382 } 383 384 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body