You are here

function QuizQuestion::saveRelationships in Quiz 6.4

Same name and namespace in other branches
  1. 7.6 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
  2. 7 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
  3. 7.4 question_types/quiz_question/quiz_question.core.inc \QuizQuestion::saveRelationships()
  4. 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;
}