function QuizQuestion::saveRelationships in Quiz 6.4
Same name and namespace in other branches
- 7.6 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
- 7 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
- 7.4 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
- 7.5 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
Handle the add to quiz part of the quiz_question_form
Return value
TRUE if at least one of the questions were kept. FALSE otherwise
1 call to QuizQuestion::saveRelationships()
- QuizQuestion::save in question_types/
quiz_question/ quiz_question.core.inc - Responsible for handling insert/update of question-specific data. This is typically called from within the Node API, so there is no need to save the node.
File
- question_types/
quiz_question/ quiz_question.core.inc, line 483 - Classes used in the Quiz Question module.
Class
- QuizQuestion
- A base implementation of a quiz_question, adding a layer of abstraction between the node API, quiz API and the question types.
Code
function saveRelationships() {
$quizzes_kept = FALSE;
unset($_SESSION['quiz_question_kept']);
/*
* If the question already is part of quizzes we might have to remove some
* relationships
*/
$quizzes_to_update = array();
if (isset($this->node->add_directly['already']) && is_array($this->node->add_directly['already'])) {
foreach ($this->node->add_directly['already'] as $key => $checked) {
if ($checked == 0) {
$nid_vid = explode('-', $key);
$dummy_node = new stdClass();
$dummy_node->nid = $nid_vid[0];
$dummy_node->vid = $nid_vid[1];
if (quiz_has_been_answered($dummy_node)) {
// We need to revise the quiz node if it has been answered
$temp_quiz_node = node_load($dummy_node->nid, $dummy_node->vid);
$temp_quiz_node->revision = 1;
$temp_quiz_node->auto_created = TRUE;
node_save($temp_quiz_node);
$nid_vid[1] = $temp_quiz_node->vid;
drupal_set_message(t('New revision has been created for the @quiz %n', array(
'%n' => $temp_quiz_node->title,
'@quiz' => QUIZ_NAME,
)));
}
$quizzes_to_update[] = $nid_vid[1];
$sql = 'DELETE FROM {quiz_node_relationship}
WHERE parent_nid = %d AND parent_vid = %d AND child_nid = %d AND child_vid = %d';
db_query($sql, $nid_vid[0], $nid_vid[1], $this->node->nid, $this->node->vid);
}
else {
$quizzes_kept = TRUE;
$_SESSION['quiz_question_kept'][] = $key;
}
}
}
/*
* The quiz question might have been added to new quizzes
*/
if (is_array($this->node->add_directly['latest'])) {
$to_insert = 'VALUES';
$insert_values = array();
foreach ($this->node->add_directly['latest'] as $nid => $checked) {
if ($checked != 0) {
$nid_vid = explode('-', $checked);
$dummy_node = new stdClass();
$dummy_node->nid = $nid_vid[0];
$dummy_node->vid = $nid_vid[1];
if (quiz_has_been_answered($dummy_node)) {
$temp_quiz_node = node_load($dummy_node->nid, $dummy_node->vid);
$temp_quiz_node->revision = 1;
$temp_quiz_node->auto_created = TRUE;
node_save($temp_quiz_node);
$nid_vid[1] = $temp_quiz_node->vid;
drupal_set_message(t('New revision has been created for the @quiz %n', array(
'%n' => $temp_quiz_node->title,
'@quiz' => QUIZ_NAME,
)));
}
$quizzes_to_update[] = $nid_vid[1];
// We build one sql query to insert multiple rows into the relationship table
if (count($insert_values) > 0) {
$to_insert .= ',';
}
$to_insert .= ' (%d, %d, %d, %d, %d, %d, %d)';
$insert_values[] = $nid_vid[0];
$insert_values[] = $nid_vid[1];
$insert_values[] = $this->node->nid;
$insert_values[] = $this->node->vid;
$insert_values[] = $this
->getMaximumScore();
$insert_values[] = 1 + db_result(db_query('
SELECT MAX(weight)
FROM {quiz_node_relationship}
WHERE parent_vid = %d
', $nid_vid[1]));
$randomization = db_result(db_query('
SELECT randomization
FROM {quiz_node_properties}
WHERE nid = %d AND vid = %d
', $nid_vid[0], $nid_vid[1]));
$insert_values[] = $randomization == 2 ? QUESTION_RANDOM : QUESTION_ALWAYS;
// We also delete multiple rows from the table...
$delete_values[] = $nid_vid[1];
$delete_values[] = $this->node->nid;
$delete_sqls[] = '(parent_vid = %d AND child_nid = %d)';
}
}
if (count($insert_values) > 0) {
$sql = 'DELETE FROM {quiz_node_relationship}
WHERE ' . implode(' OR ', $delete_sqls);
db_query($sql, $delete_values);
$sql = 'INSERT INTO {quiz_node_relationship}
(parent_nid, parent_vid, child_nid, child_vid, max_score, weight, question_status)
' . $to_insert;
db_query($sql, $insert_values);
}
}
if (drupal_strlen($this->node->add_directly['new']) > 0) {
$new_node = quiz_make_new($this->node->add_directly['new']);
$sql = 'INSERT INTO {quiz_node_relationship}
(parent_nid, parent_vid, child_nid, child_vid, max_score)
VALUES (%d, %d, %d, %d, %d)';
db_query($sql, $new_node->nid, $new_node->vid, $this->node->nid, $this->node->vid, $this
->getMaximumScore());
$quizzes_to_update[] = $new_node->vid;
}
quiz_update_max_score_properties($quizzes_to_update);
return $quizzes_kept;
}