4require_once
'./Modules/TestQuestionPool/classes/class.assQuestion.php';
5require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
6require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjQuestionScoringAdjustable.php';
7require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjAnswerScoringAdjustable.php';
8require_once
'./Modules/TestQuestionPool/interfaces/interface.iQuestionCondition.php';
9require_once
'./Modules/TestQuestionPool/classes/class.ilUserQuestionResult.php';
11require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php';
157 $this->
setId($question_id);
166 include_once(
"./Services/RTE/classes/class.ilRTE.php");
168 $this->ordering_type = strlen(
$data[
"ordering_type"]) ?
$data[
"ordering_type"] :
OQ_TERMS;
169 $this->thumb_geometry =
$data[
"thumb_geometry"];
170 $this->element_height =
$data[
"element_height"];
185 $this->orderingElementList->setQuestionId($this->
getId());
186 $this->orderingElementList->loadFromDb();
188 parent::loadFromDb($question_id);
198 if ($this->
id <= 0) {
203 $this_id = $this->
getId();
207 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
211 if ((
int) $testObjId > 0) {
212 $clone->setObjId($testObjId);
230 $clone->duplicateOrderlingElementList();
233 $clone->copyPageOfQuestion($this_id);
235 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
237 $clone->duplicateImages($this_id, $thisObjId, $clone->getId(), $testObjId);
239 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
258 if ($this->
id <= 0) {
264 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
267 $source_questionpool_id = $this->
getObjId();
268 $clone->setObjId($target_questionpool_id);
280 $clone->duplicateImages(
$original_id, $source_questionpool_id, $clone->getId(), $target_questionpool_id);
282 $clone->onCopy($source_questionpool_id,
$original_id, $clone->getObjId(), $clone->getId());
289 if ($this->
id <= 0) {
294 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
297 $sourceParentId = $this->
getObjId();
303 $clone->setObjId($targetParentId);
305 if ($targetQuestionTitle) {
306 $clone->setTitle($targetQuestionTitle);
311 $clone->copyPageOfQuestion($sourceQuestionId);
313 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
315 $clone->duplicateImages($sourceQuestionId, $sourceParentId, $clone->getId(), $clone->getObjId());
317 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
322 public function duplicateImages($src_question_id, $src_object_id, $dest_question_id, $dest_object_id)
327 $imagepath_original = $this->
getImagePath($src_question_id, $src_object_id);
328 $imagepath = $this->
getImagePath($dest_question_id, $dest_object_id);
330 if (!file_exists($imagepath)) {
336 $ilLog->write(
"image could not be duplicated!!!!");
338 if (@file_exists($imagepath_original . $this->
getThumbPrefix() . $filename)) {
340 $ilLog->write(
"image thumbnail could not be duplicated!!!!");
352 public function copyImages($question_id, $source_questionpool)
358 $imagepath_original = str_replace(
"/$this->id/images",
"/$question_id/images", $imagepath);
359 $imagepath_original = str_replace(
"/$this->obj_id/",
"/$source_questionpool/", $imagepath_original);
360 if (!file_exists($imagepath)) {
366 $ilLog->write(
"Ordering Question image could not be copied: ${imagepath_original}${filename}");
368 if (@file_exists($imagepath_original . $this->
getThumbPrefix() . $filename)) {
370 $ilLog->write(
"Ordering Question image thumbnail could not be copied: $imagepath_original" . $this->
getThumbPrefix() . $filename);
424 if ($forceCorrectSolution || !$activeId || $passIndex ===
null) {
428 $solutionValues = $this->
getSolutionValues($activeId, $passIndex, !$getUseIntermediateSolution);
430 if (!count($solutionValues)) {
453 #if( $pass === null && !ilObjTest::_getUsePreviousAnswers($activeId, true) )
456 # $pass = ilObjTest::_getPass($activeId);
466 if (count($indexedSolutionValues)) {
480 $value2 = explode(
':', $value2);
482 $randomIdentifier = $value2[0];
483 $selectedPosition = $value1;
484 $selectedIndentation = $value2[1];
488 $element->setPosition($selectedPosition);
489 $element->setIndentation($selectedIndentation);
501 $solutionIdentifier = $value1;
502 $selectedPosition = ($value2 - 1);
503 $selectedIndentation = 0;
505 $element = $this->
getOrderingElementList()->getElementBySolutionIdentifier($solutionIdentifier)->getClone();
507 $element->setPosition($selectedPosition);
508 $element->setIndentation($selectedIndentation);
521 $solutionOrderingList->setQuestionId($this->
getId());
523 foreach ($indexedSolutionValues as $value1 => $value2) {
530 $solutionOrderingList->addElement($element);
537 return $solutionOrderingList;
547 $shuffledRandomIdentifierIndex = $this->
getShuffler()->shuffle(
552 $shuffledElementList->reorderByRandomIdentifiers($shuffledRandomIdentifierIndex);
553 $shuffledElementList->resetElementsIndentations();
555 return $shuffledElementList;
667 if ($returndetails) {
668 throw new ilTestException(
'return details not implemented for ' . __METHOD__);
671 if (is_null(
$pass)) {
677 if (!count($solutionValuePairs)) {
693 $solutionOrderingElementList = unserialize(
725 if (preg_match(
"/.*\\.(\\w+)$/",
$filename, $matches)) {
726 $extension = $matches[1];
728 return md5(
$filename) .
"." . $extension;
736 foreach ($contents as
$f) {
737 if (strcmp(
$f[
'type'],
'file') == 0) {
740 if (strcmp(
$f[
'entry'], $orderElement->getContent()) == 0) {
743 if (strcmp(
$f[
'entry'], $this->
getThumbPrefix() . $orderElement->getContent()) == 0) {
748 if (@file_exists($this->
getImagePath() . $f[
'entry'])) {
770 if (!strlen($imageFilename)) {
782 if (!strlen($imageFilename)) {
786 if (!file_exists($this->
getImagePath() . $imageFilename)) {
816 if (!strlen($uploadFile)) {
833 foreach ($elementList as $element) {
859 if (!$submittedSolutionList->hasElements()) {
878 if (is_null(
$pass)) {
879 include_once
"./Modules/Test/classes/class.ilObjTest.php";
884 function () use (&$entered_values, $active_id,
$pass, $authorized) {
888 $value1 = $orderingElement->getStorageValue1($this->
getOrderingType());
889 $value2 = $orderingElement->getStorageValue2($this->
getOrderingType());
898 if ($entered_values) {
899 $this->
log($active_id,
'log_user_entered_values');
901 $this->
log($active_id,
'log_user_not_entered_values');
924 array( $this->
getId() )
928 "INSERT INTO " . $this->
getAdditionalTableName() .
" (question_fi, ordering_type, thumb_geometry, element_height)
929 VALUES (%s, %s, %s, %s)",
930 array(
"integer",
"text",
"integer",
"integer" ),
933 $this->ordering_type,
959 return "assOrderingQuestion";
970 return "qpl_qst_ordering";
981 return "qpl_a_ordering";
990 $text = parent::getRTETextWithMediaObjects();
993 $text .= $orderingElement->getContent();
1029 parent::setExportDetailsXLS($worksheet, $startrow, $active_id,
$pass);
1033 foreach ($solutions as $solution) {
1034 $sol[$solution[
"value1"]] = $solution[
"value2"];
1037 $sol = array_keys($sol);
1040 foreach ($sol as $idx) {
1041 foreach ($solutions as $solution) {
1042 if ($solution[
"value1"] == $idx) {
1043 $worksheet->setCell($startrow +
$i, 0, $solution[
"value2"]);
1047 $worksheet->setCell($startrow +
$i, 1, $element->getContent());
1051 return $startrow +
$i + 1;
1076 $this->thumb_geometry = ($a_geometry < 1) ? 100 : $a_geometry;
1096 $this->element_height = ($a_height < 20) ?
"" : $a_height;
1123 switch (strtoupper($path_info[
'extension'])) {
1143 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1150 $result[
'shuffle'] = (bool)
true;
1153 'onenotcorrect' => $this->
formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
false)),
1154 'allcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
true))
1163 $answers[$counter] = $orderingElement->getContent();
1166 $answers = $this->
getShuffler()->shuffle($answers);
1168 foreach ($answers as $order => $answer) {
1169 array_push($arr, array(
1170 "answertext" => (
string) $answer,
1171 "order" => (
int) $order
1215 $formField->setInteractionEnabled(
true);
1223 $formField->setEditElementOccuranceEnabled(
true);
1224 $formField->setEditElementOrderEnabled(
true);
1235 $formField->
setInfo($this->lng->txt(
'ordering_answer_sequence_info'));
1236 $formField->
setTitle($this->lng->txt(
'answers'));
1246 require_once
'Modules/TestQuestionPool/classes/forms/class.ilAssOrderingTextsInputGUI.php';
1250 self::ORDERING_ELEMENT_FORM_FIELD_POSTVAR
1255 return $orderingElementInput;
1265 require_once
'Modules/TestQuestionPool/classes/forms/class.ilAssOrderingImagesInputGUI.php';
1269 self::ORDERING_ELEMENT_FORM_FIELD_POSTVAR
1272 $orderingElementInput->setImageRemovalCommand(self::ORDERING_ELEMENT_FORM_CMD_REMOVE_IMG);
1273 $orderingElementInput->setImageUploadCommand(self::ORDERING_ELEMENT_FORM_CMD_UPLOAD_IMG);
1277 return $orderingElementInput;
1287 require_once
'Modules/TestQuestionPool/classes/forms/class.ilAssNestedOrderingElementsInputGUI.php';
1291 self::ORDERING_ELEMENT_FORM_FIELD_POSTVAR
1294 $orderingElementInput->setUniquePrefix($this->
getId());
1301 return $orderingElementInput;
1310 return $form->
getItemByPostVar(self::ORDERING_ELEMENT_FORM_FIELD_POSTVAR)->getElementList($this->
getId());
1322 $orderingGUI->setValueByArray($userSolutionPost);
1324 if (!$orderingGUI->checkInput()) {
1325 require_once
'Modules/Test/exceptions/class.ilTestException.php';
1329 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElementList.php';
1334 foreach ($orderingGUI->getElementList($this->getId()) as $submittedElement) {
1335 $solutionElement = $storedElementList->getElementByRandomIdentifier(
1336 $submittedElement->getRandomIdentifier()
1339 $solutionElement->setPosition($submittedElement->getPosition());
1342 $solutionElement->setIndentation($submittedElement->getIndentation());
1345 $solutionOrderingElementList->addElement($solutionElement);
1348 return $solutionOrderingElementList;
1361 if ($this->postSolutionOrderingElementList ===
null) {
1363 $this->postSolutionOrderingElementList = $list;
1387 $userElement = $solutionOrderingElementList->
getElementByPosition($correctElement->getPosition());
1389 if (!$correctElement->isSameElement($userElement)) {
1395 return $reachedPoints;
1414 'SELECT depth FROM qpl_a_ordering WHERE question_fi = %s ORDER BY position ASC',
1416 array($this->
getId())
1418 while ($row =
$ilDB->fetchAssoc(
$res)) {
1419 $this->old_ordering_depth[] = $row[
'depth'];
1434 'SELECT solution_key FROM qpl_a_ordering WHERE random_id = %s',
1440 return $row[
'solution_key'];
1450 array(
'solution_key' => array(
'integer', $a_index),
1451 'depth' => array(
'integer', $a_depth)),
1452 array(
'answertext' => array(
'text', $a_answer_text))
1469 require_once
"./Modules/TestQuestionPool/classes/class.ilOperatorsExpressionMapping.php";
1502 $maxStep = $this->lookupMaxStep($active_id,
$pass);
1504 if ($maxStep !==
null) {
1506 "SELECT value1, value2 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND step = %s ORDER BY value1 ASC ",
1507 array(
"integer",
"integer",
"integer",
"integer"),
1508 array($active_id,
$pass, $this->
getId(), $maxStep)
1512 "SELECT value1, value2 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s ORDER BY value1 ASC ",
1513 array(
"integer",
"integer",
"integer"),
1518 $elements = array();
1520 $newKey = explode(
":", $row[
"value2"]);
1525 if ($answer->getSolutionIdentifier() == $row[
"value1"]) {
1526 $elements[$row[
"value2"]] = $answer->getSolutionIdentifier() + 1;
1530 if ($answer->getRandomIdentifier() == $newKey[0]) {
1531 $elements[$row[
"value1"]] = $answer->getSolutionIdentifier() + 1;
1540 foreach (array_values($elements) as $element) {
1541 $result->addKeyValue($element, $element);
1574 parent::afterSyncWithOriginal($origQuestionId, $dupQuestionId, $origParentObjId, $dupParentObjId);
1575 $this->
duplicateImages($dupQuestionId, $dupParentObjId, $origQuestionId, $origParentObjId);
1588 return parent::buildTestPresentationConfig()
1590 ->setIsUnchangedAnswerPossible(
true)
1591 ->setUseUnchangedAnswerLabel($this->lng->txt(
'tst_unchanged_order_is_correct'));
1607 $solutionSubmit = array();
1609 if (isset($formSubmissionDataStructure[
'orderresult'])) {
1610 $orderresult = $formSubmissionDataStructure[
'orderresult'];
1612 if (strlen($orderresult)) {
1613 $orderarray = explode(
":", $orderresult);
1615 foreach ($orderarray as
$index) {
1617 if (preg_match(
"/id_(\\d+)/",
$index, $idmatch)) {
1618 $randomid = $idmatch[1];
1620 if ($answer->getRandomIdentifier() == $randomid) {
1621 $solutionSubmit[$answeridx] = $ordervalue;
1630 foreach ($formSubmissionDataStructure[
'content'] as $randomId => $content) {
1631 $indentation = $formSubmissionDataStructure[
'indentation'];
1634 $value2 = implode(
':', array($randomId, $indentation));
1636 $solutionSubmit[$value1] = $value2;
1639 foreach ($formSubmissionDataStructure as $key => $value) {
1641 if (preg_match(
"/^order_(\d+)/", $key, $matches)) {
1642 if (!(preg_match(
"/initial_value_\d+/", $value))) {
1643 if (strlen($value)) {
1645 if ($answer->getRandomIdentifier() == $matches[1]) {
1646 $solutionSubmit[$answeridx] = $value;
1655 return $solutionSubmit;
1663 require_once
'Modules/TestQuestionPool/classes/forms/class.ilAssOrderingFormValuesObjectsConverter.php';
1665 $converter->setPostVar(self::ORDERING_ELEMENT_FORM_FIELD_POSTVAR);
1678 $formDataConverter->setImageRemovalCommand(self::ORDERING_ELEMENT_FORM_CMD_REMOVE_IMG);
1680 $formDataConverter->setImageFsPath($this->
getImagePath());
1685 return $formDataConverter;
1695 return $formDataConverter;
1707 $formDataConverter->setImageRemovalCommand(self::ORDERING_ELEMENT_FORM_CMD_REMOVE_IMG);
1715 return $formDataConverter;
An exception for terminatinating execution or to throw for unit testing.
Class for ordering questions.
getOrderElements()
Returns the answers array.
const ORDERING_ELEMENT_FORM_CMD_UPLOAD_IMG
buildOrderingImagesFormDataConverter()
const ORDERING_ELEMENT_FORM_CMD_REMOVE_IMG
setOrderingElementList($orderingElementList)
getShuffledOrderingElementList()
getOperators($expression)
Get all available operations for a specific question.
getSolutionValuePairBrandedOrderingElementBySolutionIdentifier($value1, $value2)
getAnswer($index=0)
Returns the ordering element from the given position.
getExpressionTypes()
Get all available expression types for a specific question.
getQuestionType()
Returns the question type of the question.
setThumbGeometry($a_geometry)
copyImages($question_id, $source_questionpool)
initOrderingElementAuthoringProperties(ilFormPropertyGUI $formField)
getAnswerTableName()
Returns the name of the answer table in the database.
getSolutionOrderingElementList($indexedSolutionValues)
hasOrderingTypeUploadSupport()
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
buildNestedOrderingElementInputGui()
toJSON()
Returns a JSON representation of the question.
fetchSolutionListFromFormSubmissionData($userSolutionPost)
dropImageFile($imageFilename)
setOrderingType($ordering_type=OQ_TERMS)
Sets the ordering question type.
createImageThumbnail(ilAssOrderingElement $element)
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
isImageReplaced(ilAssOrderingElement $newElement, ilAssOrderingElement $oldElement)
isComplete()
Returns true, if a ordering question is complete for use.
saveToDb($original_id="")
Saves a assOrderingQuestion object to a database.
buildTestPresentationConfig()
Get the test question configuration.
buildNestedOrderingFormDataConverter()
duplicateOrderlingElementList()
fetchSolutionSubmit($formSubmissionDataStructure)
const ORDERING_ELEMENT_FORM_FIELD_POSTVAR
setElementHeight($a_height)
buildOrderingTextsInputGui()
getOrderingElementListForSolutionOutput($forceCorrectSolution, $activeId, $passIndex, $getUseIntermediateSolution=false)
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{Creates an Excel worksheet for the detailed cumulated results of this question.object}
savePreviewData(ilAssQuestionPreviewSession $previewSession)
__construct( $title="", $comment="", $author="", $owner=-1, $question="", $ordering_type=OQ_TERMS)
assOrderingQuestion constructor
initOrderingElementFormFieldLabels(ilFormPropertyGUI $formField)
$postSolutionOrderingElementList
handleThumbnailCreation(ilAssOrderingElementList $elementList)
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assOrderingQuestion.
getAvailableAnswerOptions($index=null)
If index is null, the function returns an array with all anwser options Else it returns the specific ...
getAdditionalTableName()
Returns the name of the additional question data table in the database.
getSolutionValuePairBrandedOrderingElementByRandomIdentifier($value1, $value2)
isImageFileStored($imageFilename)
getSolutionListFromPostSubmit()
buildOrderingTextsFormDataConverter()
buildOrderingElementFormDataConverter()
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
updateLeveledOrdering($a_index, $a_answer_text, $a_depth)
getOrderingType()
Returns the ordering question type.
loadFromDb($question_id)
Loads a assOrderingQuestion object from a database.
getEncryptedFilename($filename)
lookupSolutionOrderByRandomid($a_random_id)
duplicateImages($src_question_id, $src_object_id, $dest_question_id, $dest_object_id)
getSolutionOrderingElementListForTestOutput(ilAssNestedOrderingElementsInputGUI $inputGUI, $lastPost, $activeId, $pass)
afterSyncWithOriginal($origQuestionId, $dupQuestionId, $origParentObjId, $dupParentObjId)
{}
deleteAnswer($randomIdentifier)
Deletes an answer with a given index.
validateSolutionSubmit()
Checks the data to be saved for consistency.
calculateReachedPointsForSolution(ilAssOrderingElementList $solutionOrderingElementList)
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
fetchSolutionListFromSubmittedForm(ilPropertyFormGUI $form)
buildOrderingImagesInputGui()
supportsJavascriptOutput()
Returns true if the question type supports JavaScript output.
calculateReachedPointsFromPreviewSession(ilAssQuestionPreviewSession $previewSession)
copyObject($target_questionpool_id, $title="")
Copies an assOrderingQuestion object.
buildOrderingElementInputGui()
generateThumbForFile($path, $file)
storeImageFile($uploadFile, $targetFile)
Sets the image file and uploads the image to the object's image directory.
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
moveAnswerDown($position)
getAnswerCount()
Returns the number of answers.
Abstract basic class which is to be extended by the concrete assessment question type classes.
getSolutionValues($active_id, $pass=null, $authorized=true)
Loads solutions of a given user from the database an returns it.
static _getOriginalId($question_id)
Returns the original id of a question.
formatSAQuestion($a_q)
Format self assessment question.
setId($id=-1)
Sets the id of the assQuestion object.
setOriginalId($original_id)
setObjId($obj_id=0)
Set the object id of the container object.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
saveQuestionDataToDb($original_id="")
log($active_id, $langVar)
getId()
Gets the id of the assQuestion object.
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
getObjId()
Get the object id of the container object.
setTitle($title="")
Sets the title string of the assQuestion object.
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second.
fetchIndexedValuesFromValuePairs(array $valuePairs)
deductHintPointsFromReachedPoints(ilAssQuestionPreviewSession $previewSession, $reachedPoints)
getImagePath($question_id=null, $object_id=null)
Returns the image path for web accessable images of a question.
removeCurrentSolution($active_id, $pass, $authorized=true)
setAuthor($author="")
Sets the authors name of the assQuestion object.
getPoints()
Returns the maximum available points for the question.
getTestOutputSolutions($activeId, $pass)
setLifecycle(ilAssQuestionLifecycle $lifecycle)
getTitle()
Gets the title string of the assQuestion object.
setPoints($a_points)
Sets the maximum available points for the question.
setComment($comment="")
Sets the comment string of the assQuestion object.
getAuthor()
Gets the authors name of the assQuestion object.
setNrOfTries($a_nr_of_tries)
getQuestion()
Gets the question string of the question object.
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
setQuestion($question="")
Sets the question string of the question object.
getImagePathWeb()
Returns the web image path for web accessable images of a question.
ensureNonNegativePoints($points)
getElementByPosition($position)
static buildInstance($questionId, $orderingElements=array())
static getDraftInstance()
static getInstance($identifier)
getParticipantsSolution()
setParticipantsSolution($participantSolution)
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
static getOperatorsByExpression($expression)
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
Base Exception for all Exceptions relating to Modules/Test.
Class ilUserQuestionResult.
static moveUploadedFile($a_file, $a_name, $a_target, $a_raise_errors=true, $a_mode="move_uploaded")
move uploaded file
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static convertImage( $a_from, $a_to, $a_target_format="", $a_geometry="", $a_background_color="")
convert image
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
static makeDirParents($a_dir)
Create a new directory and all parent directories.
const OQ_PICTURES
Ordering question constants.
Class iQuestionCondition.
const PercentageResultExpression
const OrderingResultExpression
getUserQuestionResult($active_id, $pass)
Get the user solution for a question by active_id and the test pass.
const NumericResultExpression
const EmptyAnswerExpression
Interface ilObjAnswerScoringAdjustable.
Interface ilObjQuestionScoringAdjustable.
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
foreach($_POST as $key=> $value) $res