187 lines
No EOL
6.6 KiB
PHP
187 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;
|
|
}
|
|
}
|
|
|
|
|
|
} |