diff --git a/grade/edit/tree/calculation.php b/grade/edit/tree/calculation.php
index 3583370e2e3..5ba030b050d 100644
--- a/grade/edit/tree/calculation.php
+++ b/grade/edit/tree/calculation.php
@@ -5,8 +5,10 @@ require_once $CFG->dirroot.'/grade/lib.php';
require_once $CFG->libdir.'/mathslib.php';
require_once 'calculation_form.php';
-$courseid = required_param('courseid', PARAM_INT);
-$id = required_param('id', PARAM_INT);
+$courseid = required_param('courseid', PARAM_INT);
+$id = required_param('id', PARAM_INT);
+$section = optional_param('section', 'calculation', PARAM_ALPHA);
+$idnumbers = optional_param('idnumbers', null, PARAM_RAW);
if (!$course = get_record('course', 'id', $courseid)) {
print_error('nocourseid');
@@ -27,10 +29,10 @@ if (!$grade_item = grade_item::fetch(array('id'=>$id, 'courseid'=>$course->id)))
// module items and items without grade can not have calculation
if (($grade_item->is_normal_item() and !$grade_item->is_outcome_item())
or ($grade_item->gradetype != GRADE_TYPE_VALUE and $grade_item->gradetype != GRADE_TYPE_SCALE)) {
- redirect($returnurl, get_string('erornocalculationallowed', 'grades')); //TODO: localize
+ redirect($returnurl, get_string('errornocalculationallowed', 'grades')); //TODO: localize
}
-$mform = new edit_calculation_form(null, array('gpr'=>$gpr));
+$mform = new edit_calculation_form(null, array('gpr'=>$gpr, 'itemid' => $grade_item->id));
if ($mform->is_cancelled()) {
redirect($returnurl);
@@ -41,12 +43,41 @@ $calculation = calc_formula::localize($grade_item->calculation);
$calculation = grade_item::denormalize_formula($calculation, $grade_item->courseid);
$mform->set_data(array('courseid'=>$grade_item->courseid, 'calculation'=>$calculation, 'id'=>$grade_item->id, 'itemname'=>$grade_item->itemname));
+$errors = array();
+
if ($data = $mform->get_data(false)) {
$calculation = calc_formula::unlocalize($data->calculation);
$grade_item->set_calculation($calculation);
+
redirect($returnurl);
+
+} elseif (!empty($section) AND $section='idnumbers' AND !empty($idnumbers)) { // Handle idnumbers separately (non-mform)
+ //first validate and store the new idnumbers
+ foreach ($idnumbers as $giid => $value) {
+ if ($gi = grade_item::fetch(array('id' => $giid))) {
+ if ($gi->itemtype == 'mod') {
+ $cm = get_coursemodule_from_instance($gi->itemmodule, $gi->iteminstance, $gi->courseid);
+ } else {
+ $cm = null;
+ }
+
+ if (!grade_verify_idnumber($value, $gi, $cm)) {
+ $errors[$giid] = get_string('idnumbertaken');
+ continue;
+ }
+
+ if (empty($gi->idnumber) and !$gi->add_idnumber(stripslashes($idnumbers[$gi->id]))) {
+ $errors[$giid] = get_string('error');
+ continue;
+ }
+ } else {
+ $errors[$giid] = 'Could not fetch the grade_item with id=' . $giid;
+ }
+ }
}
+$gtree = new grade_tree($course->id, false, false);
+
$strgrades = get_string('grades');
$strgraderreport = get_string('graderreport', 'grades');
$strcalculationedit = get_string('editcalculation', 'grades');
@@ -56,5 +87,129 @@ $navigation = grade_build_nav(__FILE__, $strcalculationedit, array('courseid' =>
print_header_simple($strgrades . ': ' . $strgraderreport, ': ' . $strcalculationedit, $navigation, '', '', true, '', navmenu($course));
$mform->display();
+// Now show the gradetree with the idnumbers add/edit form
+echo '
+
';
print_footer($course);
+die();
+
+
+/**
+ * Simplified version of the print_grade_tree() recursive function found in grade/edit/tree/index.php
+ * Only prints a tree with a basic icon for each element, and an edit field for
+ * items without an idnumber.
+ * @param object $gtree
+ * @param object $element
+ * @param int $current_itemid The itemid of this page: should be excluded from the tree
+ * @param array $errors An array of idnumbers => error
+ * @return string
+ */
+function get_grade_tree(&$gtree, $element, $current_itemid=null, $errors=null) {
+ global $CFG;
+
+ $object = $element['object'];
+ $eid = $element['eid'];
+ $type = $element['type'];
+ $grade_item = $object->get_grade_item();
+
+ $name = $object->get_name();
+ $return_string = '';
+
+ //TODO: improve outcome visualisation
+ if ($type == 'item' and !empty($object->outcomeid)) {
+ $name = $name.' ('.get_string('outcome', 'grades').')';
+ }
+
+ $idnumber = $object->get_idnumber();
+
+ // Don't show idnumber or input field for current item if given to function. Highlight the item instead.
+ if ($type != 'category') {
+ if (is_null($current_itemid) OR $grade_item->id != $current_itemid) {
+ if ($idnumber) {
+ $name .= ": [[$idnumber]]";
+ } else {
+ $closingdiv = '';
+ if (!empty($errors[$grade_item->id])) {
+ $name .= '