ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.assTextQuestion.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
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';
8
23{
32
41 public $keywords;
42
43 public $answers;
44
51
52 /* method for automatic string matching */
54
55 public $keyword_relation = 'any';
56
69 public function __construct(
70 $title = "",
71 $comment = "",
72 $author = "",
73 $owner = -1,
74 $question = ""
75 ) {
76 parent::__construct($title, $comment, $author, $owner, $question);
77 $this->maxNumOfChars = 0;
78 $this->points = 1;
79 $this->answers = array();
80 $this->matchcondition = 0;
81 }
82
88 public function isComplete()
89 {
90 if (strlen($this->title)
91 && $this->author
92 && $this->question
93 && $this->getMaximumPoints() > 0
94 ) {
95 return true;
96 }
97 return false;
98 }
99
105 public function saveToDb($original_id = "")
106 {
110 parent::saveToDb($original_id);
111 }
112
120 public function loadFromDb($question_id)
121 {
122 global $DIC;
123 $ilDB = $DIC['ilDB'];
124
125 $result = $ilDB->queryF(
126 "SELECT qpl_questions.*, " . $this->getAdditionalTableName() . ".* FROM qpl_questions LEFT JOIN " . $this->getAdditionalTableName() . " ON " . $this->getAdditionalTableName() . ".question_fi = qpl_questions.question_id WHERE qpl_questions.question_id = %s",
127 array("integer"),
128 array($question_id)
129 );
130 if ($ilDB->numRows($result) == 1) {
131 $data = $ilDB->fetchAssoc($result);
132 $this->setId($question_id);
133 $this->setObjId($data["obj_fi"]);
134 $this->setTitle($data["title"]);
135 $this->setComment($data["description"]);
136 $this->setOriginalId($data["original_id"]);
137 $this->setNrOfTries($data['nr_of_tries']);
138 $this->setAuthor($data["author"]);
139 $this->setPoints((float) $data["points"]);
140 $this->setOwner($data["owner"]);
141 include_once("./Services/RTE/classes/class.ilRTE.php");
142 $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc($data["question_text"], 1));
143 $this->setShuffle($data["shuffle"]);
144 $this->setMaxNumOfChars($data["maxnumofchars"]);
145 $this->setTextRating($this->isValidTextRating($data["textgap_rating"]) ? $data["textgap_rating"] : TEXTGAP_RATING_CASEINSENSITIVE);
146 $this->matchcondition = (strlen($data['matchcondition'])) ? $data['matchcondition'] : 0;
147 $this->setEstimatedWorkingTime(substr($data["working_time"], 0, 2), substr($data["working_time"], 3, 2), substr($data["working_time"], 6, 2));
148 $this->setKeywordRelation(($data['keyword_relation']));
149
150 try {
151 $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
152 } catch (ilTestQuestionPoolException $e) {
153 }
154 }
155
156 $result = $ilDB->queryF(
157 "SELECT * FROM qpl_a_essay WHERE question_fi = %s",
158 array("integer"),
159 array($this->getId())
160 );
161
162 $this->flushAnswers();
163 while ($row = $ilDB->fetchAssoc($result)) {
164 $this->addAnswer($row['answertext'], $row['points']);
165 }
166
167 parent::loadFromDb($question_id);
168 }
169
175 public function duplicate($for_test = true, $title = "", $author = "", $owner = "", $testObjId = null)
176 {
177 if ($this->id <= 0) {
178 // The question has not been saved. It cannot be duplicated
179 return;
180 }
181 // duplicate the question in database
182 $this_id = $this->getId();
183 $thisObjId = $this->getObjId();
184
185 $clone = $this;
186 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
188 $clone->id = -1;
189
190 if ((int) $testObjId > 0) {
191 $clone->setObjId($testObjId);
192 }
193
194 if ($title) {
195 $clone->setTitle($title);
196 }
197
198 if ($author) {
199 $clone->setAuthor($author);
200 }
201 if ($owner) {
202 $clone->setOwner($owner);
203 }
204
205 if ($for_test) {
206 $clone->saveToDb($original_id);
207 } else {
208 $clone->saveToDb();
209 }
210
211 // copy question page content
212 $clone->copyPageOfQuestion($this_id);
213 // copy XHTML media objects
214 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
215 #$clone->duplicateAnswers($this_id);
216
217 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
218
219 return $clone->id;
220 }
221
227 public function copyObject($target_questionpool_id, $title = "")
228 {
229 if ($this->id <= 0) {
230 // The question has not been saved. It cannot be duplicated
231 return;
232 }
233 // duplicate the question in database
234 $clone = $this;
235 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
237 $clone->id = -1;
238 $source_questionpool_id = $this->getObjId();
239 $clone->setObjId($target_questionpool_id);
240 if ($title) {
241 $clone->setTitle($title);
242 }
243 $clone->saveToDb();
244 // copy question page content
245 $clone->copyPageOfQuestion($original_id);
246 // copy XHTML media objects
247 $clone->copyXHTMLMediaObjectsOfQuestion($original_id);
248 // duplicate answers
249 #$clone->duplicateAnswers($original_id);
250
251 $clone->onCopy($source_questionpool_id, $original_id, $clone->getObjId(), $clone->getId());
252
253 return $clone->id;
254 }
255
256 public function createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle = "")
257 {
258 if ($this->id <= 0) {
259 // The question has not been saved. It cannot be duplicated
260 return;
261 }
262
263 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
264
265 $sourceQuestionId = $this->id;
266 $sourceParentId = $this->getObjId();
267
268 // duplicate the question in database
269 $clone = $this;
270 $clone->id = -1;
271
272 $clone->setObjId($targetParentId);
273
274 if ($targetQuestionTitle) {
275 $clone->setTitle($targetQuestionTitle);
276 }
277
278 $clone->saveToDb();
279 // copy question page content
280 $clone->copyPageOfQuestion($sourceQuestionId);
281 // copy XHTML media objects
282 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
283 // duplicate answers
284 #$clone->duplicateAnswers($sourceQuestionId);
285
286 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
287
288 return $clone->id;
289 }
290
298 public function getMaxNumOfChars()
299 {
300 if (strcmp($this->maxNumOfChars, "") == 0) {
301 return 0;
302 } else {
304 }
305 }
306
314 public function setMaxNumOfChars($maxchars = 0)
315 {
316 $this->maxNumOfChars = $maxchars;
317 }
318
325 public function getMaximumPoints()
326 {
327 if (in_array($this->getKeywordRelation(), self::getScoringModesWithPointsByQuestion())) {
328 return parent::getPoints();
329 }
330
331 $points = 0;
332
333 foreach ($this->answers as $answer) {
334 if ($answer->getPoints() > 0) {
335 $points = $points + $answer->getPoints();
336 }
337 }
338
339 return $points;
340 }
341
342 public function getMinimumPoints()
343 {
344 if (in_array($this->getKeywordRelation(), self::getScoringModesWithPointsByQuestion())) {
345 return 0;
346 }
347
348 $points = 0;
349
350 foreach ($this->answers as $answer) {
351 if ($answer->getPoints() < 0) {
352 $points = $points + $answer->getPoints();
353 }
354 }
355
356 return $points;
357 }
367 public function setReachedPoints($active_id, $points, $pass = null)
368 {
369 global $DIC;
370 $ilDB = $DIC['ilDB'];
371
372 if (($points > 0) && ($points <= $this->getPoints())) {
373 if (is_null($pass)) {
374 $pass = $this->getSolutionMaxPass($active_id);
375 }
376 $affectedRows = $ilDB->manipulateF(
377 "UPDATE tst_test_result SET points = %s WHERE active_fi = %s AND question_fi = %s AND pass = %s",
378 array('float','integer','integer','integer'),
379 array($points, $active_id, $this->getId(), $pass)
380 );
381 self::_updateTestPassResults($active_id, $pass);
382 return true;
383 } else {
384 return true;
385 }
386 }
387
388 private function isValidTextRating($textRating)
389 {
390 switch ($textRating) {
398 return true;
399 }
400
401 return false;
402 }
403
412 public function isKeywordMatching($answertext, $a_keyword)
413 {
414 $result = false;
415 $textrating = $this->getTextRating();
416 include_once "./Services/Utilities/classes/class.ilStr.php";
417 switch ($textrating) {
419 if (ilStr::strPos(ilStr::strToLower($answertext), ilStr::strToLower($a_keyword)) !== false) {
420 return true;
421 }
422 break;
424 if (ilStr::strPos($answertext, $a_keyword) !== false) {
425 return true;
426 }
427 break;
428 }
429
430 // "<p>red</p>" would not match "red" even with distance of 5
431 $answertext = strip_tags($answertext);
432
433 $answerwords = array();
434 if (preg_match_all("/([^\s.]+)/", $answertext, $matches)) {
435 foreach ($matches[1] as $answerword) {
436 array_push($answerwords, trim($answerword));
437 }
438 }
439 foreach ($answerwords as $a_original) {
440 switch ($textrating) {
442 if (levenshtein($a_original, $a_keyword) <= 1) {
443 return true;
444 }
445 break;
447 if (levenshtein($a_original, $a_keyword) <= 2) {
448 return true;
449 }
450 break;
452 if (levenshtein($a_original, $a_keyword) <= 3) {
453 return true;
454 }
455 break;
457 if (levenshtein($a_original, $a_keyword) <= 4) {
458 return true;
459 }
460 break;
462 if (levenshtein($a_original, $a_keyword) <= 5) {
463 return true;
464 }
465 break;
466 }
467 }
468 return $result;
469 }
470
471 protected function calculateReachedPointsForSolution($solution)
472 {
473 // Return min points when keyword relation is NON KEYWORDS
474 if ($this->getKeywordRelation() == 'non') {
475 return $this->getMinimumPoints();
476 }
477
478 // Return min points if there are no answers present.
479 $answers = $this->getAnswers();
480
481 if (count($answers) == 0) {
482 return $this->getMinimumPoints();
483 }
484
485 switch ($this->getKeywordRelation()) {
486 case 'any':
487
488 $points = 0;
489
490 foreach ($answers as $answer) {
491 $qst_answer = $answer->getAnswertext();
492 $user_answer = ' ' . $solution;
493
494 if ($this->isKeywordMatching($user_answer, $qst_answer)) {
495 $points += $answer->getPoints();
496 }
497 }
498
499 break;
500
501 case 'all':
502
503 $points = $this->getMaximumPoints();
504
505 foreach ($answers as $answer) {
506 $qst_answer = $answer->getAnswertext();
507 $user_answer = ' ' . $solution;
508
509 if (!$this->isKeywordMatching($user_answer, $qst_answer)) {
510 $points = 0;
511 break;
512 }
513 }
514
515 break;
516
517 case 'one':
518
519 $points = 0;
520
521 foreach ($answers as $answer) {
522 $qst_answer = $answer->getAnswertext();
523 $user_answer = ' ' . $solution;
524
525 if ($this->isKeywordMatching($user_answer, $qst_answer)) {
526 $points = $this->getMaximumPoints();
527 break;
528 }
529 }
530
531 break;
532 }
533
534 return $points;
535 }
536
547 public function calculateReachedPoints($active_id, $pass = null, $authorizedSolution = true, $returndetails = false)
548 {
549 if ($returndetails) {
550 throw new ilTestException('return details not implemented for ' . __METHOD__);
551 }
552
553 global $DIC;
554 $ilDB = $DIC['ilDB'];
555
556 $points = 0;
557 if (is_null($pass)) {
558 $pass = $this->getSolutionMaxPass($active_id);
559 }
560
561 $result = $this->getCurrentSolutionResultSet($active_id, $pass, $authorizedSolution);
562
563 // Return min points when no answer was given.
564 if ($ilDB->numRows($result) == 0) {
565 return $this->getMinimumPoints();
566 }
567
568 // Return points of points are already on the row.
569 $row = $ilDB->fetchAssoc($result);
570 if ($row["points"] != null) {
571 return $row["points"];
572 }
573
574 return $this->calculateReachedPointsForSolution($row['value1']);
575 }
576
585 public function saveWorkingData($active_id, $pass = null, $authorized = true)
586 {
587 global $DIC;
588 $ilDB = $DIC['ilDB'];
589 $ilUser = $DIC['ilUser'];
590
591 include_once "./Services/Utilities/classes/class.ilStr.php";
592 if (is_null($pass)) {
593 include_once "./Modules/Test/classes/class.ilObjTest.php";
594 $pass = ilObjTest::_getPass($active_id);
595 }
596
597 $entered_values = 0;
598 $text = $this->getSolutionSubmit();
599
600 $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(function () use (&$entered_values, $active_id, $pass, $authorized, $text) {
601 $this->removeCurrentSolution($active_id, $pass, $authorized);
602
603 if (strlen($text)) {
604 $this->saveCurrentSolution($active_id, $pass, trim($text), null, $authorized);
605 $entered_values++;
606 }
607 });
608
609 if ($entered_values) {
610 include_once("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
612 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
613 }
614 } else {
615 include_once("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
617 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_not_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
618 }
619 }
620
621 return true;
622 }
623
627 public function getSolutionSubmit()
628 {
629 $text = ilUtil::stripSlashes($_POST["TEXT"], false);
630
631 if (ilUtil::isHTML($text)) {
632 $text = $this->getHtmlUserSolutionPurifier()->purify($text);
633 }
634
635 return $text;
636 }
637
638 public function saveAdditionalQuestionDataToDb()
639 {
641 global $DIC;
642 $ilDB = $DIC['ilDB'];
643 $ilDB->manipulateF(
644 "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
645 array( "integer" ),
646 array( $this->getId()
647 )
648 );
649
650 $ilDB->manipulateF(
651 "INSERT INTO " . $this->getAdditionalTableName() . " (question_fi, maxnumofchars, keywords,
652 textgap_rating, matchcondition, keyword_relation) VALUES (%s, %s, %s, %s, %s, %s)",
653 array( "integer", "integer", "text", "text", 'integer', 'text' ),
654 array(
655 $this->getId(),
656 $this->getMaxNumOfChars(),
657 null,
658 $this->getTextRating(),
659 $this->matchcondition,
660 $this->getKeywordRelation()
661 )
662 );
663 }
664
665 public function saveAnswerSpecificDataToDb()
666 {
668 global $DIC;
669 $ilDB = $DIC['ilDB'];
670
671 $ilDB->manipulateF(
672 "DELETE FROM qpl_a_essay WHERE question_fi = %s",
673 array( "integer" ),
674 array( $this->getId() )
675 );
676
677 foreach ($this->answers as $answer) {
679 $nextID = $ilDB->nextId('qpl_a_essay');
680 $ilDB->manipulateF(
681 "INSERT INTO qpl_a_essay (answer_id, question_fi, answertext, points) VALUES (%s, %s, %s, %s)",
682 array( "integer", "integer", "text", 'float' ),
683 array(
684 $nextID,
685 $this->getId(),
686 $answer->getAnswertext(),
687 $answer->getPoints()
688 )
689 );
690 }
691 }
692
693 public function createRandomSolution($test_id, $user_id)
694 {
695 }
696
703 public function getQuestionType()
704 {
705 return "assTextQuestion";
706 }
707
715 public function getTextRating()
716 {
717 return $this->text_rating;
718 }
719
727 public function setTextRating($a_text_rating)
728 {
729 switch ($a_text_rating) {
737 $this->text_rating = $a_text_rating;
738 break;
739 default:
740 $this->text_rating = TEXTGAP_RATING_CASEINSENSITIVE;
741 break;
742 }
743 }
744
751 public function getAdditionalTableName()
752 {
753 return "qpl_qst_essay";
754 }
755
761 {
762 return parent::getRTETextWithMediaObjects();
763 }
764
768 public function setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
769 {
770 parent::setExportDetailsXLS($worksheet, $startrow, $active_id, $pass);
771
772 $solutions = $this->getSolutionValues($active_id, $pass);
773
774 $i = 1;
775 $worksheet->setCell($startrow + $i, 0, $this->lng->txt("result"));
776 $worksheet->setBold($worksheet->getColumnCoord(0) . ($startrow + $i));
777
778 require_once 'Modules/Test/classes/class.ilObjAssessmentFolder.php';
779 $assessment_folder = new ilObjAssessmentFolder();
780
781 $string_escaping_org_value = $worksheet->getStringEscaping();
782 if ($assessment_folder->getExportEssayQuestionsWithHtml() == 1) {
783 $worksheet->setStringEscaping(false);
784 }
785
786 if (strlen($solutions[0]["value1"])) {
787 $worksheet->setCell($startrow + $i, 1, $solutions[0]["value1"]);
788 }
789 $i++;
790
791 $worksheet->setStringEscaping($string_escaping_org_value);
792 return $startrow + $i + 1;
793 }
794
798 public function toJSON()
799 {
800 include_once("./Services/RTE/classes/class.ilRTE.php");
801 $result = array();
802 $result['id'] = (int) $this->getId();
803 $result['type'] = (string) $this->getQuestionType();
804 $result['title'] = (string) $this->getTitle();
805 $result['question'] = $this->formatSAQuestion($this->getQuestion());
806 $result['nr_of_tries'] = (int) $this->getNrOfTries();
807 $result['shuffle'] = (bool) $this->getShuffle();
808 $result['maxlength'] = (int) $this->getMaxNumOfChars();
809 return json_encode($result);
810 }
811
812 public function getAnswerCount()
813 {
814 return count($this->answers);
815 }
816
830 public function addAnswer(
831 $answertext = "",
832 $points = 0.0,
833 $points_unchecked = 0.0,
834 $order = 0,
835 $answerimage = ""
836 ) {
837 include_once "./Modules/TestQuestionPool/classes/class.assAnswerMultipleResponseImage.php";
838
839 // add answer
840 $answer = new ASS_AnswerMultipleResponseImage($answertext, $points);
841 $this->answers[] = $answer;
842 }
843
844 public function getAnswers()
845 {
846 return $this->answers;
847 }
848
858 public function getAnswer($index = 0)
859 {
860 if ($index < 0) {
861 return null;
862 }
863 if (count($this->answers) < 1) {
864 return null;
865 }
866 if ($index >= count($this->answers)) {
867 return null;
868 }
869
870 return $this->answers[$index];
871 }
872
881 public function deleteAnswer($index = 0)
882 {
883 if ($index < 0) {
884 return;
885 }
886 if (count($this->answers) < 1) {
887 return;
888 }
889 if ($index >= count($this->answers)) {
890 return;
891 }
892 $answer = $this->answers[$index];
893 if (strlen($answer->getImage())) {
894 $this->deleteImage($answer->getImage());
895 }
896 unset($this->answers[$index]);
897 $this->answers = array_values($this->answers);
898 for ($i = 0; $i < count($this->answers); $i++) {
899 if ($this->answers[$i]->getOrder() > $index) {
900 $this->answers[$i]->setOrder($i);
901 }
902 }
903 }
904
905 public function getAnswerTableName()
906 {
907 return 'qpl_a_essay';
908 }
909
916 public function flushAnswers()
917 {
918 $this->answers = array();
919 }
920
921 public function setAnswers($answers)
922 {
923 if (isset($answers['answer'])) {
924 $count = count($answers['answer']);
925 $withPoints = true;
926 } else {
927 $count = count($answers);
928 $withPoints = false;
929 }
930
931 $this->flushAnswers();
932
933 for ($i = 0; $i < $count; $i++) {
934 if ($withPoints) {
935 $this->addAnswer($answers['answer'][$i], $answers['points'][$i]);
936 } else {
937 $this->addAnswer($answers[$i], 0);
938 }
939 }
940 }
941
943 {
944 global $DIC;
945 $ilDB = $DIC['ilDB'];
946
947 $result = $ilDB->queryF(
948 "SELECT * FROM qpl_a_essay WHERE question_fi = %s",
949 array('integer'),
950 array($original_id)
951 );
952 if ($result->numRows()) {
953 while ($row = $ilDB->fetchAssoc($result)) {
954 $next_id = $ilDB->nextId('qpl_a_essay');
955 $affectedRows = $ilDB->manipulateF(
956 "INSERT INTO qpl_a_essay (answer_id, question_fi, answertext, points)
957 VALUES (%s, %s, %s, %s)",
958 array('integer','integer','text','float'),
959 array($next_id, $this->getId(), $row["answertext"], $row["points"])
960 );
961 }
962 }
963 }
964
965 public function getKeywordRelation()
966 {
968 }
969
974 public function setKeywordRelation($a_relation)
975 {
976 $this->keyword_relation = $a_relation;
977 }
978
979 public static function getValidScoringModes()
980 {
981 return array_merge(self::getScoringModesWithPointsByQuestion(), self::getScoringModesWithPointsByKeyword());
982 }
983
984 public static function getScoringModesWithPointsByQuestion()
985 {
986 return array('non', 'all', 'one');
987 }
988
989 public static function getScoringModesWithPointsByKeyword()
990 {
991 return array('any');
992 }
993
994
1005 public function isAnswered($active_id, $pass = null)
1006 {
1007 $numExistingSolutionRecords = assQuestion::getNumExistingSolutionRecords($active_id, $pass, $this->getId());
1008
1009 return $numExistingSolutionRecords > 0;
1010 }
1011
1022 public static function isObligationPossible($questionId)
1023 {
1024 return true;
1025 }
1026
1027 public function countLetters($text)
1028 {
1029 $text = strip_tags($text);
1030
1031 $text = str_replace('&gt;', '>', $text);
1032 $text = str_replace('&lt;', '<', $text);
1033 $text = str_replace('&nbsp;', ' ', $text);
1034 $text = str_replace('&amp;', '&', $text);
1035
1036 $text = str_replace("\r\n", "\n", $text);
1037 $text = str_replace("\n", "", $text);
1038
1039 return ilStr::strLen($text);
1040 }
1041
1042 public function getLatestAutosaveContent($active_id)
1043 {
1044 $question_fi = $this->getId();
1045
1046 // Do we have an unauthorized result?
1047 $cntresult = $this->db->query('
1048 SELECT count(solution_id) cnt
1049 FROM tst_solutions
1050 WHERE active_fi = ' . $this->db->quote($active_id, 'int') . '
1051 AND question_fi = ' . $this->db->quote($this->getId(), 'int') . '
1052 AND authorized = ' . $this->db->quote(0, 'int')
1053 );
1054 $row = $this->db->fetchAssoc($cntresult);
1055 if($row['cnt'] > 0 ) {
1056 $tresult = $this->db->query('
1057 SELECT value1
1058 FROM tst_solutions
1059 WHERE active_fi = ' . $this->db->quote($active_id, 'int') . '
1060 AND question_fi = ' . $this->db->quote($this->getId(), 'int') . '
1061 AND authorized = ' . $this->db->quote(0, 'int')
1062 );
1063 $trow = $this->db->fetchAssoc($tresult);
1064 return $trow['value1'];
1065 }
1066 return '';
1067 }
1068}
$result
$_POST["username"]
ASS_AnswerBinaryStateImage is a class for answers with a binary state indicator (checked/unchecked,...
An exception for terminatinating execution or to throw for unit testing.
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.
setShuffle($shuffle=true)
Sets the shuffle flag.
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.
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
removeCurrentSolution($active_id, $pass, $authorized=true)
static getNumExistingSolutionRecords($activeId, $pass, $questionId)
returns the number of existing solution records for the given test active / pass and given question i...
setAuthor($author="")
Sets the authors name of the assQuestion object.
getPoints()
Returns the maximum available points for the question.
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.
Class for text questions.
setMaxNumOfChars($maxchars=0)
Sets the maximum number of characters for the text solution.
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
isAnswered($active_id, $pass=null)
returns boolean wether the question is answered during test pass or not
isKeywordMatching($answertext, $a_keyword)
Checks if one of the keywords matches the answertext.
saveToDb($original_id="")
Saves a assTextQuestion object to a database.
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{Creates an Excel worksheet for the detailed cumulated results of this question.object}
loadFromDb($question_id)
Loads a assTextQuestion object from a database.
addAnswer( $answertext="", $points=0.0, $points_unchecked=0.0, $order=0, $answerimage="")
Adds a possible answer for a multiple choice question.
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
isComplete()
Returns true, if a multiple choice question is complete for use.
setKeywordRelation($a_relation)
This method implements a default behaviour.
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
getAnswer($index=0)
Returns an answer with a given index.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
static getScoringModesWithPointsByKeyword()
toJSON()
Returns a JSON representation of the question.
getAnswerTableName()
Returns the name of the answer table in the database.
flushAnswers()
Deletes all answers.
setTextRating($a_text_rating)
Sets the rating option for text comparisons.
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assTextQuestion.
copyObject($target_questionpool_id, $title="")
Copies an assTextQuestion object.
getQuestionType()
Returns the question type of the question.
deleteAnswer($index=0)
Deletes an answer with a given index.
getMaxNumOfChars()
Gets the maximum number of characters for the text solution.
calculateReachedPointsForSolution($solution)
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
createRandomSolution($test_id, $user_id)
isValidTextRating($textRating)
getLatestAutosaveContent($active_id)
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
setReachedPoints($active_id, $points, $pass=null)
Sets the points, a learner has reached answering the question.
__construct( $title="", $comment="", $author="", $owner=-1, $question="")
assTextQuestion constructor
static getScoringModesWithPointsByQuestion()
getTextRating()
Returns the rating option for text comparisons.
duplicateAnswers($original_id)
Class ilObjAssessmentFolder.
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 _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...
static strPos($a_haystack, $a_needle, $a_offset=null)
Definition: class.ilStr.php:30
static strToLower($a_string)
Definition: class.ilStr.php:87
static strLen($a_string)
Definition: class.ilStr.php:78
Base Exception for all Exceptions relating to Modules/Test.
static isHTML($a_text)
Checks if a given string contains HTML or not.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$i
Definition: disco.tpl.php:19
const TEXTGAP_RATING_LEVENSHTEIN5
const TEXTGAP_RATING_LEVENSHTEIN4
const TEXTGAP_RATING_LEVENSHTEIN3
const TEXTGAP_RATING_CASESENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN2
const TEXTGAP_RATING_CASEINSENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN1
Interface ilObjAnswerScoringAdjustable.
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
Interface ilObjQuestionScoringAdjustable.
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
$index
Definition: metadata.php:60
$row
global $DIC
Definition: saml.php:7
global $ilDB
$ilUser
Definition: imgupload.php:18
$data
Definition: bench.php:6
$text
Definition: errorreport.php:18