Third & GroveThird & Grove
May 8, 2015 - Josh Fremer

Creating Drupal Quiz Nodes Programmatically

The Drupal Quiz Module is a great option for implementing quizzes, tests and assessments of all stripes. Unfortunately the huge array of features keeps the developers pretty busy and the documentation can be a little sparse.

Here's a simple example of creating a question and attaching it to a quiz.

In the Drupal Quiz module, quizzes and questions are both node types (at least currently). Creating them is just like creating any other node programmatically, with a couple extra steps.

 

First, build a quiz node:

 

global $user;
 
$quiz = new stdClass();
$quiz->title = 'Loyalty Test';
$quiz->type = 'quiz';
$quiz->language = LANGUAGE_NONE;
$quiz->uid = $user->uid; 
$quiz->status = 1;
 
node_object_prepare($quiz);
$quiz = node_submit($quiz);
node_save($quiz);

 

Next, create a question node. We'll use question type "multichoice" but there are many others to choose from; each will differ slightly from what is shown below.

 

$question = new stdClass();
$question->title = 'User is a fan';
$question->uid = $user->uid; 
$question->type = 'multichoice';
$question->language = LANGUAGE_NONE;
$question->status = 1;
$question->body = array(LANGUAGE_NONE => array(array('value' => 'Do you totally love this website or what?')));
// These are some of the quiz options.
$question->choice_multi = 0;
$question->choice_random = 0;
$question->choice_boolean = 0;
// Possible answers go in the "alternatives" array.
$question->alternatives = array(
  array(
    'answer' => array(
      'value' => 'Yes',
    ),
    // All these values are necessary to avoid integrity constraint errors.
    'answer_format' => 'plain_text',
    'feedback_if_chosen_format' => 'plain_text',
    'feedback_if_not_chosen_format' => 'plain_text',
    'score_if_chosen' => 1,
  ),
  array(
    'answer' => array(
      'value' => 'No',
    ),
    'answer_format' => 'plain_text',
    'feedback_if_chosen_format' => 'plain_text',
    'feedback_if_not_chosen_format' => 'plain_text',
    'score_if_chosen' => 0,
  ),
);
 
node_object_prepare($question);
$question = node_submit($question);
node_save($question);

 

Now we have our quiz and question nodes; all that's left is to relate them.

 

module_load_include('inc', 'multichoice', 'multichoice.classes');
$question_wrapper = new MultichoiceQuestion($question);
$question_wrapper->saveRelationships($quiz->nid, $quiz->vid);
// Lastly we update the scoring data for the quiz node.
quiz_update_max_score_properties(array($quiz->vid));