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';
49 $this->errortext =
'';
50 $this->textsize = 100.0;
51 $this->errordata = array();
61 if (strlen($this->title)
88 "DELETE FROM qpl_a_errortext WHERE question_fi = %s",
90 array( $this->
getId() )
94 foreach ($this->errordata as $object) {
95 $next_id =
$ilDB->nextId(
'qpl_a_errortext');
97 "INSERT INTO qpl_a_errortext (answer_id, question_fi, text_wrong, text_correct, points, sequence) VALUES (%s, %s, %s, %s, %s, %s)",
98 array(
'integer',
'integer',
'text',
'text',
'float',
'integer' ),
103 $object->text_correct,
124 array( $this->
getId() )
128 "INSERT INTO " . $this->
getAdditionalTableName() .
" (question_fi, errortext, textsize, points_wrong) VALUES (%s, %s, %s, %s)",
129 array(
"integer",
"text",
"float",
"float"),
157 $this->
setId($question_id);
166 include_once(
"./Services/RTE/classes/class.ilRTE.php");
180 "SELECT * FROM qpl_a_errortext WHERE question_fi = %s ORDER BY sequence ASC",
184 include_once
"./Modules/TestQuestionPool/classes/class.assAnswerErrorText.php";
191 parent::loadFromDb($question_id);
199 if ($this->
id <= 0) {
204 $this_id = $this->
getId();
208 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
212 if ((
int) $testObjId > 0) {
213 $clone->setObjId($testObjId);
233 $clone->copyPageOfQuestion($this_id);
235 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
237 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
246 if ($this->
id <= 0) {
252 $thisId = $this->
getId();
256 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
259 $clone->setObjId($target_questionpool_id);
270 $clone->onCopy($thisObjId, $thisId, $clone->getObjId(), $clone->getId());
277 if ($this->
id <= 0) {
282 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
285 $sourceParentId = $this->
getObjId();
291 $clone->setObjId($targetParentId);
293 if ($targetQuestionTitle) {
294 $clone->setTitle($targetQuestionTitle);
299 $clone->copyPageOfQuestion($sourceQuestionId);
301 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
303 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
316 foreach ($this->errordata as $object) {
317 if ($object->points > 0) {
318 $maxpoints += $object->points;
336 if ($returndetails) {
337 throw new ilTestException(
'return details not implemented for ' . __METHOD__);
344 $positions = array();
345 if (is_null(
$pass)) {
351 array_push($positions,
$row[
'value1']);
378 if (is_null(
$pass)) {
379 include_once
"./Modules/Test/classes/class.ilObjTest.php";
383 $entered_values =
false;
385 $this->
getProcessLocker()->executeUserSolutionUpdateLockOperation(
function () use (&$entered_values, $active_id,
$pass, $authorized) {
389 $selected = explode(
",",
$_POST[
"qst_" . $this->
getId()]);
390 foreach ($selected as $position) {
393 $entered_values =
true;
397 if ($entered_values) {
398 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
403 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
415 $selection = explode(
',',
$_POST[
"qst_{$this->getId()}"]);
417 $selection = array();
430 return "assErrorText";
440 return "qpl_qst_errortext";
450 return "qpl_a_errortext";
459 $text = parent::getRTETextWithMediaObjects();
468 parent::setExportDetailsXLS($worksheet, $startrow, $active_id,
$pass);
471 $selections = array();
473 if (is_array($solutions)) {
474 foreach ($solutions as $solution) {
475 array_push($selections, $solution[
'value1']);
477 $errortext_value = join(
",", $selections);
484 return $startrow +
$i + 1;
499 public function fromXML(&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
501 include_once
"./Modules/TestQuestionPool/classes/import/qti12/class.assErrorTextImport.php";
503 $import->fromXML($item, $questionpool_id, $tst_id, $tst_object, $question_counter, $import_mapping);
512 public function toXML($a_include_header =
true, $a_include_binary =
true, $a_shuffle =
false, $test_output =
false, $force_image_references =
false)
514 include_once
"./Modules/TestQuestionPool/classes/export/qti12/class.assErrorTextExport.php";
516 return $export->toXML($a_include_header, $a_include_binary, $a_shuffle, $test_output, $force_image_references);
526 $user_solution = array();
527 return $user_solution;
532 if (strlen($a_text) == 0) {
539 $a_text = str_replace(array(
"((",
"))"), array(
"~",
"~"), $a_text);
543 $r_passage =
"/(~([^~]+)~|#([^\s]+))/";
545 preg_match_all($r_passage, $a_text, $matches);
547 if (is_array($matches[0]) && !empty($matches[0])) {
552 $matches = array_intersect_key($matches, array(2 =>
'', 3 =>
''));
555 $matches[2] = array_diff($matches[2], array(
''));
556 $matches[3] = array_diff($matches[3], array(
''));
559 "passages" => $matches[2],
560 "words" => $matches[3],);
568 include_once
"./Modules/TestQuestionPool/classes/class.assAnswerErrorText.php";
570 $this->errordata = array();
571 foreach ($a_data as $err_type =>
$errors) {
574 foreach (
$errors as $idx => $error) {
578 foreach ($temp as $object) {
579 if (strcmp($object->text_wrong, $error) == 0) {
580 $text_correct = $object->text_correct;
588 ksort($this->errordata);
591 public function createErrorTextOutput($selections =
null, $graphicalOutput =
false, $correct_solution =
false, $use_link_tags =
true)
595 include_once
"./Services/Utilities/classes/class.ilStr.php";
596 if (!is_array($selections)) {
597 $selections = array();
599 $textarray = preg_split(
"/[\n\r]+/", $this->
getErrorText());
601 foreach ($textarray as $textidx =>
$text) {
603 $passage_end =
false;
604 $items = preg_split(
"/\s+/",
$text);
605 foreach ($items as $idx => $item) {
609 ($posHash = strpos($item,
'#')) === 0 ||
610 ($posOpeningBrackets = strpos($item,
'((')) === 0 ||
611 ($posClosingBrackets = strpos($item,
'))')) !==
false
615 if ($posHash !==
false) {
616 $item = ilStr::substr($item, 1, ilStr::strlen($item) - 1);
617 $passage_end =
false;
618 } elseif ($posOpeningBrackets !==
false) {
620 $passage_start_idx = $counter;
621 $items_in_passage = array();
622 $passage_end =
false;
623 $item = ilStr::substr($item, 2, ilStr::strlen($item) - 2);
627 if (strpos($item,
'))') !==
false) {
628 $item = str_replace(
"))",
"", $item);
633 $item = str_replace(
"))",
"", $item);
636 if ($correct_solution && !$in_passage) {
637 $errorobject = $this->errordata[$errorcounter];
638 if (is_object($errorobject)) {
639 $item = strlen($errorobject->text_correct) ? $errorobject->text_correct :
' ';
645 if ($in_passage && !$passage_end) {
646 $items_in_passage[$idx] = $item;
652 if ($in_passage && $passage_end) {
654 $passage_end =
false;
655 if ($correct_solution) {
658 "ilc_qetitem_ErrorTextSelected" :
"ilc_qetitem_ErrorTextItem"
661 $errorobject = $this->errordata[$errorcounter];
662 if (is_object($errorobject)) {
663 $item = strlen($errorobject->text_correct) ? $errorobject->text_correct :
' ';
671 $group_selected =
true;
672 if ($graphicalOutput) {
673 $start_idx = $passage_start_idx;
674 foreach ($items_in_passage as $tmp_idx => $tmp_item) {
676 $group_selected =
false;
682 if ($group_selected) {
684 $group_selected =
false;
689 $item_stack = array();
690 $start_idx = $passage_start_idx;
691 foreach ($items_in_passage as $tmp_idx => $tmp_item) {
694 "ilc_qetitem_ErrorTextSelected" :
"ilc_qetitem_ErrorTextItem"
701 "ilc_qetitem_ErrorTextSelected" :
"ilc_qetitem_ErrorTextItem"
703 if ($graphicalOutput) {
704 if ($group_selected) {
705 $img =
' <img src="' .
ilUtil::getImagePath(
"icon_ok.svg") .
'" alt="' . $this->lng->txt(
"answer_is_right") .
'" title="' . $this->lng->txt(
"answer_is_right") .
'" /> ';
707 $img =
' <img src="' .
ilUtil::getImagePath(
"icon_not_ok.svg") .
'" alt="' . $this->lng->txt(
"answer_is_wrong") .
'" title="' . $this->lng->txt(
"answer_is_wrong") .
'" /> ';
712 $item_stack = trim(implode(
" ", $item_stack));
713 $item_stack = strlen($item_stack) ? $item_stack :
' ';
715 if ($graphicalOutput) {
716 $items[$idx] =
'<span class="selGroup">' . $item_stack .
'</span>';
718 $items[$idx] = $item_stack;
726 $class =
'ilc_qetitem_ErrorTextItem';
729 $class =
"ilc_qetitem_ErrorTextSelected";
730 if ($graphicalOutput) {
732 $img =
' <img src="' .
ilUtil::getImagePath(
"icon_ok.svg") .
'" alt="' . $this->lng->txt(
"answer_is_right") .
'" title="' . $this->lng->txt(
"answer_is_right") .
'" /> ';
734 $img =
' <img src="' .
ilUtil::getImagePath(
"icon_not_ok.svg") .
'" alt="' . $this->lng->txt(
"answer_is_wrong") .
'" title="' . $this->lng->txt(
"answer_is_wrong") .
'" /> ';
742 $textarray[$textidx] =
'<p>' . implode(
" ", $items) .
'</p>';
745 return implode(
"\n", $textarray);
750 foreach ($selection as
$data) {
751 if (!is_array(
$data)) {
752 if ($counter ==
$data) {
755 } elseif (in_array($counter,
$data)) {
767 include_once
"./Services/Utilities/classes/class.ilStr.php";
768 if (!is_array($selections)) {
769 $selections = array();
771 $textarray = preg_split(
"/[\n\r]+/", $this->
getErrorText());
772 foreach ($textarray as $textidx =>
$text) {
773 $items = preg_split(
"/\s+/",
$text);
774 foreach ($items as $idx => $item) {
775 if (($posHash = strpos($item,
'#')) === 0
776 || ($posOpeningBrackets = strpos($item,
'((')) === 0
777 || ($posClosingBrackets = strpos($item,
'))')) !==
false) {
780 if ($posHash !==
false) {
781 $item = ilStr::substr($item, 1, ilStr::strlen($item) - 1);
782 } elseif ($posOpeningBrackets !==
false) {
783 $item = ilStr::substr($item, 2, ilStr::strlen($item) - 2);
787 if (strpos($item,
'))') !==
false) {
788 $item = ilStr::substr($item, 0, ilStr::strlen($item) - 2);
792 if ($item[$posClosingBrackets + 2] ==
',') {
796 $item = ilStr::substr($item, 0, $posClosingBrackets) . $appendComma;
801 if (in_array($counter, $selections)) {
805 if (in_array($counter, $selections)) {
808 $items[$idx] = $word;
811 $textarray[$textidx] = join(
" ", $items);
813 return join(
"\n", $textarray);
822 $textarray = preg_split(
"/[\n\r]+/", $this->
getErrorText());
823 foreach ($textarray as $textidx =>
$text) {
824 $items = preg_split(
"/\s+/",
$text);
826 foreach ($items as $word) {
828 $isErrorItem =
false;
829 if (strpos($word,
'#') === 0) {
831 $errorobject = $this->errordata[$errorcounter];
832 if (is_object($errorobject)) {
833 $points = $errorobject->points;
837 } elseif (($posOpeningBracket = strpos($word,
'((')) === 0
838 || ($posClosingBracket = strpos($word,
'))')) !==
false
842 if ($posOpeningBracket !==
false) {
843 $passages[] = array(
'begin_pos' => $counter,
'cnt_words' => 0);
845 } elseif ($posClosingBracket !==
false) {
847 $cur_pidx = count($passages) - 1;
848 $passages[$cur_pidx][
'end_pos'] = $counter;
850 $errorobject = $this->errordata[$errorcounter];
851 if (is_object($errorobject)) {
852 $passages[$cur_pidx][
'score'] = $errorobject->points;
853 $passages[$cur_pidx][
'isError'] =
true;
859 $cur_pidx = count($passages) - 1;
860 $passages[$cur_pidx][
'cnt_words']++;
864 $words[$counter] = array(
"word" => $word,
"points" =>
$points,
"isError" => $isErrorItem);
869 $selections = array();
870 foreach ($passages as $cnt => $pdata) {
871 if (!$withPositivePointsOnly && $pdata[
'isError'] || $withPositivePointsOnly && $pdata[
'score'] > 0) {
872 $indexes = range($pdata[
'begin_pos'], $pdata[
'end_pos']);
873 $selections[$pdata[
'begin_pos']] = $indexes;
877 foreach ($words as $idx => $word) {
878 if (!$withPositivePointsOnly && $word[
'isError'] || $withPositivePointsOnly && $word[
'points'] > 0) {
879 $selections[$idx] = array($idx);
885 $selections = array_values($selections);
896 $textarray = preg_split(
"/[\n\r]+/", $this->
getErrorText());
897 foreach ($textarray as $textidx =>
$text) {
898 $items = preg_split(
"/\s+/",
$text);
900 foreach ($items as $word) {
902 if (strpos($word,
'#') === 0) {
904 $errorobject = $this->errordata[$errorcounter];
905 if (is_object($errorobject)) {
906 $points = $errorobject->points;
909 } elseif (($posOpeningBracket = strpos($word,
'((')) === 0
910 || ($posClosingBracket = strpos($word,
'))')) !==
false
914 if ($posOpeningBracket !==
false) {
915 $passages[] = array(
'begin_pos' => $counter,
'cnt_words' => 0);
917 } elseif ($posClosingBracket !==
false) {
919 $cur_pidx = count($passages) - 1;
920 $passages[$cur_pidx][
'end_pos'] = $counter;
922 $errorobject = $this->errordata[$errorcounter];
923 if (is_object($errorobject)) {
924 $passages[$cur_pidx][
'score'] = $errorobject->points;
929 $cur_pidx = count($passages) - 1;
930 $passages[$cur_pidx][
'cnt_words']++;
934 $words[$counter] = array(
"word" => $word,
"points" =>
$points);
941 foreach ($positions as $position) {
945 $total += $words[$position][
'points'];
948 foreach ($passages as $cnt => $p_data) {
953 $isSelected = in_array($p_data[
'begin_pos'], $positions);
955 for (
$i = 0;
$i < $p_data[
'cnt_words'];
$i++) {
956 $current_pos = $p_data[
'begin_pos'] +
$i;
957 $isSelected = $isSelected && in_array($current_pos, $positions);
960 $total += $isSelected ? $p_data[
'score'] : 0;
971 $this->errordata = array();
976 include_once
"./Modules/TestQuestionPool/classes/class.assAnswerErrorText.php";
1007 $this->errortext = $a_value;
1028 if ($a_value ===
null) {
1031 $this->textsize = $a_value;
1051 $this->points_wrong = $a_value;
1066 case "points_wrong":
1070 return parent::__get($value);
1087 case "points_wrong":
1091 parent::__set(
$key, $value);
1102 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1112 'onenotcorrect' => $this->
formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
false)),
1113 'allcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
true))
1117 foreach ($this->
getErrorData() as $idx => $answer_obj) {
1118 array_push($answers, array(
1119 "answertext_wrong" => (
string) $answer_obj->text_wrong,
1120 "answertext_correct" => (
string) $answer_obj->text_correct,
1121 "points" => (
float) $answer_obj->points,
1122 "order" => (
int) $idx + 1
1125 $result[
'correct_answers'] = $answers;
1128 $textarray = preg_split(
"/[\n\r]+/", $this->
getErrorText());
1129 foreach ($textarray as $textidx =>
$text) {
1130 $items = preg_split(
"/\s+/", trim(
$text));
1131 foreach ($items as $idx => $item) {
1132 if (substr($item, 0, 1) ==
"#") {
1133 $item = substr($item, 1);
1136 foreach (
$result[
"correct_answers"] as $aidx => $answer) {
1137 if ($answer[
"answertext_wrong"] == $item && !$answer[
"pos"]) {
1138 $result[
"correct_answers"][$aidx][
"pos"] = $this->
getId() .
"_" . $textidx .
"_" . ($idx + 1);
1143 array_push($answers, array(
1145 "order" => $this->
getId() .
"_" . $textidx .
"_" . ($idx + 1)
1148 if ($textidx !=
sizeof($textarray) - 1) {
1149 array_push($answers, array(
1150 "answertext" =>
"###",
1151 "order" => $this->
getId() .
"_" . $textidx .
"_" . ($idx + 2)
1155 $result[
'answers'] = $answers;
1173 require_once
"./Modules/TestQuestionPool/classes/class.ilOperatorsExpressionMapping.php";
1207 "SELECT value1+1 as value1 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND step = (
1208 SELECT MAX(step) FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s
1210 array(
"integer",
"integer",
"integer",
"integer",
"integer",
"integer"),
1236 $error_text_array = explode(
' ', $this->errortext);
1239 if (array_key_exists(
$index, $error_text_array)) {
1240 return $error_text_array[
$index];
1244 return $error_text_array;
An exception for terminatinating execution or to throw for unit testing.
Class for error text answers.
Class for error text question exports.
Class for error text question imports.
Class for error text questions.
getErrorData()
Get error data.
toXML($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
Returns a QTI xml representation of the question and sets the internal domxml variable with the DOM X...
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
flushErrorData()
Flush error data.
loadFromDb($question_id)
Loads the object from the database.
getTextSize()
Set text size in percent.
getOperators($expression)
Get all available operations for a specific question.
__construct( $title='', $comment='', $author='', $owner=-1, $question='')
assErorText constructor
getAvailableAnswerOptions($index=null)
If index is null, the function returns an array with all anwser options Else it returns the specific ...
getErrorsFromText($a_text="")
__get($value)
Object getter.
createErrorTextExport($selections=null)
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates the object.
savePreviewData(ilAssQuestionPreviewSession $previewSession)
__set($key, $value)
Object setter.
getErrorText()
Get error text.
toJSON()
Returns a JSON representation of the question.
createErrorTextOutput($selections=null, $graphicalOutput=false, $correct_solution=false, $use_link_tags=true)
setTextSize($a_value)
Set text size in percent.
setErrorText($a_value)
Set error text.
getAnswerTableName()
Returns the name of the answer table in the database.
saveToDb($original_id="")
Saves a the object to the database.
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{Creates an Excel worksheet for the detailed cumulated results of this question.object}
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
copyObject($target_questionpool_id, $title="")
Copies an object.
setPointsWrong($a_value)
Set wrong points.
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
calculateReachedPointsFromPreviewSession(ilAssQuestionPreviewSession $previewSession)
getErrorTokenHtml($item, $class, $useLinkTags)
getBestSelection($withPositivePointsOnly=true)
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
getPointsForSelectedPositions($positions)
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
getAdditionalTableName()
Returns the name of the additional question data table in the database.
getPointsWrong()
Get wrong points.
isTokenSelected($counter, array $selection)
isComplete()
Returns true, if a single choice question is complete for use.
getBestSolution($active_id, $pass)
Returns the best solution for a given pass of a participant.
fromXML(&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
Creates a question from a QTI file.
saveAdditionalQuestionDataToDb()
Saves the data for the additional data table.
addErrorData($text_wrong, $text_correct, $points)
getExpressionTypes()
Get all available expression types for a specific question.
getQuestionType()
Returns the question type of the question.
Abstract basic class which is to be extended by the concrete assessment question type classes.
getCurrentSolutionResultSet($active_id, $pass, $authorized=true)
Get a restulset for the current user solution for a this question by active_id and pass.
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="")
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.
deductHintPointsFromReachedPoints(ilAssQuestionPreviewSession $previewSession, $reachedPoints)
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
removeCurrentSolution($active_id, $pass, $authorized=true)
setAuthor($author="")
Sets the authors name of the assQuestion object.
getShuffle()
Gets the shuffle flag.
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.
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.
ensureNonNegativePoints($points)
getParticipantsSolution()
setParticipantsSolution($participantSolution)
static _getLogLanguage()
retrieve the log language for assessment logging
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
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 getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
Class iQuestionCondition.
const PercentageResultExpression
getUserQuestionResult($active_id, $pass)
Get the user solution for a question by active_id and the test pass.
const EmptyAnswerExpression
const ExclusiveResultExpression
const NumberOfResultExpression
Interface ilObjAnswerScoringAdjustable.
Interface ilObjQuestionScoringAdjustable.