ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.assTextQuestionGUI.php
Go to the documentation of this file.
1<?php
2
34{
35 protected bool $tiny_mce_enabled;
43 public function __construct($id = -1)
44 {
45 $this->tiny_mce_enabled = (new ilSetting('advanced_editing'))->get('advanced_editing_javascript_editor')
46 === 'tinymce' ? true : false;
48 $this->object = new assTextQuestion();
49 if ($id >= 0) {
50 $this->object->loadFromDb($id);
51 }
52 }
53
57 protected function writePostData(bool $always = false): int
58 {
59 $hasErrors = (!$always) ? $this->editQuestion(true) : false;
60 if (!$hasErrors) {
65 return 0;
66 }
67 return 1;
68 }
69
70 public function editQuestion(
71 bool $checkonly = false,
72 ?bool $is_save_cmd = null
73 ): bool {
74 $save = $is_save_cmd ?? $this->isSaveCommand();
75
76 $form = new ilPropertyFormGUI();
77 $this->editForm = $form;
78
79 $form->setFormAction($this->ctrl->getFormAction($this));
80 $form->setTitle($this->outQuestionType());
81 $form->setMultipart(true);
82 $form->setTableWidth("100%");
83 $form->setId("asstextquestion");
84
88
89
90 $this->populateTaxonomyFormSection($form);
91
93
94 $errors = false;
95
96 if ($save) {
97 $form->setValuesByPost();
98 $errors = !$form->checkInput();
99 $form->setValuesByPost(); // again, because checkInput now performs the whole stripSlashes handling and we need this if we don't want to have duplication of backslashes
100 if ($errors) {
101 $checkonly = false;
102 }
103 }
104
105 if (!$checkonly) {
106 $this->renderEditForm($form);
107 }
108 return $errors;
109 }
110
111 private static function buildAnswerTextOnlyArray($answers): array
112 {
113 $answerTexts = [];
114
115 foreach ($answers as $answer) {
116 $answerTexts[] = $answer->getAnswertext();
117 }
118
119 return $answerTexts;
120 }
121
122 public function magicAfterTestOutput(): void
123 {
124 // TODO - BEGIN: what exactly is done here? cant we use the parent method?
125 $rtestring = ilRTE::_getRTEClassname();
126 $rte = new $rtestring();
127 $rte->addUserTextEditor('textarea.textinput');
128
129 // TODO - END: what exactly is done here? cant we use the parent method?
130 }
131
132 public function getSolutionOutput(
133 int $active_id,
134 ?int $pass = null,
135 bool $graphical_output = false,
136 bool $result_output = false,
137 bool $show_question_only = true,
138 bool $show_feedback = false,
139 bool $show_correct_solution = false,
140 bool $show_manual_scoring = false,
141 bool $show_question_text = true,
142 bool $show_inline_feedback = true
143 ): string {
144 if (($active_id > 0) && (!$show_correct_solution)) {
145 $solution = $this->getUserAnswer($active_id, $pass);
146 } else {
147 $solution = $this->getBestAnswer($this->renderPurposeSupportsFormHtml());
148 }
149
150 return $this->renderSolutionOutput(
151 $solution,
152 $active_id,
153 $pass,
154 $graphical_output,
155 $result_output,
156 $show_question_only,
157 $show_feedback,
158 $show_correct_solution,
159 $show_manual_scoring,
160 $show_question_text,
161 false,
162 false,
163 );
164 }
165
166 public function renderSolutionOutput(
167 mixed $user_solutions,
168 int $active_id,
169 ?int $pass,
170 bool $graphical_output = false,
171 bool $result_output = false,
172 bool $show_question_only = true,
173 bool $show_feedback = false,
174 bool $show_correct_solution = false,
175 bool $show_manual_scoring = false,
176 bool $show_question_text = true,
177 bool $show_autosave_title = false,
178 bool $show_inline_feedback = false,
179 ): ?string {
180
181 $template = new ilTemplate("tpl.il_as_qpl_text_question_output_solution.html", true, true, "components/ILIAS/TestQuestionPool");
182 $solutiontemplate = new ilTemplate("tpl.il_as_tst_solution_output.html", true, true, "components/ILIAS/TestQuestionPool");
183
184 $solution = $this->object->getHtmlUserSolutionPurifier()->purify($user_solutions);
185 if ($this->renderPurposeSupportsFormHtml()) {
186 $template->setCurrentBlock('essay_div');
187 $template->setVariable("DIV_ESSAY", ilLegacyFormElementsUtil::prepareTextareaOutput($solution, true));
188 } else {
189 $template->setCurrentBlock('essay_textarea');
190 $template->setVariable("TA_ESSAY", ilLegacyFormElementsUtil::prepareTextareaOutput($solution, true, true));
191 }
192 $template->parseCurrentBlock();
193
194 if (!$show_correct_solution) {
195 $max_no_of_chars = $this->object->getMaxNumOfChars();
196
197 if ($max_no_of_chars == 0) {
198 $max_no_of_chars = ucfirst($this->lng->txt('unlimited'));
199 }
200
201 $act_no_of_chars = $this->object->countLetters($solution);
202 $template->setVariable("CHARACTER_INFO", '<b>' . $max_no_of_chars . '</b>' .
203 $this->lng->txt('answer_characters') . ' <b>' . $act_no_of_chars . '</b>');
204
205 if ($this->object->isWordCounterEnabled()) {
206 $template->setCurrentBlock('word_count');
207 $template->setVariable(
208 'WORD_COUNT',
209 $this->lng->txt('qst_essay_written_words') .
210 ' <b>' . $this->object->countWords($solution) . '</b>'
211 );
212 $template->parseCurrentBlock();
213 }
214 }
215 if (($active_id > 0) && (!$show_correct_solution)) {
216 if ($graphical_output) {
217 $correctness_icon = $this->generateCorrectnessIconsForCorrectness(self::CORRECTNESS_NOT_OK);
218 $reached_points = $this->object->getReachedPoints($active_id, $pass);
219 if ($reached_points == $this->object->getMaximumPoints()) {
220 $correctness_icon = $this->generateCorrectnessIconsForCorrectness(self::CORRECTNESS_OK);
221 } elseif ($reached_points > 0) {
222 $correctness_icon = $this->generateCorrectnessIconsForCorrectness(self::CORRECTNESS_MOSTLY_OK);
223 }
224 $template->setCurrentBlock("icon_ok");
225 $template->setVariable("ICON_OK", $correctness_icon);
226 $template->parseCurrentBlock();
227 }
228 }
229 if ($show_question_text == true) {
230 $template->setVariable("QUESTIONTEXT", $this->renderLatex(
231 $this->object->getQuestionForHTMLOutput()
232 ));
233 }
234 $questionoutput = $template->get();
235
236 $feedback = '';
237 if ($show_feedback) {
238 if (!$this->isTestPresentationContext()) {
239 $fb = $this->getGenericFeedbackOutput((int) $active_id, $pass);
240 $feedback .= strlen($fb) ? $fb : '';
241 }
242 }
243 if (strlen($feedback)) {
244 $cssClass = (
245 $this->hasCorrectSolution($active_id, $pass) ?
247 );
248
249 $solutiontemplate->setVariable("ILC_FB_CSS_CLASS", $cssClass);
250 $solutiontemplate->setVariable("FEEDBACK", $this->renderLatex(
252 ));
253 }
254
255 $solutiontemplate->setVariable("SOLUTION_OUTPUT", $questionoutput);
256
257 $solutionoutput = $solutiontemplate->get();
258 if (!$show_question_only) {
259 // get page object output
260 $solutionoutput = $this->getILIASPage($solutionoutput);
261 }
262 return $solutionoutput;
263 }
264
266 int $active_id,
267 ?int $pass = null,
268 bool $graphical_output = false,
269 bool $result_output = false,
270 bool $show_question_only = true,
271 bool $show_feedback = false,
272 bool $show_correct_solution = false,
273 bool $show_manual_scoring = false,
274 bool $show_question_text = true,
275 bool $show_autosave_title = false,
276 bool $show_inline_feedback = false,
277 ): string {
278 $user_solution = $this->getUserAnswer($active_id, $pass);
279
280 if (($active_id > 0) && (!$show_correct_solution)) {
281 $solution = $user_solution;
282 } else {
283 $solution = $this->getBestAnswer($this->renderPurposeSupportsFormHtml());
284 }
285
286 $template = new ilTemplate("tpl.il_as_qpl_text_question_output_solution.html", true, true, "components/ILIAS/TestQuestionPool");
287 $solutiontemplate = new ilTemplate("tpl.il_as_tst_solution_output.html", true, true, "components/ILIAS/TestQuestionPool");
288
289 $solution = '';
290 $autosaved_solution = $this->object->getLatestAutosaveContent($active_id, $pass);
291 if ($autosaved_solution !== null) {
292 if ($show_autosave_title) {
293 $template->setCurrentBlock('autosave_title');
294 $template->setVariable('AUTOSAVE_TITLE', $this->lng->txt('autosavecontent'));
295 $template->parseCurrentBlock();
296 }
297 $solution = $this->object->getHtmlUserSolutionPurifier()->purify($autosaved_solution);
298 if ($this->renderPurposeSupportsFormHtml()) {
299 $template->setCurrentBlock('essay_div');
300 $template->setVariable("DIV_ESSAY", ilLegacyFormElementsUtil::prepareTextareaOutput($solution, true));
301 } else {
302 $template->setCurrentBlock('essay_textarea');
303 $template->setVariable("TA_ESSAY", ilLegacyFormElementsUtil::prepareTextareaOutput($solution, true, true));
304 }
305 $template->parseCurrentBlock();
306 }
307
308 if (!$show_correct_solution) {
309 $max_no_of_chars = $this->object->getMaxNumOfChars();
310
311 if ($max_no_of_chars == 0) {
312 $max_no_of_chars = ucfirst($this->lng->txt('unlimited'));
313 }
314
315 $act_no_of_chars = $this->object->countLetters($solution);
316 $template->setVariable("CHARACTER_INFO", '<b>' . $max_no_of_chars . '</b>' .
317 $this->lng->txt('answer_characters') . ' <b>' . $act_no_of_chars . '</b>');
318
319 if ($this->object->isWordCounterEnabled()) {
320 $template->setCurrentBlock('word_count');
321 $template->setVariable(
322 'WORD_COUNT',
323 $this->lng->txt('qst_essay_written_words') .
324 ' <b>' . $this->object->countWords($solution) . '</b>'
325 );
326 $template->parseCurrentBlock();
327 }
328 }
329 if ($show_question_text == true) {
330 $template->setVariable("QUESTIONTEXT", $this->object->getQuestionForHTMLOutput());
331 }
332 $questionoutput = $template->get();
333
334 $feedback = '';
335 if ($show_feedback) {
336 if (!$this->isTestPresentationContext()) {
337 $fb = $this->getGenericFeedbackOutput((int) $active_id, $pass);
338 $feedback .= strlen($fb) ? $fb : '';
339 }
340 }
341 if (strlen($feedback)) {
342 $cssClass = (
343 $this->hasCorrectSolution($active_id, $pass) ?
345 );
346
347 $solutiontemplate->setVariable("ILC_FB_CSS_CLASS", $cssClass);
348 $solutiontemplate->setVariable("FEEDBACK", ilLegacyFormElementsUtil::prepareTextareaOutput($feedback, true));
349 }
350
351 $solutiontemplate->setVariable("SOLUTION_OUTPUT", $questionoutput);
352
353 $solutionoutput = $solutiontemplate->get();
354 if (!$show_question_only) {
355 // get page object output
356 $solutionoutput = $this->getILIASPage($solutionoutput);
357 }
358 return $solutionoutput;
359 }
360
361 private function getBestAnswer($asHtml): string
362 {
363 $answers = $this->object->getAnswers();
364 if (!count($answers)) {
365 return '';
366 }
367
368 if ($asHtml) {
369 $tplFile = 'tpl.il_as_qpl_text_question_best_solution_html.html';
370 } else {
371 $tplFile = 'tpl.il_as_qpl_text_question_best_solution_ta.html';
372 }
373
374 $tpl = new ilTemplate($tplFile, true, true, 'components/ILIAS/TestQuestionPool');
375
376 foreach ($answers as $answer) {
377 $keywordString = '';
378 if (in_array($this->object->getKeywordRelation(), assTextQuestion::getScoringModesWithPointsByKeyword())) {
379 $keywordString .= (string) $answer->getPoints() . ' ';
380 if ($answer->getPoints() === 1.0 || $answer->getPoints() === -1.0) {
381 $keywordString .= $this->lng->txt('point');
382 } else {
383 $keywordString .= $this->lng->txt('points');
384 }
385 $keywordString .= ' ' . $this->lng->txt('for') . ' ';
386 }
387 $keywordString .= $answer->getAnswertext();
388
389 $tpl->setCurrentBlock('keyword');
390 $tpl->setVariable('KEYWORD', $this->renderLatex($keywordString));
391 $tpl->parseCurrentBlock();
392 }
393
394 $tpl->setVariable('KEYWORD_HEADER', $this->lng->txt('solution_contain_keywords'));
395 $tpl->setVariable('SCORING_LABEL', $this->lng->txt('essay_scoring_mode') . ': ');
396
397 switch ($this->object->getKeywordRelation()) {
399 $tpl->setVariable('SCORING_MODE', $this->lng->txt('essay_scoring_mode_keyword_relation_any'));
400 break;
402 $tpl->setVariable('SCORING_MODE', $this->lng->txt('essay_scoring_mode_keyword_relation_all'));
403 break;
405 $tpl->setVariable('SCORING_MODE', $this->lng->txt('essay_scoring_mode_keyword_relation_one'));
406 break;
407 }
408
409 return $tpl->get();
410 }
411
412 private function getUserAnswer($active_id, $pass)
413 {
414 $user_solution = "";
415 $solutions = $this->object->getSolutionValues($active_id, $pass);
416 foreach ($solutions as $idx => $solution_value) {
417 $user_solution = $solution_value["value1"];
418 }
419 return $user_solution;
420 }
421
422 public function getPreview(
423 bool $show_question_only = false,
424 bool $show_inline_feedback = false
425 ): string {
426 $template = new ilTemplate("tpl.il_as_qpl_text_question_output.html", true, true, "components/ILIAS/TestQuestionPool");
427 if ($this->object->getMaxNumOfChars()) {
428 $template->setCurrentBlock("maximum_char_hint");
429 $template->setVariable("MAXIMUM_CHAR_HINT", sprintf($this->lng->txt("text_maximum_chars_allowed"), $this->object->getMaxNumOfChars()));
430 $template->parseCurrentBlock();
431 #mbecker: No such block. $template->setCurrentBlock("has_maxchars");
432 $template->setVariable("MAXCHARS", $this->object->getMaxNumOfChars());
433 $template->parseCurrentBlock();
434 $template->setCurrentBlock("maxchars_counter");
435 $template->setVariable("QID", $this->object->getId());
436 $template->setVariable("MAXCHARS", $this->object->getMaxNumOfChars());
437 $template->setVariable("TEXTBOXSIZE", strlen($this->object->getMaxNumOfChars()));
438 $template->setVariable("CHARACTERS", $this->lng->txt("qst_essay_chars_remaining"));
439 $template->parseCurrentBlock();
440 }
441
442 if ($this->object->isWordCounterEnabled()) {
443 $template->setCurrentBlock("word_counter");
444 $template->setVariable("QID", $this->object->getId());
445 $template->setVariable("WORDCOUNTER", $this->lng->txt("qst_essay_allready_written_words"));
446 $template->parseCurrentBlock();
447 }
448
449 if (is_object($this->getPreviewSession())) {
450 $template->setVariable(
451 "ESSAY",
453 (string) $this->getPreviewSession()->getParticipantsSolution()
454 )
455 );
456 }
457
458 $template->setVariable("QUESTIONTEXT", $this->renderLatex($this->object->getQuestionForHTMLOutput()));
459 $template->setVariable("QID", $this->object->getId());
460
461 $questionoutput = $template->get();
462
463 $questionoutput .= $this->getJsCode();
464
465 if (!$show_question_only) {
466 // get page object output
467 $questionoutput = $this->getILIASPage($questionoutput);
468 }
469 return $questionoutput;
470 }
471
472 public function getTestOutput(
473 int $active_id,
474 int $pass,
475 bool $is_question_postponed = false,
476 array|bool $user_post_solutions = false,
477 bool $show_specific_inline_feedback = false
478 ): string {
479 // get the solution of the user for the active pass or from the last pass if allowed
480 $user_solution = "";
481 if ($active_id) {
482 $solutions = $this->object->getUserSolutionPreferingIntermediate($active_id, $pass);
483 foreach ($solutions as $solution_value) {
484 $user_solution = $solution_value["value1"];
485 }
486
487 if ($this->tiny_mce_enabled) {
488 $user_solution = htmlentities($user_solution);
489 }
490
491 $user_solution = str_replace(['{', '}', '\\'], ['&#123;', '&#125;', '&#92;'], $user_solution);
492 }
493
494 $template = new ilTemplate("tpl.il_as_qpl_text_question_output.html", true, true, "components/ILIAS/TestQuestionPool");
495 if ($this->object->getMaxNumOfChars()) {
496 $template->setCurrentBlock("maximum_char_hint");
497 $template->setVariable("MAXIMUM_CHAR_HINT", sprintf($this->lng->txt("text_maximum_chars_allowed"), $this->object->getMaxNumOfChars()));
498 $template->parseCurrentBlock();
499 $template->setVariable("MAXCHARS", $this->object->getMaxNumOfChars());
500 $template->parseCurrentBlock();
501 $template->setCurrentBlock("maxchars_counter");
502 $template->setVariable("MAXCHARS", $this->object->getMaxNumOfChars());
503 $template->setVariable("QID", $this->object->getId());
504 $template->setVariable("TEXTBOXSIZE", strlen($this->object->getMaxNumOfChars()));
505 $template->setVariable("CHARACTERS", $this->lng->txt("qst_essay_chars_remaining"));
506 $template->parseCurrentBlock();
507 }
508
509 if ($this->object->isWordCounterEnabled()) {
510 $template->setCurrentBlock("word_counter");
511 $template->setVariable("QID", $this->object->getId());
512 $template->setVariable("WORDCOUNTER", $this->lng->txt("qst_essay_allready_written_words"));
513 $template->parseCurrentBlock();
514 }
515
516 $template->setVariable("QID", $this->object->getId());
517 $template->setVariable("ESSAY", $user_solution);
518 $template->setVariable("QUESTIONTEXT", $this->renderLatex($this->object->getQuestionForHTMLOutput()));
519 $questionoutput = $template->get();
520
521 $questionoutput .= $this->getJsCode();
522
523 $pageoutput = $this->outQuestionPage("", $is_question_postponed, $active_id, $questionoutput);
524 return $pageoutput;
525 }
526
527 protected function getJsCode(): string
528 {
529 $tpl = new ilTemplate('tpl.charcounter.html', true, true, 'components/ILIAS/TestQuestionPool');
530
531 $tpl->setCurrentBlock('tinymce_handler');
532 $tpl->touchBlock('tinymce_handler');
533 $tpl->parseCurrentBlock();
534
535 if ($this->object->getMaxNumOfChars() > 0) {
536 $tpl->setCurrentBlock('letter_counter_js');
537 $tpl->setVariable("MAXCHARS", $this->object->getMaxNumOfChars());
538 $tpl->parseCurrentBlock();
539 }
540
541 if ($this->object->isWordCounterEnabled()) {
542 $tpl->setCurrentBlock('word_counter_js');
543 $tpl->touchBlock('word_counter_js');
544 $tpl->parseCurrentBlock();
545 }
546
547 $tpl->setCurrentBlock('counter_js');
548 $tpl->setVariable("QID", $this->object->getId());
549 $tpl->parseCurrentBlock();
550
551 $this->tpl->addOnLoadCode('mcQuestionCharCounterInit();');
552 return $tpl->get();
553 }
554
555 public function addSuggestedSolution(): void
556 {
557 $this->setAdditionalContentEditingModeFromPost();
558 ilSession::set('subquestion_index', 0);
559 $cmd = $this->request_data_collector->rawArray('cmd');
560
561 if ($cmd['addSuggestedSolution'] && $this->writePostData()) {
562 $this->tpl->setOnScreenMessage('info', $this->getErrorMessage());
563 $this->editQuestion();
564 return;
565 }
566 $this->object->saveToDb();
567 $this->ctrl->setParameter($this, 'q_id', $this->object->getId());
568 $this->tpl->setVariable('HEADER', $this->object->getTitleForHTMLOutput());
569 $this->getQuestionTemplate();
570 }
571
572 public function getSpecificFeedbackOutput(array $userSolution): string
573 {
574 return '';
575 }
576
578 {
579 $this->object->setWordCounterEnabled($this->request_data_collector->bool('wordcounter') ?? false);
580 $this->object->setMaxNumOfChars($this->request_data_collector->int('maxchars'));
581 $this->object->setTextRating($this->request_data_collector->string('text_rating'));
582 $this->object->setKeywordRelation($this->request_data_collector->string('scoring_mode'));
583 }
584
586 {
587 $points = 0;
588 switch ($this->object->getKeywordRelation()) {
590 $this->object->setAnswers([]);
591 $points = $this->request_data_collector->float('non_keyword_points');
592 break;
594 $this->object->setAnswers($this->request_data_collector->raw('any_keyword'));
595 $points = $this->object->getMaximumPoints();
596 break;
598 $this->object->setAnswers($this->request_data_collector->raw('all_keyword'));
599 $points = $this->request_data_collector->float('all_keyword_points');
600 break;
602 $this->object->setAnswers($this->request_data_collector->raw('one_keyword'));
603 $points = $this->request_data_collector->float('one_keyword_points');
604 break;
605 }
606 $this->object->setPoints((float) $points);
607 }
608
610 {
611 // wordcounter
612 $wordcounter = new ilCheckboxInputGUI($this->lng->txt('qst_essay_wordcounter_enabled'), 'wordcounter');
613 $wordcounter->setInfo($this->lng->txt('qst_essay_wordcounter_enabled_info'));
614 $wordcounter->setChecked($this->object->isWordCounterEnabled());
615 $form->addItem($wordcounter);
616
617 // maxchars
618 $maxchars = new ilNumberInputGUI($this->lng->txt("maxchars"), "maxchars");
619 $maxchars->setSize(5);
620 $maxchars->setMinValue(1);
621 if ($this->object->getMaxNumOfChars() > 0) {
622 $maxchars->setValue($this->object->getMaxNumOfChars());
623 }
624 $maxchars->setInfo($this->lng->txt("description_maxchars"));
625 $form->addItem($maxchars);
626
627 // text rating
628 $textrating = new ilSelectInputGUI($this->lng->txt("text_rating"), "text_rating");
629 $text_options = [
630 "ci" => $this->lng->txt("cloze_textgap_case_insensitive"),
631 "cs" => $this->lng->txt("cloze_textgap_case_sensitive"),
632 "l1" => sprintf($this->lng->txt("cloze_textgap_levenshtein_of"), "1"),
633 "l2" => sprintf($this->lng->txt("cloze_textgap_levenshtein_of"), "2"),
634 "l3" => sprintf($this->lng->txt("cloze_textgap_levenshtein_of"), "3"),
635 "l4" => sprintf($this->lng->txt("cloze_textgap_levenshtein_of"), "4"),
636 "l5" => sprintf($this->lng->txt("cloze_textgap_levenshtein_of"), "5")
637 ];
638 $textrating->setOptions($text_options);
639 $textrating->setValue($this->object->getTextRating());
640 $form->addItem($textrating);
641
642 return $form;
643 }
644
646 {
647 $scoringMode = new ilRadioGroupInputGUI(
648 $this->lng->txt('essay_scoring_mode'),
649 'scoring_mode'
650 );
651
652 $scoringOptionNone = new ilRadioOption(
653 $this->lng->txt('essay_scoring_mode_without_keywords'),
655 $this->lng->txt(
656 'essay_scoring_mode_without_keywords_desc'
657 )
658 );
659 $scoringOptionAnyKeyword = new ilRadioOption(
660 $this->lng->txt('essay_scoring_mode_keyword_relation_any'),
662 $this->lng->txt(
663 'essay_scoring_mode_keyword_relation_any_desc'
664 )
665 );
666 $scoringOptionAllKeyword = new ilRadioOption(
667 $this->lng->txt('essay_scoring_mode_keyword_relation_all'),
669 $this->lng->txt(
670 'essay_scoring_mode_keyword_relation_all_desc'
671 )
672 );
673 $scoringOptionOneKeyword = new ilRadioOption(
674 $this->lng->txt('essay_scoring_mode_keyword_relation_one'),
676 $this->lng->txt(
677 'essay_scoring_mode_keyword_relation_one_desc'
678 )
679 );
680
681 $scoringMode->addOption($scoringOptionNone);
682 $scoringMode->addOption($scoringOptionAnyKeyword);
683 $scoringMode->addOption($scoringOptionAllKeyword);
684 $scoringMode->addOption($scoringOptionOneKeyword);
685 $scoringMode->setRequired(true);
686 $scoringMode->setValue($this->object->getKeywordRelation());
687
688 if ($this->object->getAnswerCount() == 0) {
689 $this->object->addAnswer("", 1, 0, 0);
690 }
691
692 // Without Keywords
693 $nonKeywordPoints = new ilNumberInputGUI($this->lng->txt("points"), "non_keyword_points");
694 $nonKeywordPoints->allowDecimals(true);
695 $nonKeywordPoints->setValue($this->object->getPoints());
696 $nonKeywordPoints->setRequired(true);
697 $nonKeywordPoints->setSize(3);
698 $nonKeywordPoints->setMinValue(0.0);
699 $nonKeywordPoints->setMinvalueShouldBeGreater(true);
700 $scoringOptionNone->addSubItem($nonKeywordPoints);
701
702 // Any Keyword
703 $anyKeyword = new ilEssayKeywordWizardInputGUI($this->lng->txt("answers"), "any_keyword");
704 $anyKeyword->setRequired(true);
705 $anyKeyword->setQuestionObject($this->object);
706 $anyKeyword->setSingleline(true);
707 $anyKeyword->setValues($this->object->getAnswers());
708 $scoringOptionAnyKeyword->addSubItem($anyKeyword);
709
710 // All Keywords
711 $allKeyword = new ilTextWizardInputGUI($this->lng->txt("answers"), "all_keyword");
712 $allKeyword->setRequired(true);
713 //$allKeyword->setQuestionObject($this->object);
714 //$allKeyword->setSingleline(TRUE);
715 $allKeyword->setValues(self::buildAnswerTextOnlyArray($this->object->getAnswers()));
716 $allKeyword->setMaxLength($anyKeyword->getMaxLength());
717 $scoringOptionAllKeyword->addSubItem($allKeyword);
718 $allKeywordPoints = new ilNumberInputGUI($this->lng->txt("points"), "all_keyword_points");
719 $allKeywordPoints->allowDecimals(true);
720 $allKeywordPoints->setValue($this->object->getPoints());
721 $allKeywordPoints->setRequired(true);
722 $allKeywordPoints->setSize(3);
723 $allKeywordPoints->setMinValue(0.0);
724 $allKeywordPoints->setMinvalueShouldBeGreater(true);
725 $scoringOptionAllKeyword->addSubItem($allKeywordPoints);
726
727 // One Keywords
728 $oneKeyword = new ilTextWizardInputGUI($this->lng->txt("answers"), "one_keyword");
729 $oneKeyword->setRequired(true);
730 //$oneKeyword->setQuestionObject($this->object);
731 //$oneKeyword->setSingleline(TRUE);
732 $oneKeyword->setValues(self::buildAnswerTextOnlyArray($this->object->getAnswers()));
733 $oneKeyword->setMaxLength($anyKeyword->getMaxLength());
734 $scoringOptionOneKeyword->addSubItem($oneKeyword);
735 $oneKeywordPoints = new ilNumberInputGUI($this->lng->txt("points"), "one_keyword_points");
736 $oneKeywordPoints->allowDecimals(true);
737 $oneKeywordPoints->setValue($this->object->getPoints());
738 $oneKeywordPoints->setRequired(true);
739 $oneKeywordPoints->setSize(3);
740 $oneKeywordPoints->setMinValue(0.0);
741 $oneKeywordPoints->setMinvalueShouldBeGreater(true);
742 $scoringOptionOneKeyword->addSubItem($oneKeywordPoints);
743
744 $form->addItem($scoringMode);
745 return $form;
746 }
747
758 {
759 return [];
760 }
761
772 {
773 return [];
774 }
775
777 {
778 return false;
779 }
780
781 public function getAnswersFrequency($relevantAnswers, $questionIndex): array
782 {
783 return [];
784 }
785
787 {
788 $this->populateQuestionSpecificFormPart($form);
789 $this->populateAnswerSpecificFormPart($form);
790
791 $form->removeItemByPostVar('maxchars');
792 }
793
798 {
799 $this->writeQuestionSpecificPostData($form);
800 $this->writeAnswerSpecificPostData($form);
801 }
802}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
return true
populateTaxonomyFormSection(ilPropertyFormGUI $form)
addBasicQuestionFormProperties(ilPropertyFormGUI $form)
renderEditForm(ilPropertyFormGUI $form)
addQuestionFormCommandButtons(ilPropertyFormGUI $form)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getAnswersFrequency($relevantAnswers, $questionIndex)
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
getTestOutput(int $active_id, int $pass, bool $is_question_postponed=false, array|bool $user_post_solutions=false, bool $show_specific_inline_feedback=false)
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from the request and applies them to the data object.
getSolutionOutput(int $active_id, ?int $pass=null, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_inline_feedback=true)
__construct($id=-1)
assTextQuestionGUI constructor
writePostData(bool $always=false)
{Evaluates a posted edit form and writes the form data in the question object.integer A positive valu...
editQuestion(bool $checkonly=false, ?bool $is_save_cmd=null)
renderSolutionOutput(mixed $user_solutions, int $active_id, ?int $pass, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_autosave_title=false, bool $show_inline_feedback=false,)
saveCorrectionsFormProperties(ilPropertyFormGUI $form)
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
Extracts the answer specific values from the request and applies them to the data object.
getPreview(bool $show_question_only=false, bool $show_inline_feedback=false)
getUserAnswer($active_id, $pass)
static buildAnswerTextOnlyArray($answers)
populateAnswerSpecificFormPart(\ilPropertyFormGUI $form)
populateCorrectionsFormProperties(ilPropertyFormGUI $form)
getAutoSavedSolutionOutput(int $active_id, ?int $pass=null, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_autosave_title=false, bool $show_inline_feedback=false,)
getSpecificFeedbackOutput(array $userSolution)
Returns the answer specific feedback for the question.
Class for text questions.
const SCORING_MODE_KEYWORD_RELATION_NONE
static getScoringModesWithPointsByKeyword()
This class represents a checkbox property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static prepareTextareaOutput(string $txt_output, bool $prepare_for_latex_output=false, bool $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output where latex code may be in it If the text is HTML-free,...
static prepareFormOutput($a_str, bool $a_strip=false)
This class represents a number property in a property form.
This class represents a property form user interface.
removeItemByPostVar(string $a_post_var, bool $a_remove_unused_headers=false)
static _getRTEClassname()
This class represents a property in a property form.
This class represents an option in a radio group.
This class represents a selection list property in a property form.
static set(string $a_var, $a_val)
Set a value.
ILIAS Setting Class.
special template class to simplify handling of ITX/PEAR
setCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
This class represents a text wizard property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
getErrorMessage($value)
if(!file_exists('../ilias.ini.php'))