45 $this->tiny_mce_enabled = (
new ilSetting(
'advanced_editing'))->
get(
'advanced_editing_javascript_editor')
46 ===
'tinymce' ? true :
false;
50 $this->
object->loadFromDb(
$id);
59 $hasErrors = (!$always) ? $this->
editQuestion(
true) :
false;
71 bool $checkonly =
false,
72 ?
bool $is_save_cmd = null
77 $this->editForm = $form;
79 $form->setFormAction($this->
ctrl->getFormAction($this));
81 $form->setMultipart(
true);
82 $form->setTableWidth(
"100%");
83 $form->setId(
"asstextquestion");
97 $form->setValuesByPost();
98 $errors = !$form->checkInput();
99 $form->setValuesByPost();
115 foreach ($answers as $answer) {
116 $answerTexts[] = $answer->getAnswertext();
126 $rte =
new $rtestring();
127 $rte->addUserTextEditor(
'textarea.textinput');
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 144 if (($active_id > 0) && (!$show_correct_solution)) {
158 $show_correct_solution,
159 $show_manual_scoring,
167 mixed $user_solutions,
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,
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");
184 $solution = $this->
object->getHtmlUserSolutionPurifier()->purify($user_solutions);
186 $template->setCurrentBlock(
'essay_div');
189 $template->setCurrentBlock(
'essay_textarea');
192 $template->parseCurrentBlock();
194 if (!$show_correct_solution) {
195 $max_no_of_chars = $this->
object->getMaxNumOfChars();
197 if ($max_no_of_chars == 0) {
198 $max_no_of_chars = ucfirst($this->
lng->txt(
'unlimited'));
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>');
205 if ($this->
object->isWordCounterEnabled()) {
206 $template->setCurrentBlock(
'word_count');
207 $template->setVariable(
209 $this->
lng->txt(
'qst_essay_written_words') .
210 ' <b>' . $this->
object->countWords($solution) .
'</b>' 212 $template->parseCurrentBlock();
215 if (($active_id > 0) && (!$show_correct_solution)) {
216 if ($graphical_output) {
218 $reached_points = $this->
object->getReachedPoints($active_id, $pass);
219 if ($reached_points == $this->
object->getMaximumPoints()) {
221 } elseif ($reached_points > 0) {
224 $template->setCurrentBlock(
"icon_ok");
225 $template->setVariable(
"ICON_OK", $correctness_icon);
226 $template->parseCurrentBlock();
229 if ($show_question_text ==
true) {
230 $template->setVariable(
"QUESTIONTEXT", $this->
object->getQuestionForHTMLOutput());
232 $questionoutput = $template->get();
235 if ($show_feedback) {
238 $feedback .= strlen($fb) ? $fb :
'';
241 if (strlen($feedback)) {
247 $solutiontemplate->setVariable(
"ILC_FB_CSS_CLASS", $cssClass);
251 $solutiontemplate->setVariable(
"SOLUTION_OUTPUT", $questionoutput);
253 $solutionoutput = $solutiontemplate->get();
254 if (!$show_question_only) {
258 return $solutionoutput;
264 bool $graphical_output =
false,
265 bool $result_output =
false,
266 bool $show_question_only =
true,
267 bool $show_feedback =
false,
268 bool $show_correct_solution =
false,
269 bool $show_manual_scoring =
false,
270 bool $show_question_text =
true,
271 bool $show_autosave_title =
false,
272 bool $show_inline_feedback =
false,
276 if (($active_id > 0) && (!$show_correct_solution)) {
277 $solution = $user_solution;
282 $template =
new ilTemplate(
"tpl.il_as_qpl_text_question_output_solution.html",
true,
true,
"components/ILIAS/TestQuestionPool");
283 $solutiontemplate =
new ilTemplate(
"tpl.il_as_tst_solution_output.html",
true,
true,
"components/ILIAS/TestQuestionPool");
286 $autosaved_solution = $this->
object->getLatestAutosaveContent($active_id, $pass);
287 if ($autosaved_solution !== null) {
288 if ($show_autosave_title) {
289 $template->setCurrentBlock(
'autosave_title');
290 $template->setVariable(
'AUTOSAVE_TITLE', $this->
lng->txt(
'autosavecontent'));
291 $template->parseCurrentBlock();
293 $solution = $this->
object->getHtmlUserSolutionPurifier()->purify($autosaved_solution);
295 $template->setCurrentBlock(
'essay_div');
298 $template->setCurrentBlock(
'essay_textarea');
301 $template->parseCurrentBlock();
304 if (!$show_correct_solution) {
305 $max_no_of_chars = $this->
object->getMaxNumOfChars();
307 if ($max_no_of_chars == 0) {
308 $max_no_of_chars = ucfirst($this->
lng->txt(
'unlimited'));
311 $act_no_of_chars = $this->
object->countLetters($solution);
312 $template->setVariable(
"CHARACTER_INFO",
'<b>' . $max_no_of_chars .
'</b>' .
313 $this->
lng->txt(
'answer_characters') .
' <b>' . $act_no_of_chars .
'</b>');
315 if ($this->
object->isWordCounterEnabled()) {
316 $template->setCurrentBlock(
'word_count');
317 $template->setVariable(
319 $this->
lng->txt(
'qst_essay_written_words') .
320 ' <b>' . $this->
object->countWords($solution) .
'</b>' 322 $template->parseCurrentBlock();
325 if ($show_question_text ==
true) {
326 $template->setVariable(
"QUESTIONTEXT", $this->
object->getQuestionForHTMLOutput());
328 $questionoutput = $template->get();
331 if ($show_feedback) {
334 $feedback .= strlen($fb) ? $fb :
'';
337 if (strlen($feedback)) {
343 $solutiontemplate->setVariable(
"ILC_FB_CSS_CLASS", $cssClass);
347 $solutiontemplate->setVariable(
"SOLUTION_OUTPUT", $questionoutput);
349 $solutionoutput = $solutiontemplate->get();
350 if (!$show_question_only) {
354 return $solutionoutput;
359 $answers = $this->
object->getAnswers();
360 if (!count($answers)) {
365 $tplFile =
'tpl.il_as_qpl_text_question_best_solution_html.html';
367 $tplFile =
'tpl.il_as_qpl_text_question_best_solution_ta.html';
370 $tpl =
new ilTemplate($tplFile,
true,
true,
'components/ILIAS/TestQuestionPool');
372 foreach ($answers as $answer) {
375 $keywordString .= (string) $answer->getPoints() .
' ';
376 if ($answer->getPoints() === 1.0 || $answer->getPoints() === -1.0) {
377 $keywordString .= $this->
lng->txt(
'point');
379 $keywordString .= $this->
lng->txt(
'points');
381 $keywordString .=
' ' . $this->
lng->txt(
'for') .
' ';
383 $keywordString .= $answer->getAnswertext();
393 switch ($this->
object->getKeywordRelation()) {
395 $tpl->
setVariable(
'SCORING_MODE', $this->
lng->txt(
'essay_scoring_mode_keyword_relation_any'));
398 $tpl->
setVariable(
'SCORING_MODE', $this->
lng->txt(
'essay_scoring_mode_keyword_relation_all'));
401 $tpl->
setVariable(
'SCORING_MODE', $this->
lng->txt(
'essay_scoring_mode_keyword_relation_one'));
411 $solutions = $this->
object->getSolutionValues($active_id, $pass);
412 foreach ($solutions as $idx => $solution_value) {
413 $user_solution = $solution_value[
"value1"];
415 return $user_solution;
419 bool $show_question_only =
false,
420 bool $show_inline_feedback =
false 422 $template =
new ilTemplate(
"tpl.il_as_qpl_text_question_output.html",
true,
true,
"components/ILIAS/TestQuestionPool");
423 if ($this->
object->getMaxNumOfChars()) {
424 $template->setCurrentBlock(
"maximum_char_hint");
425 $template->setVariable(
"MAXIMUM_CHAR_HINT", sprintf($this->
lng->txt(
"text_maximum_chars_allowed"), $this->
object->getMaxNumOfChars()));
426 $template->parseCurrentBlock();
427 #mbecker: No such block. $template->setCurrentBlock("has_maxchars"); 428 $template->setVariable(
"MAXCHARS", $this->
object->getMaxNumOfChars());
429 $template->parseCurrentBlock();
430 $template->setCurrentBlock(
"maxchars_counter");
431 $template->setVariable(
"QID", $this->
object->getId());
432 $template->setVariable(
"MAXCHARS", $this->
object->getMaxNumOfChars());
433 $template->setVariable(
"TEXTBOXSIZE", strlen($this->
object->getMaxNumOfChars()));
434 $template->setVariable(
"CHARACTERS", $this->
lng->txt(
"qst_essay_chars_remaining"));
435 $template->parseCurrentBlock();
438 if ($this->
object->isWordCounterEnabled()) {
439 $template->setCurrentBlock(
"word_counter");
440 $template->setVariable(
"QID", $this->
object->getId());
441 $template->setVariable(
"WORDCOUNTER", $this->
lng->txt(
"qst_essay_allready_written_words"));
442 $template->parseCurrentBlock();
446 $template->setVariable(
454 $template->setVariable(
"QUESTIONTEXT", $this->
object->getQuestionForHTMLOutput());
455 $template->setVariable(
"QID", $this->
object->getId());
457 $questionoutput = $template->get();
461 if (!$show_question_only) {
465 return $questionoutput;
471 bool $is_question_postponed =
false,
472 array|
bool $user_post_solutions =
false,
473 bool $show_specific_inline_feedback =
false 478 $solutions = $this->
object->getUserSolutionPreferingIntermediate($active_id, $pass);
479 foreach ($solutions as $solution_value) {
480 $user_solution = $solution_value[
"value1"];
483 if ($this->tiny_mce_enabled) {
484 $user_solution = htmlentities($user_solution);
487 $user_solution = str_replace([
'{',
'}',
'\\'], [
'{',
'}',
'\'], $user_solution);
490 $template =
new ilTemplate(
"tpl.il_as_qpl_text_question_output.html",
true,
true,
"components/ILIAS/TestQuestionPool");
491 if ($this->
object->getMaxNumOfChars()) {
492 $template->setCurrentBlock(
"maximum_char_hint");
493 $template->setVariable(
"MAXIMUM_CHAR_HINT", sprintf($this->
lng->txt(
"text_maximum_chars_allowed"), $this->
object->getMaxNumOfChars()));
494 $template->parseCurrentBlock();
495 $template->setVariable(
"MAXCHARS", $this->
object->getMaxNumOfChars());
496 $template->parseCurrentBlock();
497 $template->setCurrentBlock(
"maxchars_counter");
498 $template->setVariable(
"MAXCHARS", $this->
object->getMaxNumOfChars());
499 $template->setVariable(
"QID", $this->
object->getId());
500 $template->setVariable(
"TEXTBOXSIZE", strlen($this->
object->getMaxNumOfChars()));
501 $template->setVariable(
"CHARACTERS", $this->
lng->txt(
"qst_essay_chars_remaining"));
502 $template->parseCurrentBlock();
505 if ($this->
object->isWordCounterEnabled()) {
506 $template->setCurrentBlock(
"word_counter");
507 $template->setVariable(
"QID", $this->
object->getId());
508 $template->setVariable(
"WORDCOUNTER", $this->
lng->txt(
"qst_essay_allready_written_words"));
509 $template->parseCurrentBlock();
512 $template->setVariable(
"QID", $this->
object->getId());
513 $template->setVariable(
"ESSAY", $user_solution);
514 $template->setVariable(
"QUESTIONTEXT", $this->
object->getQuestionForHTMLOutput());
515 $questionoutput = $template->get();
519 $pageoutput = $this->
outQuestionPage(
"", $is_question_postponed, $active_id, $questionoutput);
525 $tpl =
new ilTemplate(
'tpl.charcounter.html',
true,
true,
'components/ILIAS/TestQuestionPool');
531 if ($this->
object->getMaxNumOfChars() > 0) {
537 if ($this->
object->isWordCounterEnabled()) {
547 $this->tpl->addOnLoadCode(
'mcQuestionCharCounterInit();');
555 $cmd = $this->request_data_collector->rawArray(
'cmd');
557 if ($cmd[
'addSuggestedSolution'] && $this->
writePostData()) {
562 $this->
object->saveToDb();
563 $this->
ctrl->setParameter($this,
'q_id', $this->
object->getId());
564 $this->tpl->setVariable(
'HEADER', $this->
object->getTitleForHTMLOutput());
575 $this->
object->setWordCounterEnabled($this->request_data_collector->bool(
'wordcounter') ??
false);
576 $this->
object->setMaxNumOfChars($this->request_data_collector->int(
'maxchars'));
577 $this->
object->setTextRating($this->request_data_collector->string(
'text_rating'));
578 $this->
object->setKeywordRelation($this->request_data_collector->string(
'scoring_mode'));
584 switch ($this->
object->getKeywordRelation()) {
586 $this->
object->setAnswers([]);
587 $points = $this->request_data_collector->float(
'non_keyword_points');
590 $this->
object->setAnswers($this->request_data_collector->raw(
'any_keyword'));
591 $points = $this->
object->getMaximumPoints();
594 $this->
object->setAnswers($this->request_data_collector->raw(
'all_keyword'));
595 $points = $this->request_data_collector->float(
'all_keyword_points');
598 $this->
object->setAnswers($this->request_data_collector->raw(
'one_keyword'));
599 $points = $this->request_data_collector->float(
'one_keyword_points');
602 $this->
object->setPoints((
float) $points);
608 $wordcounter =
new ilCheckboxInputGUI($this->
lng->txt(
'qst_essay_wordcounter_enabled'),
'wordcounter');
609 $wordcounter->setInfo($this->
lng->txt(
'qst_essay_wordcounter_enabled_info'));
610 $wordcounter->setChecked($this->
object->isWordCounterEnabled());
615 $maxchars->setSize(5);
616 $maxchars->setMinValue(1);
617 if ($this->
object->getMaxNumOfChars() > 0) {
618 $maxchars->setValue($this->
object->getMaxNumOfChars());
620 $maxchars->setInfo($this->
lng->txt(
"description_maxchars"));
626 "ci" => $this->
lng->txt(
"cloze_textgap_case_insensitive"),
627 "cs" => $this->
lng->txt(
"cloze_textgap_case_sensitive"),
628 "l1" => sprintf($this->
lng->txt(
"cloze_textgap_levenshtein_of"),
"1"),
629 "l2" => sprintf($this->
lng->txt(
"cloze_textgap_levenshtein_of"),
"2"),
630 "l3" => sprintf($this->
lng->txt(
"cloze_textgap_levenshtein_of"),
"3"),
631 "l4" => sprintf($this->
lng->txt(
"cloze_textgap_levenshtein_of"),
"4"),
632 "l5" => sprintf($this->
lng->txt(
"cloze_textgap_levenshtein_of"),
"5")
635 $textrating->setValue($this->
object->getTextRating());
644 $this->
lng->txt(
'essay_scoring_mode'),
649 $this->
lng->txt(
'essay_scoring_mode_without_keywords'),
652 'essay_scoring_mode_without_keywords_desc' 656 $this->
lng->txt(
'essay_scoring_mode_keyword_relation_any'),
659 'essay_scoring_mode_keyword_relation_any_desc' 663 $this->
lng->txt(
'essay_scoring_mode_keyword_relation_all'),
666 'essay_scoring_mode_keyword_relation_all_desc' 670 $this->
lng->txt(
'essay_scoring_mode_keyword_relation_one'),
673 'essay_scoring_mode_keyword_relation_one_desc' 677 $scoringMode->addOption($scoringOptionNone);
678 $scoringMode->addOption($scoringOptionAnyKeyword);
679 $scoringMode->addOption($scoringOptionAllKeyword);
680 $scoringMode->addOption($scoringOptionOneKeyword);
681 $scoringMode->setRequired(
true);
684 if ($this->
object->getAnswerCount() == 0) {
685 $this->
object->addAnswer(
"", 1, 0, 0);
690 $nonKeywordPoints->allowDecimals(
true);
691 $nonKeywordPoints->setValue($this->
object->getPoints());
692 $nonKeywordPoints->setRequired(
true);
693 $nonKeywordPoints->setSize(3);
694 $nonKeywordPoints->setMinValue(0.0);
695 $nonKeywordPoints->setMinvalueShouldBeGreater(
true);
696 $scoringOptionNone->
addSubItem($nonKeywordPoints);
701 $anyKeyword->setQuestionObject($this->
object);
702 $anyKeyword->setSingleline(
true);
703 $anyKeyword->setValues($this->
object->getAnswers());
704 $scoringOptionAnyKeyword->
addSubItem($anyKeyword);
711 $allKeyword->setValues(self::buildAnswerTextOnlyArray($this->
object->getAnswers()));
712 $allKeyword->setMaxLength($anyKeyword->getMaxLength());
713 $scoringOptionAllKeyword->
addSubItem($allKeyword);
715 $allKeywordPoints->allowDecimals(
true);
716 $allKeywordPoints->setValue($this->
object->getPoints());
717 $allKeywordPoints->setRequired(
true);
718 $allKeywordPoints->setSize(3);
719 $allKeywordPoints->setMinValue(0.0);
720 $allKeywordPoints->setMinvalueShouldBeGreater(
true);
721 $scoringOptionAllKeyword->
addSubItem($allKeywordPoints);
728 $oneKeyword->setValues(self::buildAnswerTextOnlyArray($this->
object->getAnswers()));
729 $oneKeyword->setMaxLength($anyKeyword->getMaxLength());
730 $scoringOptionOneKeyword->
addSubItem($oneKeyword);
732 $oneKeywordPoints->allowDecimals(
true);
733 $oneKeywordPoints->setValue($this->
object->getPoints());
734 $oneKeywordPoints->setRequired(
true);
735 $oneKeywordPoints->setSize(3);
736 $oneKeywordPoints->setMinValue(0.0);
737 $oneKeywordPoints->setMinvalueShouldBeGreater(
true);
738 $scoringOptionOneKeyword->
addSubItem($oneKeywordPoints);
static _getRTEClassname()
isTestPresentationContext()
setAdditionalContentEditingModeFromPost()
hasCorrectSolution($activeId, $passIndex)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getAnswersFrequency($relevantAnswers, $questionIndex)
generateCorrectnessIconsForCorrectness(int $correctness)
static getScoringModesWithPointsByKeyword()
setCurrentBlock(string $blockname=self::DEFAULT_BLOCK)
Sets the template to the given block.
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)
const SCORING_MODE_KEYWORD_RELATION_ALL
__construct($id=-1)
assTextQuestionGUI constructor
populateCorrectionsFormProperties(ilPropertyFormGUI $form)
addBasicQuestionFormProperties(ilPropertyFormGUI $form)
parseCurrentBlock(string $blockname=self::DEFAULT_BLOCK)
Parses the given block.
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
Extracts the answer specific values from the request and applies them to the data object...
const SCORING_MODE_KEYWORD_RELATION_ONE
const CSS_CLASS_FEEDBACK_CORRECT
ilGlobalPageTemplate $tpl
editQuestion(bool $checkonly=false, ?bool $is_save_cmd=null)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
populateTaxonomyFormSection(ilPropertyFormGUI $form)
addQuestionFormCommandButtons(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)
Class for text questions.
writeQuestionGenericPostData()
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
getUserAnswer($active_id, $pass)
setValue(string $a_value)
getSpecificFeedbackOutput(array $userSolution)
const CSS_CLASS_FEEDBACK_WRONG
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
writePostData(bool $always=false)
{}
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,)
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,)
touchBlock(string $blockname)
overwrites ITX::touchBlock.
static buildAnswerTextOnlyArray($answers)
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
saveTaxonomyAssignments()
getILIASPage(string $html="")
Returns the ILIAS Page around a question.
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from the request and applies them to the data object...
saveCorrectionsFormProperties(ilPropertyFormGUI $form)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="", $inlineFeedbackEnabled=false)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
__construct(Container $dic, ilPlugin $plugin)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getPreview(bool $show_question_only=false, bool $show_inline_feedback=false)
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...
const SCORING_MODE_KEYWORD_RELATION_NONE
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
const SCORING_MODE_KEYWORD_RELATION_ANY
setVariable(string $variable, $value='')
Sets the given variable to the given value.
static set(string $a_var, $a_val)
Set a value.
isAnswerFreuqencyStatisticSupported()
populateAnswerSpecificFormPart(\ilPropertyFormGUI $form)
renderEditForm(ilPropertyFormGUI $form)
renderPurposeSupportsFormHtml()
getGenericFeedbackOutput(int $active_id, ?int $pass)