protected function add_interaction(ImsQtiWriter $body, $question)
 {
     $question_count = 0;
     foreach ($question->options->subquestions as $subquestion) {
         if (!empty($subquestion->questiontext)) {
             $question_count++;
         }
     }
     $result = $body->add_matchInteraction(ImsQtiWriter::RESPONSE, $question_count, $question->options->shuffleanswers);
     $questions = $result->add_simpleMatchSet();
     $answers = $result->add_simpleMatchSet();
     $question_score = $question->defaultgrade / $question_count;
     $count = 0;
     foreach ($question->options->subquestions as $subquestion) {
         ++$count;
         $question_id = 'Q_' . $count;
         $answer_id = 'A_' . $count;
         if ($has_question = !empty($subquestion->questiontext)) {
             $questions->add_simpleAssociableChoice($question_id, false, array(), 1)->add_flow($subquestion->questiontext);
         }
         if ($has_answer = !empty($subquestion->answertext)) {
             $answers->add_simpleAssociableChoice($answer_id, false, array(), 1)->add_flow($subquestion->answertext);
         }
         if ($has_question && $has_answer) {
             $key = "{$question_id} {$answer_id}";
             $this->mapping->add_mapEntry($key, $question_score);
             $this->correct_response->add_value($key);
         }
     }
     return $result;
 }
 protected function add_questions(ImsQtiWriter $writer, $quizz, $questions)
 {
     foreach ($questions as $path => $question) {
         $filename = basename($path);
         $ref = $writer->add_assessmentItemRef('ID_' . $question->id, $filename, '', $required = true);
         $weight = $this->get_grade($quizz->id, $question->id);
         $ref->add_weight(null, $weight);
     }
 }
 protected function add_interaction(ImsQtiWriter $body, $question)
 {
     $result = $body->add_choiceInteraction();
     foreach ($question->options->answers as $answer) {
         $identifier = $answer->answer;
         $choice = $result->add_simpleChoice($identifier);
         $choice->add_flow($answer->answer);
     }
     return $result;
 }
 protected function add_body(ImsQtiWriter $item, $question)
 {
     $result = $item->add_itemBody();
     $text = $this->translate_question_text($question->questiontext, $question->questiontextformat, $question);
     foreach ($question->options->questions as $index => $subquestion) {
         $subquestion_id = "{#{$index}}";
         $subquestion_xml = $this->get_subquestion_xml($subquestion);
         $text = str_replace($subquestion_id, $subquestion_xml, $text);
     }
     $result->add_xml($text);
     return $result;
 }
 protected function add_answer_feedback_processing(ImsQtiWriter $response_processing, $question)
 {
     $result = $response_processing->add_responseCondition();
     $response_id = ImsQtiWriter::RESPONSE;
     $outcome_id = ImsQtiWriter::FEEDBACK;
     $if = $result->add_responseIf();
     $if->add_isNull()->add_variable($response_id);
     $if->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, 'FEEDBACK_ID_ELSE');
     $count = 0;
     foreach ($question->options->answers as $answer) {
         $id = 'FEEDBACK_ID_' . ++$count;
         $formula_serializer = new CalculatedFormulaSerializer();
         if ($formula = $formula_serializer->parse($answer->answer)) {
             //tolerance mode geometric not supported by QTI
             $tolerance_mode = $answer->tolerancetype == 1 ? ImsQtiWriter::TOLERANCE_MODE_RELATIVE : ImsQtiWriter::TOLERANCE_MODE_ABSOLUTE;
             $elseif = $result->add_responseElseIf();
             $equal = $elseif->add_equal($tolerance_mode, $answer->tolerance, $answer->tolerance);
             $equal->add_flow($formula);
             $product = $equal->add_product();
             $product->add_variable($response_id);
             $product->add_variable(self::UNIT_MULTIPLIER);
             $elseif->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, $id);
         }
     }
     $else = $result->add_responseElse();
     $else->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, 'FEEDBACK_ID_ELSE');
     return $result;
 }
 /**
  * Serialize additional information not or not well supported by QTI.
  * Used for reimport.
  */
 protected function add_question_data(ImsQtiWriter $item, $question)
 {
     $id = self::MOODLE_QUESTION_DATA;
     $value = 'true';
     $q = clone $question;
     $q = $this->get_question_data($q);
     $text = serialize($q);
     $result = $item->add_modalFeedback($id, $value, 'show')->add_text($text);
     return $result;
 }
 protected function add_interaction(ImsQtiWriter $body, $question)
 {
     return $body->add_extendedTextInteraction();
 }
 protected function add_overall_feedback(ImsQtiWriter $item, $question)
 {
     if (!isset($question->options) || !isset($question->options->incorrectfeedback)) {
         return false;
     }
     $text = $this->translate_feedback_text($question->options->incorrectfeedback, self::FORMAT_HTML, $question);
     $item->add_modalFeedback(self::OVERALL_FEEDBACK, self::FEEDBACK_INCORRECT, 'show')->add_flow($text);
     $text = $this->translate_feedback_text($question->options->correctfeedback, self::FORMAT_HTML, $question);
     $item->add_modalFeedback(self::OVERALL_FEEDBACK, self::FEEDBACK_CORRECT, 'show')->add_flow($text);
     $text = $this->translate_feedback_text($question->options->partiallycorrectfeedback, self::FORMAT_HTML, $question);
     $item->add_modalFeedback(self::OVERALL_FEEDBACK, self::FEEDBACK_PARTIALY_CORRECT, 'show')->add_flow($text);
 }
 public function add_interaction(ImsQtiWriter $item, $question)
 {
     $shuffle = $question->options->shuffleanswers;
     $response_id = $this->response_id($question);
     $result = $item->add_inlineChoiceInteraction($response_id, $shuffle);
     foreach ($question->options->answers as $answer) {
         $answer_id = $this->answer_id($answer);
         $result->add_inlineChoice($answer_id)->add_flow($answer->answer);
     }
     return $result;
 }
 public function add_interaction(ImsQtiWriter $item, $question)
 {
     $expectedLength = 0;
     foreach ($question->options->answers as $answer) {
         $expectedLength = max($expectedLength, strlen($answer->answer));
     }
     $response_id = $this->response_id($question);
     $result = $item->add_textEntryInteraction($response_id, '', '', $expectedLength);
     return $result;
 }
 protected function add_interaction(ImsQtiWriter $body, $question)
 {
     $max_choices = $question->options->single ? 1 : 0;
     $shuffle = $question->options->shuffleanswers;
     $result = $body->add_choiceInteraction(ImsQtiWriter::RESPONSE, $max_choices, $shuffle);
     $count = 0;
     foreach ($question->options->answers as $answer) {
         $identifier = 'ID_' . ++$count;
         $choice = $result->add_simpleChoice($identifier);
         $text = $this->translate_question_text($answer->answer, self::FORMAT_HTML, $question);
         $choice->add_flow($text);
     }
     return $result;
 }
 public function add_interaction(ImsQtiWriter $item, $question)
 {
     $response_id = $this->response_id($question);
     $result = $item->add_textEntryInteraction($response_id);
     $instructions = $question->options->instructions;
     if (!empty($instructions)) {
         $body->add_rubricBlock(ImsQtiWriter::VIEW_ALL)->add_flow($instructions);
     }
     return $result;
 }
 public function add_score_declaration(ImsQtiWriter $item, $question)
 {
     $score = $question->defaultgrade;
     $cardinality = ImsQtiWriter::CARDINALITY_SINGLE;
     $id = $this->score_id($question);
     $base_type = is_int($score) ? ImsQtiWriter::BASETYPE_INTEGER : ImsQtiWriter::BASETYPE_FLOAT;
     $result = $item->add_outcomeDeclaration($id, $cardinality, $base_type, $score);
     $result->add_defaultValue()->add_value(0);
     return $result;
 }