Autoría | Ultima modificación | Ver Log |
<?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/>.
/**
* Class for manipulating with the template records.
*
* @package quizaccess_seb
* @author Dmitrii Metelkin <dmitriim@catalyst-au.net>
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace quizaccess_seb;
use core\notification;
use quizaccess_seb\local\table\template_list;
defined('MOODLE_INTERNAL') || die();
/**
* Class for manipulating with the template records.
*
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class template_controller {
/**
* View action.
*/
const ACTION_VIEW = 'view';
/**
* Add action.
*/
const ACTION_ADD = 'add';
/**
* Edit action.
*/
const ACTION_EDIT = 'edit';
/**
* Delete action.
*/
const ACTION_DELETE = 'delete';
/**
* Hide action.
*/
const ACTION_HIDE = 'hide';
/**
* Show action.
*/
const ACTION_SHOW = 'show';
/**
* Locally cached $OUTPUT object.
* @var \bootstrap_renderer
*/
protected $output;
/**
* region_manager constructor.
*/
public function __construct() {
global $OUTPUT;
$this->output = $OUTPUT;
}
/**
* Execute required action.
*
* @param string $action Action to execute.
*/
public function execute($action) {
$this->set_external_page();
switch($action) {
case self::ACTION_ADD:
case self::ACTION_EDIT:
$this->edit($action, optional_param('id', null, PARAM_INT));
break;
case self::ACTION_DELETE:
$this->delete(required_param('id', PARAM_INT));
break;
case self::ACTION_HIDE:
$this->hide(required_param('id', PARAM_INT));
break;
case self::ACTION_SHOW:
$this->show(required_param('id', PARAM_INT));
break;
case self::ACTION_VIEW:
default:
$this->view();
break;
}
}
/**
* Set external page for the manager.
*/
protected function set_external_page() {
admin_externalpage_setup('quizaccess_seb/template');
}
/**
* Return record instance.
*
* @param int $id
* @param \stdClass|null $data
*
* @return \quizaccess_seb\template
*/
protected function get_instance($id = 0, \stdClass $data = null) {
return new template($id, $data);
}
/**
* Print out all records in a table.
*/
protected function display_all_records() {
$records = template::get_records([], 'id');
$table = new template_list();
$table->display($records);
}
/**
* Returns a text for create new record button.
* @return string
*/
protected function get_create_button_text(): string {
return get_string('addtemplate', 'quizaccess_seb');
}
/**
* Returns form for the record.
*
* @param \quizaccess_seb\template|null $instance
*
* @return \quizaccess_seb\local\form\template
*/
protected function get_form($instance): \quizaccess_seb\local\form\template {
global $PAGE;
return new \quizaccess_seb\local\form\template($PAGE->url->out(false), ['persistent' => $instance]);
}
/**
* View page heading string.
* @return string
*/
protected function get_view_heading(): string {
return get_string('managetemplates', 'quizaccess_seb');
}
/**
* New record heading string.
* @return string
*/
protected function get_new_heading(): string {
return get_string('newtemplate', 'quizaccess_seb');
}
/**
* Edit record heading string.
* @return string
*/
protected function get_edit_heading(): string {
return get_string('edittemplate', 'quizaccess_seb');
}
/**
* Returns base URL for the manager.
* @return string
*/
public static function get_base_url(): string {
return '/mod/quiz/accessrule/seb/template.php';
}
/**
* Execute edit action.
*
* @param string $action Could be edit or create.
* @param null|int $id Id of the region or null if creating a new one.
*/
protected function edit($action, $id = null) {
global $PAGE;
$PAGE->set_url(new \moodle_url(static::get_base_url(), ['action' => $action, 'id' => $id]));
$instance = null;
if ($id) {
$instance = $this->get_instance($id);
}
$form = $this->get_form($instance);
if ($form->is_cancelled()) {
redirect(new \moodle_url(static::get_base_url()));
} else if ($data = $form->get_data()) {
unset($data->submitbutton);
try {
if (empty($data->id)) {
$data->content = $form->get_file_content('content');
$persistent = $this->get_instance(0, $data);
$persistent->create();
\quizaccess_seb\event\template_created::create_strict(
$persistent,
\context_system::instance()
)->trigger();
$this->trigger_enabled_event($persistent);
} else {
$instance->from_record($data);
$instance->update();
\quizaccess_seb\event\template_updated::create_strict(
$instance,
\context_system::instance()
)->trigger();
$this->trigger_enabled_event($instance);
}
notification::success(get_string('changessaved'));
} catch (\Exception $e) {
notification::error($e->getMessage());
}
redirect(new \moodle_url(static::get_base_url()));
} else {
if (empty($instance)) {
$this->header($this->get_new_heading());
} else {
if (!$instance->can_delete()) {
notification::warning(get_string('cantedit', 'quizaccess_seb'));
}
$this->header($this->get_edit_heading());
}
}
$form->display();
$this->footer();
}
/**
* Execute delete action.
*
* @param int $id ID of the region.
*/
protected function delete($id) {
require_sesskey();
$instance = $this->get_instance($id);
if ($instance->can_delete()) {
$instance->delete();
notification::success(get_string('deleted'));
\quizaccess_seb\event\template_deleted::create_strict(
$id,
\context_system::instance()
)->trigger();
redirect(new \moodle_url(static::get_base_url()));
} else {
notification::warning(get_string('cantdelete', 'quizaccess_seb'));
redirect(new \moodle_url(static::get_base_url()));
}
}
/**
* Execute view action.
*/
protected function view() {
global $PAGE;
$this->header($this->get_view_heading());
$this->print_add_button();
$this->display_all_records();
// JS for Template management.
$PAGE->requires->js_call_amd('quizaccess_seb/managetemplates', 'setup');
$this->footer();
}
/**
* Show the template.
*
* @param int $id The ID of the template to show.
*/
protected function show(int $id) {
$this->show_hide($id, 1);
}
/**
* Hide the template.
*
* @param int $id The ID of the template to hide.
*/
protected function hide($id) {
$this->show_hide($id, 0);
}
/**
* Show or Hide the template.
*
* @param int $id The ID of the template to hide.
* @param int $visibility The intended visibility.
*/
protected function show_hide(int $id, int $visibility) {
require_sesskey();
$template = $this->get_instance($id);
$template->set('enabled', $visibility);
$template->save();
$this->trigger_enabled_event($template);
redirect(new \moodle_url(self::get_base_url()));
}
/**
* Print out add button.
*/
protected function print_add_button() {
echo $this->output->single_button(
new \moodle_url(static::get_base_url(), ['action' => self::ACTION_ADD]),
$this->get_create_button_text()
);
}
/**
* Print out page header.
* @param string $title Title to display.
*/
protected function header($title) {
echo $this->output->header();
echo $this->output->heading($title);
}
/**
* Print out the page footer.
*
* @return void
*/
protected function footer() {
echo $this->output->footer();
}
/**
* Helper function to fire off an event that informs of if a template is enabled or not.
*
* @param template $template The template persistent object.
*/
private function trigger_enabled_event(template $template) {
$eventstring = ($template->get('enabled') == 0 ? 'disabled' : 'enabled');
$func = '\quizaccess_seb\event\template_' . $eventstring;
$func::create_strict(
$template,
\context_system::instance()
)->trigger();
}
}