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 
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  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 
746  function getQuestionType()
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'),
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  {
1009  return $this->keyword_relation;
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 
1026  public static function getScoringModesWithPointsByQuestion()
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 }
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assTextQuestion.
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
getId()
Gets the id of the assQuestion object.
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{}
static _getOriginalId($question_id)
Returns the original id of a question.
formatSAQuestion($a_q)
Format self assessment question.
const TEXTGAP_RATING_LEVENSHTEIN5
$worksheet
static strLen($a_string)
Definition: class.ilStr.php:91
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
static getScoringModesWithPointsByKeyword()
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...
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. ...
Add rich text string
The name of the decorator.
static strToLower($a_string)
toJSON()
Returns a JSON representation of the question.
setNrOfTries($a_nr_of_tries)
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.
static _getLogLanguage()
retrieve the log language for assessment logging
__construct( $title="", $comment="", $author="", $owner=-1, $question="")
assTextQuestion constructor
setAuthor($author="")
Sets the authors name of the assQuestion object.
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
isAnswered($active_id, $pass=NULL)
returns boolean wether the question is answered during test pass or not
isValidTextRating($textRating)
const TEXTGAP_RATING_LEVENSHTEIN3
Class for text questions.
calculateReachedPointsForSolution($solution)
duplicateAnswers($original_id)
flushAnswers()
Deletes all answers.
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
Class ilObjAssessmentFolder.
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.
$ilUser
Definition: imgupload.php:18
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.
Create styles array
The data for the language used.
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.
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.
removeCurrentSolution($active_id, $pass, $authorized=true)
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.
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.
$_POST["username"]
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
{}
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
const TEXTGAP_RATING_CASEINSENSITIVE
createRandomSolution($test_id, $user_id)