コード例 #1
0
ファイル: screen.php プロジェクト: alanaipe2015/moodle
 /**
  * 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;
 }