From 602433133e41731de4d48de479a1022b2deb1b3c Mon Sep 17 00:00:00 2001 From: skodak Date: Thu, 2 Aug 2007 10:38:18 +0000 Subject: [PATCH] MDL-10105 idnumber uniqueness tested before insert in UI now - both modedit and item edit pages --- course/modedit.php | 9 +++++++ course/moodleform_mod.php | 26 ++++++++++++++++++++ grade/edit/tree/item_form.php | 19 ++++++++++++++- grade/edit/tree/outcomeitem_form.php | 11 +++++++++ lang/en_utf8/moodle.php | 1 + lib/gradelib.php | 36 ++++++++++++++++++++++++++++ mod/choice/mod_form.php | 27 ++++++++++++++------- mod/lesson/mod_form.php | 11 +++++++-- mod/quiz/mod_form.php | 13 ++++++++-- mod/scorm/mod_form.php | 13 ++++++++-- 10 files changed, 151 insertions(+), 15 deletions(-) diff --git a/course/modedit.php b/course/modedit.php index 88b114ec671..6ffdd922285 100644 --- a/course/modedit.php +++ b/course/modedit.php @@ -294,6 +294,15 @@ error("Data submitted is invalid."); } + //sync idnumber with grade_item + if ($grade_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename, + 'iteminstance'=>$fromform->instance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) { + if ($grade_item->idnumber != $fromform->idnumber) { + $grade_item->idnumber = $fromform->idnumber; + $grade_item->update(); + } + } + // add outcomes if requested if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) { foreach($outcomes as $outcome) { diff --git a/course/moodleform_mod.php b/course/moodleform_mod.php index 7304549c60b..82937aec652 100644 --- a/course/moodleform_mod.php +++ b/course/moodleform_mod.php @@ -66,6 +66,32 @@ class moodleform_mod extends moodleform { } } + // form verification + function validation($data) { + global $COURSE; + + $errors = array(); + + $grade_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$data['modulename'], + 'iteminstance'=>$data['instance'], 'itemnumber'=>0, 'courseid'=>$COURSE->id)); + if ($data['coursemodule']) { + $cm = get_record('course_modules', 'id', $data['coursemodule']); + } else { + $cm = null; + } + + // verify the idnumber + if (!grade_verify_idnumber($data['cmidnumber'], $grade_item, $cm)) { + $errors['cmidnumber'] = get_string('idnumbertaken'); + } + + if (count($errors) == 0) { + return true; + } else { + return $errors; + } + } + /** * Load in existing data as form defaults. Usually new entry defaults are stored directly in * form definition (new entry form); this function is used to load in data where values diff --git a/grade/edit/tree/item_form.php b/grade/edit/tree/item_form.php index 9f4e04709a2..7c45f022b4d 100644 --- a/grade/edit/tree/item_form.php +++ b/grade/edit/tree/item_form.php @@ -171,7 +171,24 @@ class edit_item_form extends moodleform { /// perform extra validation before submission function validation($data){ - $errors= array(); + $errors = array(); + + if (array_key_exists('idnumber', $data)) { + if ($data['id']) { + $grade_item = new grade_item(array('id'=>$data['id'], 'courseid'=>$data['courseid'])); + if ($grade_item->itemtype == 'mod') { + $cm = get_coursemodule_from_instance($grade_item->itemmodule, $grade_item->iteminstance, $grade_item->courseid); + } else { + $cm = null; + } + } else { + $grade_item = null; + $cm = null; + } + if (!grade_verify_idnumber($data['idnumber'], $grade_item, $cm)) { + $errors['idnumber'] = get_string('idnumbertaken'); + } + } if (array_key_exists('calculation', $data) and $data['calculation'] != '') { $grade_item = new grade_item(array('id'=>$data['id'], 'itemtype'=>$data['itemtype'], 'courseid'=>$data['courseid'])); diff --git a/grade/edit/tree/outcomeitem_form.php b/grade/edit/tree/outcomeitem_form.php index 49e70ed7066..2f16173afae 100644 --- a/grade/edit/tree/outcomeitem_form.php +++ b/grade/edit/tree/outcomeitem_form.php @@ -104,6 +104,17 @@ class edit_outcomeitem_form extends moodleform { function validation($data){ $errors= array(); + if (array_key_exists('idnumber', $data)) { + if ($data['id']) { + $grade_item = new grade_item(array('id'=>$data['id'], 'courseid'=>$data['courseid'])); + } else { + $grade_item = null; + } + if (!grade_verify_idnumber($data['idnumber'], $grade_item, null)) { + $errors['idnumber'] = get_string('idnumbertaken'); + } + } + if (0 == count($errors)){ return true; } else { diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php index f0fb257fd01..bc9026a3fb2 100644 --- a/lang/en_utf8/moodle.php +++ b/lang/en_utf8/moodle.php @@ -752,6 +752,7 @@ $string['htmlformat'] = 'Pretty HTML format'; $string['icqnumber'] = 'ICQ number'; $string['idnumber'] = 'ID number'; $string['idnumbercourse'] = 'Course ID number'; +$string['idnumbertaken'] = 'This ID number is already taken'; $string['imagealt'] = 'Picture description'; $string['import'] = 'Import'; $string['importactivities'] = 'Import activities from another course'; diff --git a/lib/gradelib.php b/lib/gradelib.php index 1b9783adf2b..72f6d0d91db 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -360,6 +360,42 @@ function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $item /***** END OF PUBLIC API *****/ + +/** + * Verify nwe value of idnumber - checks for uniqueness of new idnubmers, old are kept intact + * @param string idnumber string (with magic quotes) + * @param object $cm used for course module idnumbers and items attached to modules + * @param object $gradeitem is item idnumber + * @return boolean true means idnumber ok + */ +function grade_verify_idnumber($idnumber, $grade_item=null, $cm=null) { + if ($idnumber == '') { + //we allow empty idnumbers + return true; + } + + // keep existing even when not unique + if ($cm and $cm->idnumber == $idnumber) { + return true; + } else if ($grade_item and $grade_item->idnumber == $idnumber) { + return true; + } + + if (get_records('course_modules', 'idnumber', $idnumber)) { + return false; + } + + if (get_records('grade_items', 'idnumber', $idnumber)) { + return false; + } + + return true; +} + +/** + * Force final grade recalculation in all course items + * @param int $courseid + */ function grade_force_full_regrading($courseid) { set_field('grade_items', 'needsupdate', 1, 'courseid', $courseid); } diff --git a/mod/choice/mod_form.php b/mod/choice/mod_form.php index 0760054af86..f7adbd9653e 100644 --- a/mod/choice/mod_form.php +++ b/mod/choice/mod_form.php @@ -115,20 +115,31 @@ class mod_choice_mod_form extends moodleform_mod { } function validation($data){ - $choices=0; + $errors = parent::validation($data); + if ($errors === true) { + $errors = array(); + } + + $choices = 0; foreach ($data['option'] as $option){ - if (trim($option)!=''){ + if (trim($option) != ''){ $choices++; } } - if ($choices>1){ - return true; - } elseif ($choices==0) { - return array('option[0]'=>get_string('fillinatleastoneoption', 'choice')); - } else { - return array('option[1]'=>get_string('fillinatleastoneoption', 'choice')); + + if ($choices < 1) { + $errors['option[0]'] = get_string('fillinatleastoneoption', 'choice'); } + if ($choices < 2) { + $errors['option[1]'] = get_string('fillinatleastoneoption', 'choice'); + } + + if (count($errors) == 0) { + return true; + } else { + return $errors; + } } diff --git a/mod/lesson/mod_form.php b/mod/lesson/mod_form.php index a0f677694d7..9ddeab79ca2 100644 --- a/mod/lesson/mod_form.php +++ b/mod/lesson/mod_form.php @@ -324,13 +324,20 @@ class mod_lesson_mod_form extends moodleform_mod { * @return array **/ function validation($data) { - $errors = array(); + $errors = parent::validation($data); + if ($errors === true) { + $errors = array(); + } if (empty($data['maxtime']) and !empty($data['timed'])) { $errors['timedgrp'] = get_string('err_numeric', 'form'); } - return $errors; + if (count($errors) == 0) { + return true; + } else { + return $errors; + } } } ?> diff --git a/mod/quiz/mod_form.php b/mod/quiz/mod_form.php index c34deb476ba..b197e37462b 100644 --- a/mod/quiz/mod_form.php +++ b/mod/quiz/mod_form.php @@ -304,7 +304,11 @@ class mod_quiz_mod_form extends moodleform_mod { } function validation($data){ - $errors = array(); + $errors = parent::validation($data); + if ($errors === true) { + $errors = array(); + } + // Check open and close times are consistent. if ($data['timeopen'] != 0 && $data['timeclose'] != 0 && $data['timeclose'] < $data['timeopen']) { $errors['timeclose'] = get_string('closebeforeopen', 'quiz'); @@ -344,7 +348,12 @@ class mod_quiz_mod_form extends moodleform_mod { $errors["feedbacktext[$i]"] = get_string('feedbackerrorjunkinfeedback', 'quiz', $i + 1); } } - return $errors; + + if (count($errors) == 0) { + return true; + } else { + return $errors; + } } } diff --git a/mod/scorm/mod_form.php b/mod/scorm/mod_form.php index 6f2dc98e637..95bc3a4a856 100644 --- a/mod/scorm/mod_form.php +++ b/mod/scorm/mod_form.php @@ -232,12 +232,21 @@ class mod_scorm_mod_form extends moodleform_mod { } function validation($data) { + $errors = parent::validation($data); + if ($errors === true) { + $errors = array(); + } + $validate = scorm_validate($data); - if ($validate->result) { + if (!$validate->result) { + $errors = $errors + $validate->errors; + } + + if (count($errors) == 0) { return true; } else { - return $validate->errors; + return $errors; } }