1
0
mirror of https://github.com/moodle/moodle.git synced 2025-04-25 02:16:06 +02:00

MDL-59259 tool_uploadcourse: apply course format options

This commit is contained in:
Marina Glancy 2018-06-01 12:49:36 +08:00
parent 6153be6850
commit a589b992f8
4 changed files with 76 additions and 3 deletions
admin/tool/uploadcourse
course/format

@ -693,7 +693,15 @@ class tool_uploadcourse_course {
return false;
}
// TODO MDL-59259 allow to set course format options for the current course format.
// Add data for course format options.
if (isset($coursedata['format']) || $exists) {
if (isset($coursedata['format'])) {
$courseformat = course_get_format((object)['format' => $coursedata['format']]);
} else {
$courseformat = course_get_format($existingdata);
}
$coursedata += $courseformat->validate_course_format_options($this->rawdata);
}
// Special case, 'numsections' is not a course format option any more but still should apply from defaults.
if (!$exists || !array_key_exists('numsections', $coursedata)) {

@ -99,7 +99,8 @@ class tool_uploadcourse_course_testcase extends advanced_testcase {
$this->assertTrue($co->prepare());
$this->assertFalse($DB->record_exists('course', array('shortname' => 'newcourse')));
$co->proceed();
$this->assertTrue($DB->record_exists('course', array('shortname' => 'newcourse')));
$course = $DB->get_record('course', array('shortname' => 'newcourse'), '*', MUST_EXIST);
$this->assertEquals(0, course_get_format($course)->get_course()->coursedisplay);
// Try to add a new course, that already exists.
$coursecount = $DB->count_records('course', array());
@ -118,6 +119,16 @@ class tool_uploadcourse_course_testcase extends advanced_testcase {
$this->assertTrue($co->prepare());
$co->proceed();
$this->assertTrue($DB->record_exists('course', array('shortname' => 'c2')));
// Add a new course with non-default course format option.
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
$data = array('shortname' => 'c3', 'fullname' => 'C3', 'summary' => 'New c3', 'category' => 1,
'format' => 'weeks', 'coursedisplay' => 1);
$co = new tool_uploadcourse_course($mode, $updatemode, $data);
$this->assertTrue($co->prepare());
$co->proceed();
$course = $DB->get_record('course', array('shortname' => 'c3'), '*', MUST_EXIST);
$this->assertEquals(1, course_get_format($course)->get_course()->coursedisplay);
}
public function test_create_with_sections() {
@ -260,6 +271,16 @@ class tool_uploadcourse_course_testcase extends advanced_testcase {
$this->assertTrue($co->prepare());
$co->proceed();
$this->assertEquals('Use this summary', $DB->get_field_select('course', 'summary', 'shortname = :s', array('s' => 'c1')));
// Update course format option.
$mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
$updatemode = tool_uploadcourse_processor::UPDATE_ALL_WITH_DATA_ONLY;
$data = array('shortname' => 'c1', 'coursedisplay' => 1);
$co = new tool_uploadcourse_course($mode, $updatemode, $data);
$this->assertTrue($co->prepare());
$co->proceed();
$course = $DB->get_record('course', array('shortname' => 'c1'), '*', MUST_EXIST);
$this->assertEquals(1, course_get_format($course)->get_course()->coursedisplay);
}
public function test_data_saved() {

@ -735,6 +735,43 @@ abstract class format_base {
return array();
}
/**
* Prepares values of course or section format options before storing them in DB
*
* If an option has invalid value it is not returned
*
* @param array $rawdata associative array of the proposed course/section format options
* @param int|null $sectionid null if it is course format option
* @return array array of options that have valid values
*/
protected function validate_format_options(array $rawdata, int $sectionid = null) : array {
if (!$sectionid) {
$allformatoptions = $this->course_format_options(true);
} else {
$allformatoptions = $this->section_format_options(true);
}
$data = array_intersect_key($rawdata, $allformatoptions);
foreach ($data as $key => $value) {
$option = $allformatoptions[$key] + ['type' => PARAM_RAW, 'element_type' => null, 'element_attributes' => [[]]];
$data[$key] = clean_param($value, $option['type']);
if ($option['element_type'] === 'select' && !array_key_exists($data[$key], $option['element_attributes'][0])) {
// Value invalid for select element, skip.
unset($data[$key]);
}
}
return $data;
}
/**
* Validates format options for the course
*
* @param array $data data to insert/update
* @return array array of options that have valid values
*/
public function validate_course_format_options(array $data) : array {
return $this->validate_format_options($data);
}
/**
* Updates format options for a course or section
*
@ -747,6 +784,7 @@ abstract class format_base {
*/
protected function update_format_options($data, $sectionid = null) {
global $DB;
$data = $this->validate_format_options((array)$data, $sectionid);
if (!$sectionid) {
$allformatoptions = $this->course_format_options();
$sectionid = 0;
@ -772,7 +810,6 @@ abstract class format_base {
'sectionid' => $sectionid
), '', 'name,id,value');
$changed = $needrebuild = false;
$data = (array)$data;
foreach ($defaultoptions as $key => $value) {
if (isset($records[$key])) {
if (array_key_exists($key, $data) && $records[$key]->value !== $data[$key]) {

@ -2,6 +2,13 @@ This files describes API changes for course formats
Overview of this plugin type at http://docs.moodle.org/dev/Course_formats
=== 3.6 ===
* New method validate_format_options() cleans the values of the course/section format options before inserting them
in the database. Course format options can now be set in tool_uploadcourse and validation of user-submitted data is important.
Note that validate_format_options() is now always called when somebody creates or edits course or section and also
during restore and course upload. Default implementation validates against the definition of the form elements for
format options.
=== 3.5 ===
* Course formats should overwrite get_config_for_external function to return the course format settings viewable by the
current user.