Added mform through ajax features to support rich editor for studyplan description

This commit is contained in:
PMKuipers 2023-10-19 17:35:51 +02:00
parent 2a642f33c8
commit 49fa4b2ed3
5 changed files with 269 additions and 6 deletions

View file

@ -0,0 +1,45 @@
<?php
namespace local_treestudyplan\local\forms;
use moodleform;
abstract class formbase extends moodleform {
/**
* Create the form while providing the correct defaults for our type of forms
* @param array $ajaxformdata Provide submitted form data through Ajax here
*
*/
public function __construct($ajaxformdata=null) {
parent::__construct(null, null, 'post', '', null, true, $ajaxformdata);
}
/**
* Generate form data from parameters
* Also validate parameters and access permissions here
*
* @param array $params The parameters for form initialization
* @return array Form data based on parameters
*/
abstract public static function init_data(array $params);
/**
* Validate security access for this form based on the provided parameters
* Return true if validation passes, false or throw an exception if it does not.
*
* @param array $params The parameters for form initialization
* @return bool True if security validation passes.
* @throws \moodle_exception if access denied for a specific reason.
*/
abstract public static function check_security(array $params);
/**
* Process the submission and perform necessary actions
* @return bool True if submission successful
* @throws \moodle_exception if an error must be given for a specific reason.
*/
abstract public function process_submission();
}

View file

@ -2,19 +2,58 @@
namespace local_treestudyplan\local\forms; namespace local_treestudyplan\local\forms;
use moodleform; /**
* Moodleform class for the studyplan editor. A Moodleform is used here to facilitate a rich editor
* in the studyplan description
*/
class studyplan_editform extends formbase {
class studyplan_editform extends moodleform { /**
* Validate security access for this form based on the provided parameters
* Return true if validation passes, false or throw an exception if it does not.
*
* @param array $params The parameters for form initialization
* @return bool True if security validation passes.
* @throws \moodle_exception if access denied for a specific reason.
*/
public static function check_security(array $params) {
}
/**
* Generate form data from parameters
* Also validate parameters and access permissions here
*
* @param array $params The parameters for form initialization
* @return array Form data based on parameters
*/
public static function init_data(array $params) {
}
/**
* Set up the form definition
*/
public function definition() { public function definition() {
global $CFG, $COURSE, $DB, $PAGE;
$mform = $this->_form; $mform = $this->_form;
// Activity. // Define the form
$mform->addElement('editor', 'activityeditor', $mform->addElement('editor', 'activityeditor',
get_string('activityeditor', 'assign'), array('rows' => 10), array('maxfiles' => EDITOR_UNLIMITED_FILES, get_string('activityeditor', 'assign'), array('rows' => 10), array('maxfiles' => EDITOR_UNLIMITED_FILES,
'noclean' => true, 'context' => $this->context, 'subdirs' => true)); 'noclean' => true, 'context' => $this->context, 'subdirs' => true));
$mform->addHelpButton('activityeditor', 'activityeditor', 'assign'); $mform->addHelpButton('activityeditor', 'activityeditor', 'assign');
$mform->setType('activityeditor', PARAM_RAW); $mform->setType('activityeditor', PARAM_RAW);
} }
/**
* Process the submission and perform necessary actions
* @throws \moodle_exception if an error must be given for a specific reason.
*/
public function process_submission()
{
}
} }

161
classes/utilityservice.php Normal file
View file

@ -0,0 +1,161 @@
<?php
// This file is part of the Studyplan plugin for Moodle
//
// 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 <https://www.gnu.org/licenses/>.
/**
* Webservice class for managing studyplans
* @package local_treestudyplan
* @copyright 2023 P.M. Kuipers
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_treestudyplan;
defined('MOODLE_INTERNAL') || die();
use local_treestudyplan\local\helpers\webservicehelper;
require_once($CFG->libdir.'/externallib.php');
require_once($CFG->libdir.'/badgeslib.php');
require_once($CFG->libdir.'/gradelib.php');
require_once($CFG->dirroot.'/course/modlib.php');
/**
* Webservice class for managing studyplans
*/
class utilityservice extends \external_api {
/**
* Capability required to edit study plans
* @var string
*/
const CAP_EDIT = "local/treestudyplan:editstudyplan";
/**
* Capability required to view studyplans (for other users)
* @var string
*/
const CAP_VIEW = "local/treestudyplan:viewuserreports";
protected function load_mform($formname, $params, $ajaxformdata = null) {
global $CFG;
$modmoodleform = "$CFG->dirroot/local/treestudyplan/local/forms/{$formname}.php";
if (!file_exists($modmoodleform)) {
// We don't need to load the form (autoloading will handle that) but do need to check it's existence
throw new \moodle_exception('noformdesc', 'local_treestudyplan');;
}
$mformclassname = "\\local_treestudyplan\\local\\forms\\{$formname}";
$jsonparams = json_decode($params);
if($mformclassname::security_validate($params)){
$mform = new $mformclassname($ajaxformdata);
$mform->set_data($mformclassname::init_data($jsonparams));
return $mform;
} else {
throw new \moodle_exception('accessexception', 'core');
}
}
/**
* Returns description of get_mform parameters
*
* @return \external_function_parameters
* @since Moodle 3.1
*/
public static function get_mform_parameters() {
return new \external_function_parameters([
'formname' => new \external_value(PARAM_COMPONENT, 'name of the treestudyplan form to parse'),
'params' => new \external_value(PARAM_RAW, 'JSON encoded parameters for form initialization'),
]);
}
/**
* Get a HTML of a studyplan mform(s) via AJAX to insert into html
*
* @param string $formname Name of the form.
* @param array $params Params needed to properly initialize the form
* @return array HTML and JavaScript fragments for insertion into stuff.
*/
public static function get_mform($formname, $params = '') {
global $OUTPUT, $PAGE, $CFG;
// Hack alert: Set a default URL to stop the annoying debug.
$PAGE->set_url('/');
// Hack alert: Forcing bootstrap_renderer to initiate moodle page.
$OUTPUT->header();
// Overwriting page_requirements_manager with the fragment one so only JS included from.
// this point is returned to the user.
$PAGE->start_collecting_javascript_requirements();
$mform = self::load_mform($formname, $params);
$html = $mform->render();
$jsfooter = $PAGE->requires->get_end_code();
$output = ['html' => $html, 'javascript' => $jsfooter];
return $output;
}
/**
* Returns description of get_mform() result value
*
* @return \core_external\external_description
* @since Moodle 3.1
*/
public static function get_mform_returns() {
return new \external_single_structure(
[
'html' => new \external_value(PARAM_RAW, 'HTML fragment.'),
'javascript' => new \external_value(PARAM_RAW, 'JavaScript fragment')
]
);
}
/**
* Parameter description for webservice function submit_cm_editform
*/
public static function submit_mform_parameters() : \external_function_parameters {
return new \external_function_parameters( [
'formname' => new \external_value(PARAM_COMPONENT, 'name of the treestudyplan form to parse'),
'params' => new \external_value(PARAM_RAW, 'JSON encoded parameters for form initialization'),
"formdata" => new \external_value(PARAM_RAW, 'url encoded form data'),
] );
}
/**
* Return value description for webservice function submit_cm_editform
*/
public static function submit_mform_returns() : \external_description {
return success::structure();
}
/**
* Submit specified form data into form
* @param string $formname Name of the form.
* @param array $params Params needed to properly initialize the form
* @param mixed $formdata
* @return array Success/fail structure
*/
public static function submit_mform($formname, $params, $formdata) {
// Load the form, provide submitted form data and perform security checks
$mform = self::load_mform($formname, $params, $formdata);
if ($mform->process_submission()) {
return success::success()->model();
} else {
return success::fail("Error in submission data")->model();
}
}
}

View file

@ -591,4 +591,22 @@ $functions = [
'ajax' => true, 'ajax' => true,
'loginrequired' => true, 'loginrequired' => true,
], ],
'local_treestudyplan_get_mform' => [ // Web service function name.
'classname' => '\local_treestudyplan\utilityservice', // Class containing the external function.
'methodname' => 'get_mform', // External function name.
'description' => 'Get a studyplan specific form',
'type' => 'read', // Database rights of the web service function (read, write).
'capabilities' => 'local/treestudyplan:editstudyplan',
'ajax' => true,
'loginrequired' => true,
],
'local_treestudyplan_submit_mform' => [ // Web service function name.
'classname' => '\local_treestudyplan\utilityservice', // Class containing the external function.
'methodname' => 'submit_mform', // External function name.
'description' => 'Submit a studyplan specific form through ajax',
'type' => 'read', // Database rights of the web service function (read, write).
'capabilities' => 'local/treestudyplan:editstudyplan',
'ajax' => true,
'loginrequired' => true,
],
]; ];

View file

@ -22,11 +22,11 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
$plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494). $plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494).
$plugin->version = 2023090701; // YYYYMMDDHH (year, month, day, iteration). $plugin->version = 2023101900; // YYYYMMDDHH (year, month, day, iteration).
$plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11). $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11).
$plugin->release = "1.1.0-RC1"; $plugin->release = "1.1.0-RC1";
$plugin->maturity = MATURITY_STABLE; $plugin->maturity = MATURITY_BETA; /*MATURITY_STABLE;*/
// Supported from Moodle 3.11 to 4.1 (4.2 not yet tested). // Supported from Moodle 3.11 to 4.1 (4.2 not yet tested).
$plugin->supported = [ 311, 401 ]; $plugin->supported = [ 311, 401 ];