protected function buildResponseDeclaration($responseIdentifier, $validation) { $responseDeclaration = new ResponseDeclaration($responseIdentifier); $responseDeclaration->setCardinality(Cardinality::MULTIPLE); $responseDeclaration->setBaseType(BaseType::DIRECTED_PAIR); /** @var clozeassociation_validation $validation */ $validationValues = $validation->get_valid_response()->get_value(); $validationScore = $validation->get_valid_response()->get_score(); // Build correct response // Try to handle `null` values in `valid_response` `value`s $values = new ValueCollection(); foreach ($validationValues as $index => $validResponse) { if (!isset($this->possibleResponsesMap[$validResponse])) { throw new MappingException('Invalid or missing missing valid response `' . $validResponse . '``'); } if (!empty($validResponse)) { $first = ClozeassociationMapper::GAP_IDENTIFIER_PREFIX . $index; $second = ClozeassociationMapper::GAPCHOICE_IDENTIFIER_PREFIX . $this->possibleResponsesMap[$validResponse]; $values->attach(new Value(new QtiDirectedPair($first, $second))); } } if ($values->count() > 0) { $correctResponse = new CorrectResponse($values); $responseDeclaration->setCorrectResponse($correctResponse); } return $responseDeclaration; }