Data Item Functions
This page discussed the actual (sept 2006, moodle 1.7) functions used to create, modify or delete data items.
Calculated parameters i.e {x1} are generated using the dataset parameters ( min, max, distribution) or edited directly by the teacher in the 3rd step of calculated questions creation or modifications.
The code for doing this,is mostly in question/type/datasetdependent/datasetitems.php and in
question/type/questiontype/generate_dataset_item($options)
question/type/questiontype/comment_on_datasetitems($question, $data, $number)
and backup and restore functions
In question/type/datasetdependent/datasetitems.php // Handle adding and removing of dataset items
// This twisted condition should effectively stop resubmits caused by reloads
if (isset($form->addbutton) && $maxnumber + 1 == $form->numbertoadd) {
$addeditem->number = $form->numbertoadd;
foreach ($form->definition as $key => $defid) {
$addeditem->definition = $datasetdefs[$defid]->id;
$addeditem->value = $form->value[$key];
if ($form->itemid[$key]) {
// Reuse an previously used record
$addeditem->id = $form->itemid[$key];
if (!update_record('question_dataset_items', $addeditem)) {
error("Error: Unable to update dataset item");
}
} else {
unset($addeditem->id);
if (!insert_record('question_dataset_items', $addeditem)) {
error("Error: Unable to insert dataset item");
}
}
foreach ($datasetdefs as $key => $newdef) {
if (isset($newdef->id) && $newdef->itemcount <= $maxnumber) {
$newdef->itemcount = $maxnumber+1;
// Save the new value for options
update_record('question_dataset_definitions', $newdef);
}
}
}
// else Success:
$maxnumber = $addeditem->number;
} else if (isset($form->deletebutton)
&& $maxnumber == $form->numbertodelete) {
// Simply decrease itemcount where == $maxnumber
foreach ($datasetdefs as $datasetdef) {
if ($datasetdef->itemcount == $maxnumber) {
$datasetdef->itemcount--;
if (!update_record('question_dataset_definitions',
$datasetdef)) {
error("Error: Unable to update itemcount");
}
}
}
--$maxnumber;
}
make_upload_directory("$course->id"); // Just in case
$grosscoursefiles = get_directory_list("$CFG->dataroot/$course->id",
"$CFG->moddata");
// Generate a new dataset item (or reuse an old one)
foreach ($datasetdefs as $defid => $datasetdef) {
if (isset($datasetdef->id)) {
$datasetdefs[$defid]->items = get_records_sql( // Use number as key!!
" SELECT number, definition, id, value
FROM {$CFG->prefix}question_dataset_items
WHERE definition = $datasetdef->id ");
}
if (isset($datasetdefs[$defid]->items[$maxnumber + 1]) && (
empty($form->forceregeneration) &&
isset($form->regenerateddefid) &&
$form->regenerateddefid != $defid ||
isset($form->deletebutton))) {
// Reuse existing datasets
} else {
$datasetitem = new stdClass;
$datasetitem->id =
isset($datasetdefs[$defid]->items[$maxnumber + 1]->id)
? $datasetdefs[$defid]->items[$maxnumber + 1]->id : ;
$datasetitem->number = $maxnumber + 1;
if ($this->supports_dataset_item_generation()) {
if (!empty($form->addbutton) || // If we added an item
!isset($form->value) || // If we don't have a value
$form->regenerateddefid == $defid) { // If we explicitly ask for regeneration
$datasetitem->value =
$this->generate_dataset_item($datasetdef->options);
} else {
$definition = array_flip($form->definition);
$datasetitem->value = $form->value[$definition[$defid]];
}
} else {
$datasetitem->value = ;
}
$datasetdefs[$defid]->items[$maxnumber + 1] = clone($datasetitem);
}
}