184 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace local_treestudyplan\form;
 | 
						|
defined('MOODLE_INTERNAL') || die();
 | 
						|
 | 
						|
require_once($CFG->dirroot.'/repository/lib.php');
 | 
						|
use local_treestudyplan\aggregator;
 | 
						|
use local_treestudyplan\studyplan;
 | 
						|
use local_treestudyplan\premium;
 | 
						|
use local_treestudyplan\contextinfo;
 | 
						|
use local_treestudyplan\studyplanservice;
 | 
						|
use local_treestudyplan\courseservice;
 | 
						|
use local_treestudyplan\form\text_integer;
 | 
						|
use moodle_exception;
 | 
						|
use stdClass;
 | 
						|
 | 
						|
/**
 | 
						|
 * Moodleform class for the studyplan editor. A Moodleform is used here to facilitate a rich editor
 | 
						|
 * in the studyplan description
 | 
						|
 */
 | 
						|
class studyplan_fromtemplateform extends formbase {
 | 
						|
    /**
 | 
						|
     * Capability required to edit study plans
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    const CAP_EDIT = "local/treestudyplan:editstudyplan";
 | 
						|
 | 
						|
    /**
 | 
						|
     * Translate parameters into customdata.
 | 
						|
     *
 | 
						|
     * @param object $params The parameters for form initialization
 | 
						|
     * @return array Form data based on parameters
 | 
						|
     */
 | 
						|
    public static function init_customdata(object $params) {
 | 
						|
        $customdata = new stdClass;
 | 
						|
        $customdata->context = \context::instance_by_id($params->contextid);
 | 
						|
 | 
						|
        return $customdata;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Validate security access for this form based on the customdata generated by init_customdata
 | 
						|
     * Return true if validation passes, false or throw an exception if it does not.
 | 
						|
     *
 | 
						|
     * @param object $customdata The customdata for this form
 | 
						|
     * @return bool True if security validation passes.
 | 
						|
     * @throws \moodle_exception if access denied for a specific reason.
 | 
						|
     */
 | 
						|
    public static function check_security(object $customdata) {
 | 
						|
        /*webservicehelper::require_capabilities(self::CAP_EDIT, $customdata->context); */
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Generate form data from parameters
 | 
						|
     * Also validate parameters and access permissions here
 | 
						|
     *
 | 
						|
     * @param object $customdata The parameters for form initialization
 | 
						|
     * @return array Form data based on parameters
 | 
						|
     */
 | 
						|
    public function init_formdata(object $customdata) {
 | 
						|
        global $DB;
 | 
						|
        /*  Use direct database retrieval to avoid our abstractions causing trouble
 | 
						|
            with existing moodle code assumptions.
 | 
						|
            The form API does seem needlessly convoluted in it's use, but we need the editor...
 | 
						|
        */
 | 
						|
        $entry = new stdClass;
 | 
						|
        $entry->context_id = $customdata->context->id;
 | 
						|
 | 
						|
        // Determine the next august 1st for default value purposes.
 | 
						|
        $august = strtotime("first day of august this year");
 | 
						|
        if ($august < time()) {
 | 
						|
            $august = strtotime("first day of august next year");
 | 
						|
        }
 | 
						|
        $entry->startdate = $august;
 | 
						|
        $entry->enddate = $august + (364*24*60*60); // Not bothering about leap years here.
 | 
						|
        $entry->periods = 4;
 | 
						|
        $entry->template_id = 0;
 | 
						|
 | 
						|
        return $entry;
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set up the form definition
 | 
						|
     */
 | 
						|
    public function definition() {
 | 
						|
        $mform = $this->_form;
 | 
						|
        $customdata = (object)$this->_customdata;
 | 
						|
 | 
						|
        // Register integer type
 | 
						|
        text_integer::Register();
 | 
						|
 | 
						|
        // Define the form
 | 
						|
 | 
						|
        $templatelist = [];
 | 
						|
        foreach(studyplan::find_template() as $s) {
 | 
						|
            $c = (new contextinfo($s->context()))->model();
 | 
						|
            $templatelist[$s->id()] = implode(" / ", $c['path']) . " / " . $s->name();
 | 
						|
        }
 | 
						|
 | 
						|
        if (count($templatelist) > 0) {
 | 
						|
            $mform->addElement('hidden', 'hastemplates', 'yes');
 | 
						|
 | 
						|
            $field = 'template_id';
 | 
						|
            $mform->addElement('autocomplete', $field,
 | 
						|
                get_string('studyplan_fromtemplate', 'local_treestudyplan'),
 | 
						|
                $templatelist);
 | 
						|
            $mform->addRule($field, null, 'required', null, 'client');
 | 
						|
 | 
						|
            $field = 'name';
 | 
						|
            $mform->addElement('text', $field,
 | 
						|
                get_string('studyplan_name', 'local_treestudyplan'),
 | 
						|
                []);
 | 
						|
            $mform->addRule($field, null, 'required', null, 'client');
 | 
						|
 | 
						|
            $field = 'shortname';
 | 
						|
            $mform->addElement('text', $field,
 | 
						|
                get_string('studyplan_shortname', 'local_treestudyplan'),
 | 
						|
                []);
 | 
						|
            $mform->addRule($field, null, 'required', null, 'client');
 | 
						|
 | 
						|
            $field = 'idnumber';
 | 
						|
            $mform->addElement('text', $field,
 | 
						|
                get_string('studyplan_idnumber', 'local_treestudyplan'),
 | 
						|
                []);
 | 
						|
 | 
						|
            $contextlist = [];
 | 
						|
            foreach(courseservice::list_available_categories('edit') as $c) {
 | 
						|
                $contextlist[$c['context_id']] = implode(" / ", $c['category']['path']);
 | 
						|
            }
 | 
						|
 | 
						|
            $field = 'context_id';
 | 
						|
            $mform->addElement('autocomplete', $field,
 | 
						|
                get_string('studyplan_context', 'local_treestudyplan'),
 | 
						|
                $contextlist);
 | 
						|
            $mform->addRule($field, null, 'required', null, 'client');
 | 
						|
 | 
						|
            $timeless = \get_config("local_treestudyplan", "timelessperiods");
 | 
						|
            if ( !$timeless) {
 | 
						|
                // Only add these fields if the studyplans are timed
 | 
						|
                $field = 'startdate';
 | 
						|
                $mform->addElement('date_selector', $field,
 | 
						|
                    get_string('studyplan_startdate', 'local_treestudyplan'),
 | 
						|
                    []);
 | 
						|
                $mform->addRule($field, null, 'required', null, 'client');
 | 
						|
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            $mform->addElement('hidden', 'hastemplates', 'no');
 | 
						|
 | 
						|
            $field = 'warning';
 | 
						|
            $mform->addElement('static', $field,
 | 
						|
                get_string('warning', 'core'),
 | 
						|
                get_string('no_templates', 'local_treestudyplan')
 | 
						|
                );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Process the submitted data and perform necessary actions
 | 
						|
     * @param object $entry The processed form data;
 | 
						|
     * @return bool false if submission not successful
 | 
						|
     * @throws \moodle_exception if an error must be given for a specific reason.
 | 
						|
     */
 | 
						|
    protected function process_submitted_data($entry) {
 | 
						|
        $customdata = (object)$this->_customdata;
 | 
						|
 | 
						|
        if ($entry->hastemplates == "yes") {
 | 
						|
            // Find template study plan.
 | 
						|
            $template = studyplan::find_by_id($entry->template_id);
 | 
						|
            // Copy template plan.
 | 
						|
            $plan = $template->duplicate($entry->name, $entry->shortname, $entry->context_id, $entry->idnumber, $entry->startdate);
 | 
						|
 | 
						|
            /* Return the simple model of the plan to make sure we can update stuff.
 | 
						|
            Parse it through the clean_returnvalue function of exernal api (of which studyplanservice is a subclass)
 | 
						|
            so we return it in a consistent way
 | 
						|
            */
 | 
						|
            return studyplanservice::clean_returnvalue(studyplan::simple_structure(), $plan->simple_model());
 | 
						|
        } else {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
} |