Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?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 core_form;

use context;
> use core_external\external_api;
use moodle_url; defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->libdir . '/formslib.php'); /** * Class modal * * Extend this class to create a form that can be used in a modal dialogue. * * @package core_form * @copyright 2020 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class dynamic_form extends \moodleform { /** * Constructor for modal forms can not be overridden, however the same form can be used both in AJAX and normally * * @param string $action * @param array $customdata * @param string $method * @param string $target * @param array $attributes * @param bool $editable * @param array $ajaxformdata Forms submitted via ajax, must pass their data here, instead of relying on _GET and _POST. * @param bool $isajaxsubmission whether the form is called from WS and it needs to validate user access and set up context */ final public function __construct( ?string $action = null, ?array $customdata = null, string $method = 'post', string $target = '', ?array $attributes = [], bool $editable = true, ?array $ajaxformdata = null, bool $isajaxsubmission = false ) { global $PAGE, $CFG; $this->_ajaxformdata = $ajaxformdata; if ($isajaxsubmission) {
< require_once($CFG->libdir . '/externallib.php');
// This form was created from the WS that needs to validate user access to it and set page context. // It has to be done before calling parent constructor because elements definitions may need to use // format_string functions and other methods that expect the page to be set up.
< \external_api::validate_context($this->get_context_for_dynamic_submission());
> external_api::validate_context($this->get_context_for_dynamic_submission());
$PAGE->set_url($this->get_page_url_for_dynamic_submission()); $this->check_access_for_dynamic_submission(); } $attributes = ['data-random-ids' => 1] + ($attributes ?: []); parent::__construct($action, $customdata, $method, $target, $attributes, $editable, $ajaxformdata); } /** * Returns context where this form is used *
< * This context is validated in {@see \external_api::validate_context()}
> * This context is validated in {@see external_api::validate_context()}
* * If context depends on the form data, it is available in $this->_ajaxformdata or * by calling $this->optional_param() * * Example: * $cmid = $this->optional_param('cmid', 0, PARAM_INT); * return context_module::instance($cmid); * * @return context */ abstract protected function get_context_for_dynamic_submission(): context; /** * Checks if current user has access to this form, otherwise throws exception * * Sometimes permission check may depend on the action and/or id of the entity. * If necessary, form data is available in $this->_ajaxformdata or * by calling $this->optional_param() * * Example: * require_capability('dosomething', $this->get_context_for_dynamic_submission()); */ abstract protected function check_access_for_dynamic_submission(): void; /** * Process the form submission, used if form was submitted via AJAX * * This method can return scalar values or arrays that can be json-encoded, they will be passed to the caller JS. * * Submission data can be accessed as: $this->get_data() * * Example: * $data = $this->get_data(); * file_postupdate_standard_filemanager($data, ....); * api::save_entity($data); // Save into the DB, trigger event, etc. * * @return mixed */ abstract public function process_dynamic_submission(); /** * Load in existing data as form defaults * * Can be overridden to retrieve existing values from db by entity id and also * to preprocess editor and filemanager elements * * Example: * $id = $this->optional_param('id', 0, PARAM_INT); * $data = api::get_entity($id); // For example, retrieve a row from the DB. * file_prepare_standard_filemanager($data, ...); * $this->set_data($data); */ abstract public function set_data_for_dynamic_submission(): void; /** * Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX * * This is used in the form elements sensitive to the page url, such as Atto autosave in 'editor' * * If the form has arguments (such as 'id' of the element being edited), the URL should * also have respective argument. * * Example: * $id = $this->optional_param('id', 0, PARAM_INT); * return new moodle_url('/my/page/where/form/is/used.php', ['id' => $id]); * * @return moodle_url */ abstract protected function get_page_url_for_dynamic_submission(): moodle_url; }