diff --git a/mod/assign/feedback/comments/locallib.php b/mod/assign/feedback/comments/locallib.php index 9ed302ccf83..5c51b004f49 100644 --- a/mod/assign/feedback/comments/locallib.php +++ b/mod/assign/feedback/comments/locallib.php @@ -94,7 +94,10 @@ class assign_feedback_comments extends assign_feedback_plugin { $commenttext = $feedbackcomments->commenttext; } } - return optional_param('quickgrade_comments_' . $userid, '', PARAM_TEXT) != $commenttext; + // Note that this handles the difference between empty and not in the quickgrading + // form at all (hidden column). + $newvalue = optional_param('quickgrade_comments_' . $userid, false, PARAM_TEXT); + return ($newvalue !== false) && ($newvalue != $commenttext); } @@ -173,6 +176,11 @@ class assign_feedback_comments extends assign_feedback_plugin { public function save_quickgrading_changes($userid, $grade) { global $DB; $feedbackcomment = $this->get_feedback_comments($grade->id); + $feedbackpresent = optional_param('quickgrade_comments_' . $userid, false, PARAM_TEXT) !== false; + if (!$feedbackpresent) { + // Nothing to save (e.g. hidden column). + return true; + } if ($feedbackcomment) { $feedbackcomment->commenttext = optional_param('quickgrade_comments_' . $userid, '', PARAM_TEXT); return $DB->update_record('assignfeedback_comments', $feedbackcomment); diff --git a/mod/assign/gradingtable.php b/mod/assign/gradingtable.php index 57df5a04c86..08a1de15863 100644 --- a/mod/assign/gradingtable.php +++ b/mod/assign/gradingtable.php @@ -605,6 +605,9 @@ class assign_grading_table extends table_sql implements renderable { id="selectuser_' . $row->userid . '" name="selectedusers" value="' . $row->userid . '"/>'; + $selectcol .= ''; return $selectcol; } diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index cceb2d415b7..bf2d4d85bba 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -1181,12 +1181,8 @@ class assign { maxlength="10" class="quickgrade"/>'; $o .= ' / ' . format_float($this->get_instance()->grade, 2); - $o .= ''; return $o; } else { - $o .= ''; if ($grade == -1 || $grade === null) { $o .= '-'; } else { @@ -1225,9 +1221,6 @@ class assign { $o .= ''; } $o .= ''; - $o .= ''; return $o; } else { $scaleid = (int)$grade; @@ -4489,6 +4482,8 @@ class assign { foreach ($currentgrades as $current) { $modified = $users[(int)$current->userid]; $grade = $this->get_user_grade($modified->userid, false); + // Check to see if the grade column was even visible. + $gradecolpresent = optional_param('quickgrade_' . $modified->userid, false, PARAM_INT) !== false; // Check to see if the outcomes were modified. if ($CFG->enableoutcomes) { @@ -4496,7 +4491,9 @@ class assign { $oldoutcome = $outcome->grades[$modified->userid]->grade; $paramname = 'outcome_' . $outcomeid . '_' . $modified->userid; $newoutcome = optional_param($paramname, -1, PARAM_FLOAT); - if ($oldoutcome != $newoutcome) { + // Check to see if the outcome column was even visible. + $outcomecolpresent = optional_param($paramname, false, PARAM_FLOAT) !== false; + if ($outcomecolpresent && ($oldoutcome != $newoutcome)) { // Can't check modified time for outcomes because it is not reported. $modifiedusers[$modified->userid] = $modified; continue; @@ -4507,6 +4504,8 @@ class assign { // Let plugins participate. foreach ($this->feedbackplugins as $plugin) { if ($plugin->is_visible() && $plugin->is_enabled() && $plugin->supports_quickgrading()) { + // The plugins must handle is_quickgrading_modified correctly - ie + // handle hidden columns. if ($plugin->is_quickgrading_modified($modified->userid, $grade)) { if ((int)$current->lastmodified > (int)$modified->lastmodified) { return get_string('errorrecordmodified', 'assign'); @@ -4527,7 +4526,8 @@ class assign { if ($current->grade !== null) { $current->grade = floatval($current->grade); } - if ($current->grade !== $modified->grade) { + $gradechanged = $gradecolpresent && $current->grade !== $modified->grade; + if ($gradechanged) { // Grade changed. if ($this->grading_disabled($modified->userid)) { continue; @@ -4551,6 +4551,7 @@ class assign { $grade = $this->get_user_grade($userid, true); $grade->grade= grade_floatval(unformat_float($modified->grade)); $grade->grader= $USER->id; + $gradecolpresent = optional_param('quickgrade_' . $userid, false, PARAM_INT) !== false; // Save plugins data. foreach ($this->feedbackplugins as $plugin) { @@ -4573,8 +4574,10 @@ class assign { foreach ($modified->gradinginfo->outcomes as $outcomeid => $outcome) { $oldoutcome = $outcome->grades[$modified->userid]->grade; $paramname = 'outcome_' . $outcomeid . '_' . $modified->userid; - $newoutcome = optional_param($paramname, -1, PARAM_INT); - if ($oldoutcome != $newoutcome) { + // This will be false if the input was not in the quickgrading + // form (e.g. column hidden). + $newoutcome = optional_param($paramname, false, PARAM_INT); + if ($newoutcome !== false && ($oldoutcome != $newoutcome)) { $data[$outcomeid] = $newoutcome; } }