ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
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
42
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 {
77 parent::__construct($title, $comment, $author, $owner, $question);
78 $this->maxNumOfChars = 0;
79 $this->points = 1;
80 $this->answers = array();
81 $this->matchcondition = 0;
82 }
83
89 public function isComplete()
90 {
91 if (strlen($this->title)
92 && $this->author
93 && $this->question
94 && $this->getMaximumPoints() > 0
95 )
96 {
97 return true;
98 }
99 return false;
100 }
101
107 public function saveToDb($original_id = "")
108 {
112 parent::saveToDb($original_id);
113 }
114
122 function loadFromDb($question_id)
123 {
124 global $ilDB;
125
126 $result = $ilDB->queryF("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 {
132 $data = $ilDB->fetchAssoc($result);
133 $this->setId($question_id);
134 $this->setObjId($data["obj_fi"]);
135 $this->setTitle($data["title"]);
136 $this->setComment($data["description"]);
137 $this->setOriginalId($data["original_id"]);
138 $this->setNrOfTries($data['nr_of_tries']);
139 $this->setAuthor($data["author"]);
140 $this->setPoints((float) $data["points"]);
141 $this->setOwner($data["owner"]);
142 include_once("./Services/RTE/classes/class.ilRTE.php");
143 $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc($data["question_text"], 1));
144 $this->setShuffle($data["shuffle"]);
145 $this->setMaxNumOfChars($data["maxnumofchars"]);
146 $this->setTextRating($this->isValidTextRating($data["textgap_rating"]) ? $data["textgap_rating"] : TEXTGAP_RATING_CASEINSENSITIVE);
147 $this->matchcondition = (strlen($data['matchcondition'])) ? $data['matchcondition'] : 0;
148 $this->setEstimatedWorkingTime(substr($data["working_time"], 0, 2), substr($data["working_time"], 3, 2), substr($data["working_time"], 6, 2));
149 $this->setKeywordRelation(($data['keyword_relation']));
150
151 try
152 {
153 $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
154 }
156 {
157 }
158 }
159
160 $result = $ilDB->queryF("SELECT * FROM qpl_a_essay WHERE question_fi = %s",
161 array("integer"),
162 array($this->getId())
163 );
164
165 $this->flushAnswers();
166 while ($row = $ilDB->fetchAssoc($result))
167 {
168 $this->addAnswer($row['answertext'], $row['points']);
169 }
170
171 parent::loadFromDb($question_id);
172 }
173
179 function duplicate($for_test = true, $title = "", $author = "", $owner = "", $testObjId = null)
180 {
181 if ($this->id <= 0)
182 {
183 // The question has not been saved. It cannot be duplicated
184 return;
185 }
186 // duplicate the question in database
187 $this_id = $this->getId();
188 $thisObjId = $this->getObjId();
189
190 $clone = $this;
191 include_once ("./Modules/TestQuestionPool/classes/class.assQuestion.php");
193 $clone->id = -1;
194
195 if( (int)$testObjId > 0 )
196 {
197 $clone->setObjId($testObjId);
198 }
199
200 if ($title)
201 {
202 $clone->setTitle($title);
203 }
204
205 if ($author)
206 {
207 $clone->setAuthor($author);
208 }
209 if ($owner)
210 {
211 $clone->setOwner($owner);
212 }
213
214 if ($for_test)
215 {
216 $clone->saveToDb($original_id);
217 }
218 else
219 {
220 $clone->saveToDb();
221 }
222
223 // copy question page content
224 $clone->copyPageOfQuestion($this_id);
225 // copy XHTML media objects
226 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
227 #$clone->duplicateAnswers($this_id);
228
229 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
230
231 return $clone->id;
232 }
233
239 function copyObject($target_questionpool_id, $title = "")
240 {
241 if ($this->id <= 0)
242 {
243 // The question has not been saved. It cannot be duplicated
244 return;
245 }
246 // duplicate the question in database
247 $clone = $this;
248 include_once ("./Modules/TestQuestionPool/classes/class.assQuestion.php");
250 $clone->id = -1;
251 $source_questionpool_id = $this->getObjId();
252 $clone->setObjId($target_questionpool_id);
253 if ($title)
254 {
255 $clone->setTitle($title);
256 }
257 $clone->saveToDb();
258 // copy question page content
259 $clone->copyPageOfQuestion($original_id);
260 // copy XHTML media objects
261 $clone->copyXHTMLMediaObjectsOfQuestion($original_id);
262 // duplicate answers
263 #$clone->duplicateAnswers($original_id);
264
265 $clone->onCopy($source_questionpool_id, $original_id, $clone->getObjId(), $clone->getId());
266
267 return $clone->id;
268 }
269
270 public function createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle = "")
271 {
272 if ($this->id <= 0)
273 {
274 // The question has not been saved. It cannot be duplicated
275 return;
276 }
277
278 include_once ("./Modules/TestQuestionPool/classes/class.assQuestion.php");
279
280 $sourceQuestionId = $this->id;
281 $sourceParentId = $this->getObjId();
282
283 // duplicate the question in database
284 $clone = $this;
285 $clone->id = -1;
286
287 $clone->setObjId($targetParentId);
288
289 if ($targetQuestionTitle)
290 {
291 $clone->setTitle($targetQuestionTitle);
292 }
293
294 $clone->saveToDb();
295 // copy question page content
296 $clone->copyPageOfQuestion($sourceQuestionId);
297 // copy XHTML media objects
298 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
299 // duplicate answers
300 #$clone->duplicateAnswers($sourceQuestionId);
301
302 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
303
304 return $clone->id;
305 }
306
315 {
316 if (strcmp($this->maxNumOfChars, "") == 0)
317 {
318 return 0;
319 }
320 else
321 {
323 }
324 }
325
333 function setMaxNumOfChars($maxchars = 0)
334 {
335 $this->maxNumOfChars = $maxchars;
336 }
337
345 {
346 if( in_array($this->getKeywordRelation(), self::getScoringModesWithPointsByQuestion()) )
347 {
348 return parent::getPoints();
349 }
350
351 $points = 0;
352
353 foreach ($this->answers as $answer)
354 {
355 if ($answer->getPoints() > 0)
356 {
357 $points = $points + $answer->getPoints();
358 }
359 }
360
361 return $points;
362 }
363
365 {
366 if( in_array($this->getKeywordRelation(), self::getScoringModesWithPointsByQuestion()) )
367 {
368 return 0;
369 }
370
371 $points = 0;
372
373 foreach ($this->answers as $answer)
374 {
375 if ($answer->getPoints() < 0)
376 {
377 $points = $points + $answer->getPoints();
378 }
379 }
380
381 return $points;
382 }
392 function setReachedPoints($active_id, $points, $pass = NULL)
393 {
394 global $ilDB;
395
396 if (($points > 0) && ($points <= $this->getPoints()))
397 {
398 if (is_null($pass))
399 {
400 $pass = $this->getSolutionMaxPass($active_id);
401 }
402 $affectedRows = $ilDB->manipulateF("UPDATE tst_test_result SET points = %s WHERE active_fi = %s AND question_fi = %s AND pass = %s",
403 array('float','integer','integer','integer'),
404 array($points, $active_id, $this->getId(), $pass)
405 );
406 self::_updateTestPassResults($active_id, $pass);
407 return TRUE;
408 }
409 else
410 {
411 return TRUE;
412 }
413 }
414
415 private function isValidTextRating($textRating)
416 {
417 switch($textRating)
418 {
426 return true;
427 }
428
429 return false;
430 }
431
440 function isKeywordMatching($answertext, $a_keyword)
441 {
442 $result = FALSE;
443 $textrating = $this->getTextRating();
444 include_once "./Services/Utilities/classes/class.ilStr.php";
445 switch ($textrating)
446 {
448 if (ilStr::strPos(ilStr::strToLower($answertext), ilStr::strToLower($a_keyword)) !== false) return TRUE;
449 break;
451 if (ilStr::strPos($answertext, $a_keyword) !== false) return TRUE;
452 break;
453 }
454
455 // "<p>red</p>" would not match "red" even with distance of 5
456 $answertext = strip_tags($answertext);
457
458 $answerwords = array();
459 if (preg_match_all("/([^\s.]+)/", $answertext, $matches))
460 {
461 foreach ($matches[1] as $answerword)
462 {
463 array_push($answerwords, trim($answerword));
464 }
465 }
466 foreach ($answerwords as $a_original)
467 {
468 switch ($textrating)
469 {
471 if (levenshtein($a_original, $a_keyword) <= 1) return TRUE;
472 break;
474 if (levenshtein($a_original, $a_keyword) <= 2) return TRUE;
475 break;
477 if (levenshtein($a_original, $a_keyword) <= 3) return TRUE;
478 break;
480 if (levenshtein($a_original, $a_keyword) <= 4) return TRUE;
481 break;
483 if (levenshtein($a_original, $a_keyword) <= 5) return TRUE;
484 break;
485 }
486 }
487 return $result;
488 }
489
490 protected function calculateReachedPointsForSolution($solution)
491 {
492 // Return min points when keyword relation is NON KEYWORDS
493 if( $this->getKeywordRelation() == 'non' )
494 {
495 return $this->getMinimumPoints();
496 }
497
498 // Return min points if there are no answers present.
499 $answers = $this->getAnswers();
500
501 if (count($answers) == 0)
502 {
503 return $this->getMinimumPoints();
504 }
505
506 switch( $this->getKeywordRelation() )
507 {
508 case 'any':
509
510 $points = 0;
511
512 foreach ($answers as $answer)
513 {
514 $qst_answer = $answer->getAnswertext();
515 $user_answer = ' '.$solution;
516
517 if( $this->isKeywordMatching( $user_answer, $qst_answer ) )
518 {
519 $points += $answer->getPoints();
520 }
521 }
522
523 break;
524
525 case 'all':
526
527 $points = $this->getMaximumPoints();
528
529 foreach ($answers as $answer)
530 {
531 $qst_answer = $answer->getAnswertext();
532 $user_answer = ' '.$solution;
533
534 if( !$this->isKeywordMatching( $user_answer, $qst_answer ) )
535 {
536 $points = 0;
537 break;
538 }
539 }
540
541 break;
542
543 case 'one':
544
545 $points = 0;
546
547 foreach ($answers as $answer)
548 {
549 $qst_answer = $answer->getAnswertext();
550 $user_answer = ' '.$solution;
551
552 if( $this->isKeywordMatching( $user_answer, $qst_answer ) )
553 {
554 $points = $this->getMaximumPoints();
555 break;
556 }
557 }
558
559 break;
560 }
561
562 return $points;
563 }
564
575 public function calculateReachedPoints($active_id, $pass = NULL, $authorizedSolution = true, $returndetails = FALSE)
576 {
577 if( $returndetails )
578 {
579 throw new ilTestException('return details not implemented for '.__METHOD__);
580 }
581
582 global $ilDB;
583
584 $points = 0;
585 if (is_null($pass))
586 {
587 $pass = $this->getSolutionMaxPass($active_id);
588 }
589
590 $result = $this->getCurrentSolutionResultSet($active_id, $pass, $authorizedSolution);
591
592 // Return min points when no answer was given.
593 if ($ilDB->numRows($result) == 0)
594 {
595 return $this->getMinimumPoints();
596 }
597
598 // Return points of points are already on the row.
599 $row = $ilDB->fetchAssoc($result);
600 if ($row["points"] != NULL)
601 {
602 return $row["points"];
603 }
604
605 return $this->calculateReachedPointsForSolution($row['value1']);
606 }
607
616 public function saveWorkingData($active_id, $pass = NULL, $authorized = true)
617 {
618 global $ilDB;
619 global $ilUser;
620
621 include_once "./Services/Utilities/classes/class.ilStr.php";
622 if (is_null($pass))
623 {
624 include_once "./Modules/Test/classes/class.ilObjTest.php";
625 $pass = ilObjTest::_getPass($active_id);
626 }
627
628 $entered_values = 0;
629 $text = $this->getSolutionSubmit();
630
631 $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(function() use (&$entered_values, $active_id, $pass, $authorized, $text) {
632
633 $this->removeCurrentSolution($active_id, $pass, $authorized);
634
635 if(strlen($text))
636 {
637 $this->saveCurrentSolution($active_id, $pass, trim($text), null, $authorized);
638 $entered_values++;
639 }
640
641 });
642
643 if ($entered_values)
644 {
645 include_once ("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
647 {
648 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
649 }
650 }
651 else
652 {
653 include_once ("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
655 {
656 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_not_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
657 }
658 }
659
660 return true;
661 }
662
666 public function getSolutionSubmit()
667 {
668 $text = ilUtil::stripSlashes($_POST["TEXT"], FALSE);
669
670 if( ilUtil::isHTML($text) )
671 {
672 $text = $this->getHtmlUserSolutionPurifier()->purify($text);
673 }
674
675 return $text;
676 }
677
678 public function saveAdditionalQuestionDataToDb()
679 {
681 global $ilDB;
682 $ilDB->manipulateF( "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
683 array( "integer" ),
684 array( $this->getId()
685 )
686 );
687
688 $ilDB->manipulateF( "INSERT INTO " . $this->getAdditionalTableName() . " (question_fi, maxnumofchars, keywords,
689 textgap_rating, matchcondition, keyword_relation) VALUES (%s, %s, %s, %s, %s, %s)",
690 array( "integer", "integer", "text", "text", 'integer', 'text' ),
691 array(
692 $this->getId(),
693 $this->getMaxNumOfChars(),
694 NULL,
695 $this->getTextRating(),
696 $this->matchcondition,
697 $this->getKeywordRelation()
698 )
699 );
700 }
701
702 public function saveAnswerSpecificDataToDb()
703 {
705 global $ilDB;
706
707 $ilDB->manipulateF( "DELETE FROM qpl_a_essay WHERE question_fi = %s",
708 array( "integer" ),
709 array( $this->getId() )
710 );
711
712 foreach ($this->answers as $answer)
713 {
715 $nextID = $ilDB->nextId( 'qpl_a_essay' );
716 $ilDB->manipulateF( "INSERT INTO qpl_a_essay (answer_id, question_fi, answertext, points) VALUES (%s, %s, %s, %s)",
717 array( "integer", "integer", "text", 'float' ),
718 array(
719 $nextID,
720 $this->getId(),
721 $answer->getAnswertext(),
722 $answer->getPoints()
723 )
724 );
725 }
726 }
727
731 protected function reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
732 {
733 // nothing to rework!
734 }
735
736 function createRandomSolution($test_id, $user_id)
737 {
738 }
739
747 {
748 return "assTextQuestion";
749 }
750
758 function getTextRating()
759 {
760 return $this->text_rating;
761 }
762
770 function setTextRating($a_text_rating)
771 {
772 switch ($a_text_rating)
773 {
781 $this->text_rating = $a_text_rating;
782 break;
783 default:
784 $this->text_rating = TEXTGAP_RATING_CASEINSENSITIVE;
785 break;
786 }
787 }
788
796 {
797 return "qpl_qst_essay";
798 }
799
805 {
806 return parent::getRTETextWithMediaObjects();
807 }
808
812 public function setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
813 {
814 parent::setExportDetailsXLS($worksheet, $startrow, $active_id, $pass);
815
816 $solutions = $this->getSolutionValues($active_id, $pass);
817
818 $i = 1;
819 $worksheet->setCell($startrow + $i, 0, $this->lng->txt("result"));
820 $worksheet->setBold($worksheet->getColumnCoord(0) . ($startrow + $i));
821
822 require_once 'Modules/Test/classes/class.ilObjAssessmentFolder.php';
823 $assessment_folder = new ilObjAssessmentFolder();
824
825 $string_escaping_org_value = $worksheet->getStringEscaping();
826 if($assessment_folder->getExportEssayQuestionsWithHtml() == 1)
827 {
828 $worksheet->setStringEscaping(false);
829 }
830
831 if (strlen($solutions[0]["value1"]))
832 {
833 $worksheet->setCell($startrow + $i, 1, $solutions[0]["value1"]);
834 }
835 $i++;
836
837 $worksheet->setStringEscaping($string_escaping_org_value);
838 return $startrow + $i + 1;
839 }
840
844 public function toJSON()
845 {
846 include_once("./Services/RTE/classes/class.ilRTE.php");
847 $result = array();
848 $result['id'] = (int) $this->getId();
849 $result['type'] = (string) $this->getQuestionType();
850 $result['title'] = (string) $this->getTitle();
851 $result['question'] = $this->formatSAQuestion($this->getQuestion());
852 $result['nr_of_tries'] = (int) $this->getNrOfTries();
853 $result['shuffle'] = (bool) $this->getShuffle();
854 $result['maxlength'] = (int) $this->getMaxNumOfChars();
855 return json_encode($result);
856 }
857
858 public function getAnswerCount()
859 {
860 return count($this->answers);
861 }
862
876 public function addAnswer(
877 $answertext = "",
878 $points = 0.0,
879 $points_unchecked = 0.0,
880 $order = 0,
881 $answerimage = ""
882 )
883 {
884 include_once "./Modules/TestQuestionPool/classes/class.assAnswerMultipleResponseImage.php";
885
886 // add answer
887 $answer = new ASS_AnswerMultipleResponseImage($answertext, $points);
888 $this->answers[] = $answer;
889 }
890
891 public function getAnswers()
892 {
893 return $this->answers;
894 }
895
905 function getAnswer($index = 0)
906 {
907 if ($index < 0) return NULL;
908 if (count($this->answers) < 1) return NULL;
909 if ($index >= count($this->answers)) return NULL;
910
911 return $this->answers[$index];
912 }
913
922 function deleteAnswer($index = 0)
923 {
924 if ($index < 0) return;
925 if (count($this->answers) < 1) return;
926 if ($index >= count($this->answers)) return;
927 $answer = $this->answers[$index];
928 if (strlen($answer->getImage())) $this->deleteImage($answer->getImage());
929 unset($this->answers[$index]);
930 $this->answers = array_values($this->answers);
931 for ($i = 0; $i < count($this->answers); $i++)
932 {
933 if ($this->answers[$i]->getOrder() > $index)
934 {
935 $this->answers[$i]->setOrder($i);
936 }
937 }
938 }
939
941 {
942 return 'qpl_a_essay';
943 }
944
951 function flushAnswers()
952 {
953 $this->answers = array();
954 }
955
956 public function setAnswers($answers)
957 {
958 if( isset($answers['answer']) )
959 {
960 $count = count($answers['answer']);
961 $withPoints = true;
962 }
963 else
964 {
965 $count = count($answers);
966 $withPoints = false;
967 }
968
969 $this->flushAnswers();
970
971 for( $i = 0; $i < $count; $i++ )
972 {
973 if($withPoints)
974 {
975 $this->addAnswer($answers['answer'][$i], $answers['points'][$i]);
976 }
977 else
978 {
979 $this->addAnswer($answers[$i], 0);
980 }
981 }
982 }
983
985 {
986 global $ilDB;
987
988 $result = $ilDB->queryF("SELECT * FROM qpl_a_essay WHERE question_fi = %s",
989 array('integer'),
990 array($original_id)
991 );
992 if ($result->numRows())
993 {
994 while ($row = $ilDB->fetchAssoc($result))
995 {
996 $next_id = $ilDB->nextId('qpl_a_essay');
997 $affectedRows = $ilDB->manipulateF(
998 "INSERT INTO qpl_a_essay (answer_id, question_fi, answertext, points)
999 VALUES (%s, %s, %s, %s)",
1000 array('integer','integer','text','float'),
1001 array($next_id, $this->getId(), $row["answertext"], $row["points"])
1002 );
1003 }
1004 }
1005 }
1006
1007 public function getKeywordRelation()
1008 {
1010 }
1011
1016 public function setKeywordRelation($a_relation)
1017 {
1018 $this->keyword_relation = $a_relation;
1019 }
1020
1021 public static function getValidScoringModes()
1022 {
1023 return array_merge(self::getScoringModesWithPointsByQuestion(), self::getScoringModesWithPointsByKeyword());
1024 }
1025
1027 {
1028 return array('non', 'all', 'one');
1029 }
1030
1031 public static function getScoringModesWithPointsByKeyword()
1032 {
1033 return array('any');
1034 }
1035
1036
1047 public function isAnswered($active_id, $pass = NULL)
1048 {
1049 $numExistingSolutionRecords = assQuestion::getNumExistingSolutionRecords($active_id, $pass, $this->getId());
1050
1051 return $numExistingSolutionRecords > 0;
1052 }
1053
1064 public static function isObligationPossible($questionId)
1065 {
1066 return true;
1067 }
1068
1069 public function countLetters($text)
1070 {
1071 $text = strip_tags($text);
1072
1073 $text = str_replace('&gt;', '>', $text);
1074 $text = str_replace('&lt;', '<', $text);
1075 $text = str_replace('&nbsp;', ' ', $text);
1076 $text = str_replace('&amp;', '&', $text);
1077
1078 $text = str_replace("\r\n", "\n", $text);
1079 $text = str_replace("\n", "", $text);
1080
1081 require_once 'Services/Utilities/classes/class.ilStr.php';
1082 return ilStr::strLen($text);
1083 }
1084}
$worksheet
$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.
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.
getSolutionValues($active_id, $pass=NULL, $authorized=true)
Loads solutions of a given user from the database an returns it.
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.
setReachedPoints($active_id, $points, $pass=NULL)
Sets the points, a learner has reached answering the question.
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 ...
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.
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
{Reworks the allready saved working data if neccessary.}
calculateReachedPoints($active_id, $pass=NULL, $authorizedSolution=true, $returndetails=FALSE)
Returns the points, a learner has reached answering the question.
isComplete()
Returns true, if a multiple choice question is complete for use.
setKeywordRelation($a_relation)
This method implements a default behaviour.
getAnswer($index=0)
Returns an answer with a given index.
isAnswered($active_id, $pass=NULL)
returns boolean wether the question is answered during test pass or not
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.
saveWorkingData($active_id, $pass=NULL, $authorized=true)
Saves the learners input of the question to the database.
createRandomSolution($test_id, $user_id)
isValidTextRating($textRating)
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
__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:34
static strToLower($a_string)
static strLen($a_string)
Definition: class.ilStr.php:91
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
$text
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.
global $ilDB
$ilUser
Definition: imgupload.php:18