/** * Process the data from a form submission. * * @param array $data * @return array of warnings */ public function process($data) { $warnings = array(); $fields = $this->definition(); // Avoiding execution timeouts when updating // a large amount of grades. $progress = 0; $progressbar = new \core\progress\display_if_slow(); $progressbar->start_html(); $progressbar->start_progress(get_string('savegrades', 'gradereport_singleview'), count((array) $data) - 1); $changecount = array(); foreach ($data as $varname => $throw) { $progressbar->progress($progress); $progress++; if (preg_match("/(\\w+)_(\\d+)_(\\d+)/", $varname, $matches)) { $itemid = $matches[2]; $userid = $matches[3]; } else { continue; } $gradeitem = grade_item::fetch(array('id' => $itemid, 'courseid' => $this->courseid)); if (preg_match('/^old[oe]{1}/', $varname)) { $elementname = preg_replace('/^old/', '', $varname); if (!isset($data->{$elementname})) { // Decrease the progress because we've increased the // size of the array we are iterating through. $progress--; $data->{$elementname} = false; } } if (!in_array($matches[1], $fields)) { continue; } if (!$gradeitem) { continue; } $grade = $this->fetch_grade_or_default($gradeitem, $userid); $classname = '\\gradereport_singleview\\local\\ui\\' . $matches[1]; $element = new $classname($grade); $name = $element->get_name(); $oldname = "old{$name}"; $posted = $data->{$name}; $format = $element->determine_format(); if ($format->is_textbox() and trim($data->{$name}) === '') { $data->{$name} = null; } // Same value; skip. if (isset($data->{$oldname}) && $data->{$oldname} == $posted) { continue; } $msg = $element->set($posted); // Optional type. if (!empty($msg)) { $warnings[] = $msg; } if (preg_match('/_(\\d+)_(\\d+)/', $varname, $matchelement)) { $changecount[$matchelement[0]] = 1; } } // Some post-processing. $eventdata = new stdClass(); $eventdata->warnings = $warnings; $eventdata->post_data = $data; $eventdata->instance = $this; $eventdata->changecount = $changecount; $progressbar->end_html(); return $eventdata; }