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 
4 require_once './Modules/TestQuestionPool/classes/class.assQuestion.php';
5 require_once './Modules/Test/classes/inc.AssessmentConstants.php';
6 require_once './Modules/TestQuestionPool/interfaces/interface.ilObjQuestionScoringAdjustable.php';
7 require_once './Modules/TestQuestionPool/interfaces/interface.ilObjAnswerScoringAdjustable.php';
8 
23 {
32 
41  var $keywords;
42 
43  var $answers;
44 
51 
52  /* method for automatic string matching */
53  private $matchcondition;
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 
314  function getMaxNumOfChars()
315  {
316  if (strcmp($this->maxNumOfChars, "") == 0)
317  {
318  return 0;
319  }
320  else
321  {
322  return $this->maxNumOfChars;
323  }
324  }
325 
333  function setMaxNumOfChars($maxchars = 0)
334  {
335  $this->maxNumOfChars = $maxchars;
336  }
337 
344  function getMaximumPoints()
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 
364  function getMinimumPoints()
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 
751  function getQuestionType()
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  {
1010  return $this->keyword_relation;
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 
1027  public static function getScoringModesWithPointsByQuestion()
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 }
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assTextQuestion.
getId()
Gets the id of the assQuestion object.
setExportDetailsXLS(&$worksheet, $startrow, $active_id, $pass, &$format_title, &$format_bold)
Creates an Excel worksheet for the detailed cumulated results of this question.
static _getOriginalId($question_id)
Returns the original id of a question.
formatSAQuestion($a_q)
Format self assessment question.
const TEXTGAP_RATING_LEVENSHTEIN5
static strLen($a_string)
Definition: class.ilStr.php:79
static getScoringModesWithPointsByKeyword()
$_POST['username']
Definition: cron.php:12
static getNumExistingSolutionRecords($activeId, $pass, $questionId)
returns the number of existing solution records for the given test active / pass and given question i...
$result
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
getPoints()
Returns the maximum available points for the question.
const TEXTGAP_RATING_LEVENSHTEIN2
const TEXTGAP_RATING_LEVENSHTEIN1
Abstract basic class which is to be extended by the concrete assessment question type classes...
_getPass($active_id)
Retrieves the actual pass of a given user for a given test.
reworkWorkingData($active_id, $pass, $obligationsAnswered)
Reworks the allready saved working data if neccessary.
_convert_text($a_text, $a_target="has been removed")
isComplete()
Returns true, if a multiple choice question is complete for use.
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
static strPos($a_haystack, $a_needle, $a_offset=NULL)
Definition: class.ilStr.php:34
ASS_AnswerBinaryStateImage is a class for answers with a binary state indicator (checked/unchecked, set/unset) and an image file.
setId($id=-1)
Sets the id of the assQuestion object.
loadFromDb($question_id)
Loads a assTextQuestion object from a database.
saveToDb($original_id="")
Saves a assTextQuestion object to a database.
copyObject($target_questionpool_id, $title="")
Copies an assTextQuestion object.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second. ...
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true)
static strToLower($a_string)
Definition: class.ilStr.php:91
toJSON()
Returns a JSON representation of the question.
setNrOfTries($a_nr_of_tries)
_enabledAssessmentLogging()
check wether assessment logging is enabled or not
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
setShuffle($shuffle=true)
Sets the shuffle flag.
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...
getObjId()
Get the object id of the container object.
getShuffle()
Gets the shuffle flag.
Base Exception for all Exceptions relating to Modules/Test.
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.
__construct( $title="", $comment="", $author="", $owner=-1, $question="")
assTextQuestion constructor
setAuthor($author="")
Sets the authors name of the assQuestion object.
isAnswered($active_id, $pass=NULL)
returns boolean wether the question is answered during test pass or not
isValidTextRating($textRating)
const TEXTGAP_RATING_LEVENSHTEIN3
$data
Class for text questions.
calculateReachedPointsForSolution($solution)
duplicateAnswers($original_id)
removeCurrentSolution($active_id, $pass, $authorized=true, $ignoredSolutionIds=array())
flushAnswers()
Deletes all answers.
static getScoringModesWithPointsByQuestion()
const TEXTGAP_RATING_CASESENSITIVE
setKeywordRelation($a_relation)
This method implements a default behaviour.
Interface ilObjAnswerScoringAdjustable.
setTextRating($a_text_rating)
Sets the rating option for text comparisons.
getQuestion()
Gets the question string of the question object.
setMaxNumOfChars($maxchars=0)
Sets the maximum number of characters for the text solution.
getQuestionType()
Returns the question type of the question.
isKeywordMatching($answertext, $a_keyword)
Checks if one of the keywords matches the answertext.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
getAnswer($index=0)
Returns an answer with a given index.
_getLogLanguage()
retrieve the log language for assessment logging
deleteAnswer($index=0)
Deletes an answer with a given index.
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
setPoints($a_points)
Sets the maximum available points for the question.
addAnswer( $answertext="", $points=0.0, $points_unchecked=0.0, $order=0, $answerimage="")
Adds a possible answer for a multiple choice question.
saveQuestionDataToDb($original_id="")
setReachedPoints($active_id, $points, $pass=NULL)
Sets the points, a learner has reached answering the question.
getMaxNumOfChars()
Gets the maximum number of characters for the text solution.
global $ilUser
Definition: imgupload.php:15
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
setQuestion($question="")
Sets the question string of the question object.
Interface ilObjQuestionScoringAdjustable.
const TEXTGAP_RATING_LEVENSHTEIN4
global $ilDB
setOriginalId($original_id)
getCurrentSolutionResultSet($active_id, $pass, $authorized=true)
Get a restulset for the current user solution for a this question by active_id and pass...
$text
getSolutionValues($active_id, $pass=NULL, $authorized=true)
Loads solutions of a given user from the database an returns it.
logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
getTitle()
Gets the title string of the assQuestion object.
calculateReachedPoints($active_id, $pass=NULL, $authorizedSolution=true, $returndetails=FALSE)
Returns the points, a learner has reached answering the question.
static isHTML($a_text)
Checks if a given string contains HTML or not.
getTextRating()
Returns the rating option for text comparisons.
setTitle($title="")
Sets the title string of the assQuestion object.
setObjId($obj_id=0)
Set the object id of the container object.
setComment($comment="")
Sets the comment string of the assQuestion object.
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
const TEXTGAP_RATING_CASEINSENSITIVE
createRandomSolution($test_id, $user_id)