示例#1
0
 protected function define_structure()
 {
     global $CFG, $DB;
     // are we including user info?
     $userinfo = $this->get_setting_value('users');
     $gradebook = new backup_nested_element('gradebook');
     //grade_letters are done in backup_activity_grades_structure_step()
     //calculated grade items
     $grade_items = new backup_nested_element('grade_items');
     $grade_item = new backup_nested_element('grade_item', array('id'), array('categoryid', 'itemname', 'itemtype', 'itemmodule', 'iteminstance', 'itemnumber', 'iteminfo', 'idnumber', 'calculation', 'gradetype', 'grademax', 'grademin', 'scaleid', 'outcomeid', 'gradepass', 'multfactor', 'plusfactor', 'aggregationcoef', 'aggregationcoef2', 'weightoverride', 'sortorder', 'display', 'decimals', 'hidden', 'locked', 'locktime', 'needsupdate', 'timecreated', 'timemodified'));
     $grade_grades = new backup_nested_element('grade_grades');
     $grade_grade = new backup_nested_element('grade_grade', array('id'), array('userid', 'rawgrade', 'rawgrademax', 'rawgrademin', 'rawscaleid', 'usermodified', 'finalgrade', 'hidden', 'locked', 'locktime', 'exported', 'overridden', 'excluded', 'feedback', 'feedbackformat', 'information', 'informationformat', 'timecreated', 'timemodified', 'aggregationstatus', 'aggregationweight'));
     //grade_categories
     $grade_categories = new backup_nested_element('grade_categories');
     $grade_category = new backup_nested_element('grade_category', array('id'), array('parent', 'depth', 'path', 'fullname', 'aggregation', 'keephigh', 'droplow', 'aggregateonlygraded', 'aggregateoutcomes', 'timecreated', 'timemodified', 'hidden'));
     $letters = new backup_nested_element('grade_letters');
     $letter = new backup_nested_element('grade_letter', 'id', array('lowerboundary', 'letter'));
     $grade_settings = new backup_nested_element('grade_settings');
     $grade_setting = new backup_nested_element('grade_setting', 'id', array('name', 'value'));
     // Build the tree
     $gradebook->add_child($grade_categories);
     $grade_categories->add_child($grade_category);
     $gradebook->add_child($grade_items);
     $grade_items->add_child($grade_item);
     $grade_item->add_child($grade_grades);
     $grade_grades->add_child($grade_grade);
     $gradebook->add_child($letters);
     $letters->add_child($letter);
     $gradebook->add_child($grade_settings);
     $grade_settings->add_child($grade_setting);
     // Add attribute with gradebook calculation freeze date if needed.
     $gradebookcalculationfreeze = get_config('core', 'gradebook_calculations_freeze_' . $this->get_courseid());
     if ($gradebookcalculationfreeze) {
         $gradebook->add_attributes(array('calculations_freeze'));
         $gradebook->get_attribute('calculations_freeze')->set_value($gradebookcalculationfreeze);
     }
     // Define sources
     //Include manual, category and the course grade item
     $grade_items_sql = "SELECT * FROM {grade_items}\n                           WHERE courseid = :courseid\n                           AND (itemtype='manual' OR itemtype='course' OR itemtype='category')";
     $grade_items_params = array('courseid' => backup::VAR_COURSEID);
     $grade_item->set_source_sql($grade_items_sql, $grade_items_params);
     if ($userinfo) {
         $grade_grade->set_source_table('grade_grades', array('itemid' => backup::VAR_PARENTID));
     }
     $grade_category_sql = "SELECT gc.*, gi.sortorder\n                               FROM {grade_categories} gc\n                               JOIN {grade_items} gi ON (gi.iteminstance = gc.id)\n                               WHERE gc.courseid = :courseid\n                               AND (gi.itemtype='course' OR gi.itemtype='category')\n                               ORDER BY gc.parent ASC";
     //need parent categories before their children
     $grade_category_params = array('courseid' => backup::VAR_COURSEID);
     $grade_category->set_source_sql($grade_category_sql, $grade_category_params);
     $letter->set_source_table('grade_letters', array('contextid' => backup::VAR_CONTEXTID));
     // Set the grade settings source, forcing the inclusion of minmaxtouse if not present.
     $settings = array();
     $rs = $DB->get_recordset('grade_settings', array('courseid' => $this->get_courseid()));
     foreach ($rs as $record) {
         $settings[$record->name] = $record;
     }
     $rs->close();
     if (!isset($settings['minmaxtouse'])) {
         $settings['minmaxtouse'] = (object) array('name' => 'minmaxtouse', 'value' => $CFG->grade_minmaxtouse);
     }
     $grade_setting->set_source_array($settings);
     // Annotations (both as final as far as they are going to be exported in next steps)
     $grade_item->annotate_ids('scalefinal', 'scaleid');
     // Straight as scalefinal because it's > 0
     $grade_item->annotate_ids('outcomefinal', 'outcomeid');
     //just in case there are any users not already annotated by the activities
     $grade_grade->annotate_ids('userfinal', 'userid');
     // Return the root element
     return $gradebook;
 }