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