ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
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 $this->_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 $text = $this->getSolutionSubmit();
629
630 $this->getProcessLocker()->requestUserSolutionUpdateLock();
631
632 $this->removeCurrentSolution($active_id, $pass, $authorized);
633
634 $entered_values = 0;
635 if (strlen($text))
636 {
637 $this->saveCurrentSolution($active_id, $pass, trim($text), null, $authorized);
638 $entered_values++;
639 }
640
641 $this->getProcessLocker()->releaseUserSolutionUpdateLock();
642
643 if ($entered_values)
644 {
645 include_once ("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
647 {
648 $this->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 $this->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
736 protected function reworkWorkingData($active_id, $pass, $obligationsAnswered)
737 {
738 // nothing to rework!
739 }
740
741 function createRandomSolution($test_id, $user_id)
742 {
743 }
744
752 {
753 return "assTextQuestion";
754 }
755
763 function getTextRating()
764 {
765 return $this->text_rating;
766 }
767
775 function setTextRating($a_text_rating)
776 {
777 switch ($a_text_rating)
778 {
786 $this->text_rating = $a_text_rating;
787 break;
788 default:
789 $this->text_rating = TEXTGAP_RATING_CASEINSENSITIVE;
790 break;
791 }
792 }
793
801 {
802 return "qpl_qst_essay";
803 }
804
810 {
811 return parent::getRTETextWithMediaObjects();
812 }
813
826 public function setExportDetailsXLS(&$worksheet, $startrow, $active_id, $pass, &$format_title, &$format_bold)
827 {
828 include_once ("./Services/Excel/classes/class.ilExcelUtils.php");
829 $solutions = $this->getSolutionValues($active_id, $pass);
830 $worksheet->writeString($startrow, 0, ilExcelUtils::_convert_text($this->lng->txt($this->getQuestionType())), $format_title);
831 $worksheet->writeString($startrow, 1, ilExcelUtils::_convert_text($this->getTitle()), $format_title);
832 $i = 1;
833 $worksheet->writeString($startrow + $i, 0, ilExcelUtils::_convert_text($this->lng->txt("result")), $format_bold);
834 if (strlen($solutions[0]["value1"]))
835 {
836 $worksheet->write($startrow + $i, 1, ilExcelUtils::_convert_text($solutions[0]["value1"]));
837 }
838 $i++;
839 return $startrow + $i + 1;
840 }
841
845 public function toJSON()
846 {
847 include_once("./Services/RTE/classes/class.ilRTE.php");
848 $result = array();
849 $result['id'] = (int) $this->getId();
850 $result['type'] = (string) $this->getQuestionType();
851 $result['title'] = (string) $this->getTitle();
852 $result['question'] = $this->formatSAQuestion($this->getQuestion());
853 $result['nr_of_tries'] = (int) $this->getNrOfTries();
854 $result['shuffle'] = (bool) $this->getShuffle();
855 $result['maxlength'] = (int) $this->getMaxNumOfChars();
856 return json_encode($result);
857 }
858
859 public function getAnswerCount()
860 {
861 return count($this->answers);
862 }
863
877 public function addAnswer(
878 $answertext = "",
879 $points = 0.0,
880 $points_unchecked = 0.0,
881 $order = 0,
882 $answerimage = ""
883 )
884 {
885 include_once "./Modules/TestQuestionPool/classes/class.assAnswerMultipleResponseImage.php";
886
887 // add answer
888 $answer = new ASS_AnswerMultipleResponseImage($answertext, $points);
889 $this->answers[] = $answer;
890 }
891
892 public function getAnswers()
893 {
894 return $this->answers;
895 }
896
906 function getAnswer($index = 0)
907 {
908 if ($index < 0) return NULL;
909 if (count($this->answers) < 1) return NULL;
910 if ($index >= count($this->answers)) return NULL;
911
912 return $this->answers[$index];
913 }
914
923 function deleteAnswer($index = 0)
924 {
925 if ($index < 0) return;
926 if (count($this->answers) < 1) return;
927 if ($index >= count($this->answers)) return;
928 $answer = $this->answers[$index];
929 if (strlen($answer->getImage())) $this->deleteImage($answer->getImage());
930 unset($this->answers[$index]);
931 $this->answers = array_values($this->answers);
932 for ($i = 0; $i < count($this->answers); $i++)
933 {
934 if ($this->answers[$i]->getOrder() > $index)
935 {
936 $this->answers[$i]->setOrder($i);
937 }
938 }
939 }
940
942 {
943 return 'qpl_a_essay';
944 }
945
952 function flushAnswers()
953 {
954 $this->answers = array();
955 }
956
957 public function setAnswers($answers)
958 {
959 if( isset($answers['answer']) )
960 {
961 $count = count($answers['answer']);
962 $withPoints = true;
963 }
964 else
965 {
966 $count = count($answers);
967 $withPoints = false;
968 }
969
970 $this->flushAnswers();
971
972 for( $i = 0; $i < $count; $i++ )
973 {
974 if($withPoints)
975 {
976 $this->addAnswer($answers['answer'][$i], $answers['points'][$i]);
977 }
978 else
979 {
980 $this->addAnswer($answers[$i], 0);
981 }
982 }
983 }
984
986 {
987 global $ilDB;
988
989 $result = $ilDB->queryF("SELECT * FROM qpl_a_essay WHERE question_fi = %s",
990 array('integer'),
991 array($original_id)
992 );
993 if ($result->numRows())
994 {
995 while ($row = $ilDB->fetchAssoc($result))
996 {
997 $next_id = $ilDB->nextId('qpl_a_essay');
998 $affectedRows = $ilDB->manipulateF(
999 "INSERT INTO qpl_a_essay (answer_id, question_fi, answertext, points)
1000 VALUES (%s, %s, %s, %s)",
1001 array('integer','integer','text','float'),
1002 array($next_id, $this->getId(), $row["answertext"], $row["points"])
1003 );
1004 }
1005 }
1006 }
1007
1008 public function getKeywordRelation()
1009 {
1011 }
1012
1017 public function setKeywordRelation($a_relation)
1018 {
1019 $this->keyword_relation = $a_relation;
1020 }
1021
1022 public static function getValidScoringModes()
1023 {
1024 return array_merge(self::getScoringModesWithPointsByQuestion(), self::getScoringModesWithPointsByKeyword());
1025 }
1026
1028 {
1029 return array('non', 'all', 'one');
1030 }
1031
1032 public static function getScoringModesWithPointsByKeyword()
1033 {
1034 return array('any');
1035 }
1036
1037
1048 public function isAnswered($active_id, $pass = NULL)
1049 {
1050 $numExistingSolutionRecords = assQuestion::getNumExistingSolutionRecords($active_id, $pass, $this->getId());
1051
1052 return $numExistingSolutionRecords > 0;
1053 }
1054
1065 public static function isObligationPossible($questionId)
1066 {
1067 return true;
1068 }
1069
1070 public function countLetters($text)
1071 {
1072 $text = strip_tags($text);
1073
1074 $text = str_replace('&gt;', '>', $text);
1075 $text = str_replace('&lt;', '<', $text);
1076 $text = str_replace('&nbsp;', ' ', $text);
1077 $text = str_replace('&amp;', '&', $text);
1078
1079 $text = str_replace("\r\n", "\n", $text);
1080 $text = str_replace("\n", "", $text);
1081
1082 require_once 'Services/Utilities/classes/class.ilStr.php';
1083 return ilStr::strLen($text);
1084 }
1085}
$result
ASS_AnswerBinaryStateImage is a class for answers with a binary state indicator (checked/unchecked,...
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.
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 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.
logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
removeCurrentSolution($active_id, $pass, $authorized=true, $ignoredSolutionIds=array())
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
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true)
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 ...
setExportDetailsXLS(&$worksheet, $startrow, $active_id, $pass, &$format_title, &$format_bold)
Creates an Excel worksheet for the detailed cumulated results of this question.
isKeywordMatching($answertext, $a_keyword)
Checks if one of the keywords matches the answertext.
saveToDb($original_id="")
Saves a assTextQuestion object to a database.
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 ...
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.
reworkWorkingData($active_id, $pass, $obligationsAnswered)
Reworks the allready saved working data if neccessary.
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)
_convert_text($a_text, $a_target="has been removed")
_getLogLanguage()
retrieve the log language for assessment logging
_enabledAssessmentLogging()
check wether assessment logging is enabled or not
_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)
Definition: class.ilStr.php:91
static strLen($a_string)
Definition: class.ilStr.php:79
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
$_POST['username']
Definition: cron.php:12
$data
$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
global $ilUser
Definition: imgupload.php:15