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(); } $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']); } $mform->addElement('autocomplete', 'context_id', get_string('studyplan_context','local_treestudyplan'), $contextlist); $mform->addRule('context_id', 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'); } } /** * 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; // 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()); } }