4 require_once
'./Modules/TestQuestionPool/classes/class.assQuestionGUI.php';
5 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilGuiQuestionScoringAdjustable.php';
6 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilGuiAnswerScoringAdjustable.php';
7 require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
35 include_once
"./Modules/TestQuestionPool/classes/class.assSingleChoice.php";
38 $this->
object->loadFromDb($id);
47 return $this->
object->feedbackOBJ->isSpecificAnswerFeedbackAvailable($this->object->getId());
55 $hasErrors = (!$always) ? $this->
editQuestion(
true) :
false;
57 require_once
'Services/Form/classes/class.ilPropertyFormGUI.php';
78 return (
$_POST[
'types'] == 0) ? true :
false;
81 $lastChange = $this->
object->getLastChange();
82 if (empty($lastChange) && !isset(
$_POST[
'types'])) {
84 return $this->
object->getMultilineAnswerSetting() ? false :
true;
87 return $this->
object->isSingleline;
100 include_once(
"./Services/Form/classes/class.ilPropertyFormGUI.php");
102 $this->editForm = $form;
104 $form->setFormAction($this->ctrl->getFormAction($this));
108 $form->setMultipart(
true);
110 $form->setMultipart(
false);
112 $form->setTableWidth(
"100%");
113 $form->setId(
"asssinglechoice");
127 $form->setValuesByPost();
128 $errors = !$form->checkInput();
129 $form->setValuesByPost();
136 $this->tpl->setVariable(
"QUESTION_DATA", $form->getHTML());
147 $position = key(
$_POST[
'cmd'][
'uploadchoice']);
157 $position = key(
$_POST[
'cmd'][
'removeimagechoice']);
159 $this->
object->removeAnswerImage($position);
169 $position = key(
$_POST[
'cmd'][
'addchoice']);
170 $this->
object->addAnswer(
"", 0, $position + 1);
180 $position = key(
$_POST[
'cmd'][
'removechoice']);
181 $this->
object->deleteAnswer($position);
211 $graphicalOutput =
false,
212 $result_output =
false,
213 $show_question_only =
true,
214 $show_feedback =
false,
215 $show_correct_solution =
false,
216 $show_manual_scoring =
false,
217 $show_question_text =
true 224 if (($active_id > 0) && (!$show_correct_solution)) {
226 foreach ($solutions as $idx => $solution_value) {
227 $user_solution = $solution_value[
"value1"];
232 foreach ($this->object->answers as
$index => $answer) {
233 if ($answer->getPoints() > $max_points) {
234 $max_points = $answer->getPoints();
238 $user_solution = $found_index;
241 include_once
"./Services/UICore/classes/class.ilTemplate.php";
242 $template =
new ilTemplate(
"tpl.il_as_qpl_mc_sr_output_solution.html",
true,
true,
"Modules/TestQuestionPool");
243 $solutiontemplate =
new ilTemplate(
"tpl.il_as_tst_solution_output.html",
true,
true,
"Modules/TestQuestionPool");
244 foreach (
$keys as $answer_id) {
245 $answer = $this->
object->answers[$answer_id];
246 if (($active_id > 0) && (!$show_correct_solution)) {
247 if ($graphicalOutput) {
250 if (strcmp($user_solution, $answer_id) == 0) {
251 if ($answer->getPoints() == $this->
object->getMaximumPoints()) {
257 $template->setCurrentBlock(
"icon_ok");
259 $template->setVariable(
"TEXT_OK", $this->lng->txt(
"answer_is_right"));
260 $template->parseCurrentBlock();
262 $template->setCurrentBlock(
"icon_not_ok");
263 if ($answer->getPoints() > 0) {
265 $template->setVariable(
"TEXT_NOT_OK", $this->lng->txt(
"answer_is_not_correct_but_positive"));
268 $template->setVariable(
"TEXT_NOT_OK", $this->lng->txt(
"answer_is_wrong"));
270 $template->parseCurrentBlock();
273 if (strlen($user_solution) == 0) {
274 $template->setCurrentBlock(
"icon_not_ok");
276 $template->setVariable(
"TEXT_NOT_OK", $this->lng->txt(
"answer_is_wrong"));
277 $template->parseCurrentBlock();
281 if (strlen($answer->getImage())) {
282 $template->setCurrentBlock(
"answer_image");
283 if ($this->object->getThumbSize()) {
284 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $this->
object->getThumbPrefix() . $answer->getImage());
286 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $answer->getImage());
288 $alt = $answer->getImage();
289 if (strlen($answer->getAnswertext())) {
290 $alt = $answer->getAnswertext();
292 $alt = preg_replace(
"/<[^>]*?>/",
"", $alt);
295 $template->parseCurrentBlock();
297 if ($show_feedback) {
300 $template->setCurrentBlock(
"answer_row");
301 $template->setVariable(
"ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(),
true));
304 if (strcmp($user_solution, $answer_id) == 0) {
306 $template->setVariable(
"SOLUTION_ALT", $this->lng->txt(
"checked"));
309 $template->setVariable(
"SOLUTION_ALT", $this->lng->txt(
"unchecked"));
312 $template->setVariable(
'QID', $this->object->getId());
313 $template->setVariable(
'SUFFIX', $show_correct_solution ?
'bestsolution' :
'usersolution');
314 $template->setVariable(
'SOLUTION_VALUE', $answer_id);
315 if (strcmp($user_solution, $answer_id) == 0) {
316 $template->setVariable(
'SOLUTION_CHECKED',
'checked');
320 if ($result_output) {
321 $points = $this->
object->answers[$answer_id]->getPoints();
322 $resulttext = ($points == 1) ?
"(%s " . $this->lng->txt(
"point") .
")" :
"(%s " . $this->lng->txt(
"points") .
")";
323 $template->setVariable(
"RESULT_OUTPUT", sprintf($resulttext, $points));
325 $template->parseCurrentBlock();
327 $questiontext = $this->
object->getQuestionForHTMLOutput();
331 if ($show_question_text ==
true) {
332 $template->setVariable(
"QUESTIONTEXT", $this->object->prepareTextareaOutput($questiontext,
true));
334 $questionoutput = $template->get();
336 if (strlen($feedback)) {
342 $solutiontemplate->setVariable(
"ILC_FB_CSS_CLASS", $cssClass);
343 $solutiontemplate->setVariable(
"FEEDBACK", $this->object->prepareTextareaOutput($feedback,
true));
345 $solutiontemplate->setVariable(
"SOLUTION_OUTPUT", $questionoutput);
347 $solutionoutput = $solutiontemplate->get();
349 if (!$show_question_only) {
353 return $solutionoutput;
356 public function getPreview($show_question_only =
false, $showInlineFeedback =
false)
361 include_once
"./Services/UICore/classes/class.ilTemplate.php";
362 $template =
new ilTemplate(
"tpl.il_as_qpl_mc_sr_output.html",
true,
true,
"Modules/TestQuestionPool");
363 foreach (
$keys as $answer_id) {
364 $answer = $this->
object->answers[$answer_id];
365 if (strlen($answer->getImage())) {
366 if ($this->object->getThumbSize()) {
367 $template->setCurrentBlock(
"preview");
368 $template->setVariable(
"URL_PREVIEW", $this->object->getImagePathWeb() . $answer->getImage());
369 $template->setVariable(
"TEXT_PREVIEW", $this->lng->txt(
'preview'));
371 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $this->
object->getThumbPrefix() . $answer->getImage());
372 list($width, $height,
$type, $attr) = getimagesize($this->object->getImagePath() . $answer->getImage());
373 $alt = $answer->getImage();
374 if (strlen($answer->getAnswertext())) {
375 $alt = $answer->getAnswertext();
377 $alt = preg_replace(
"/<[^>]*?>/",
"", $alt);
380 $template->parseCurrentBlock();
382 $template->setCurrentBlock(
"answer_image");
383 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $answer->getImage());
384 list($width, $height,
$type, $attr) = getimagesize($this->object->getImagePath() . $answer->getImage());
385 $alt = $answer->getImage();
386 if (strlen($answer->getAnswertext())) {
387 $alt = $answer->getAnswertext();
389 $alt = preg_replace(
"/<[^>]*?>/",
"", $alt);
390 $template->setVariable(
"ATTR", $attr);
393 $template->parseCurrentBlock();
399 $template->setCurrentBlock(
"answer_row");
400 $template->setVariable(
"QID", $this->object->getId() .
'ID');
401 $template->setVariable(
"ANSWER_ID", $answer_id);
402 $template->setVariable(
"ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(),
true));
406 if (strcmp($user_solution, $answer_id) == 0) {
407 $template->setVariable(
"CHECKED_ANSWER",
" checked=\"checked\"");
411 $template->parseCurrentBlock();
413 $questiontext = $this->
object->getQuestionForHTMLOutput();
417 $template->setVariable(
"QUESTIONTEXT", $this->object->prepareTextareaOutput($questiontext,
true));
418 $questionoutput = $template->get();
419 if (!$show_question_only) {
423 return $questionoutput;
427 public function getTestOutput($active_id,
$pass, $is_postponed =
false, $use_post_solutions =
false, $show_feedback =
false)
437 #include_once "./Modules/Test/classes/class.ilObjTest.php"; 438 #if (!ilObjTest::_getUsePreviousAnswers($active_id, true)) 440 # if (is_null($pass)) $pass = ilObjTest::_getPass($active_id); 443 $solutions = $this->
object->getTestOutputSolutions($active_id,
$pass);
444 foreach ($solutions as $idx => $solution_value) {
445 $user_solution = $solution_value[
"value1"];
450 include_once
"./Services/UICore/classes/class.ilTemplate.php";
451 $template =
new ilTemplate(
"tpl.il_as_qpl_mc_sr_output.html",
true,
true,
"Modules/TestQuestionPool");
452 foreach (
$keys as $answer_id) {
453 $answer = $this->
object->answers[$answer_id];
454 if (strlen($answer->getImage())) {
455 if ($this->object->getThumbSize()) {
456 $template->setCurrentBlock(
"preview");
457 $template->setVariable(
"URL_PREVIEW", $this->object->getImagePathWeb() . $answer->getImage());
458 $template->setVariable(
"TEXT_PREVIEW", $this->lng->txt(
'preview'));
460 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $this->
object->getThumbPrefix() . $answer->getImage());
461 list($width, $height,
$type, $attr) = getimagesize($this->object->getImagePath() . $answer->getImage());
462 $alt = $answer->getImage();
463 if (strlen($answer->getAnswertext())) {
464 $alt = $answer->getAnswertext();
466 $alt = preg_replace(
"/<[^>]*?>/",
"", $alt);
469 $template->parseCurrentBlock();
471 $template->setCurrentBlock(
"answer_image");
472 $template->setVariable(
"ANSWER_IMAGE_URL", $this->object->getImagePathWeb() . $answer->getImage());
473 list($width, $height,
$type, $attr) = getimagesize($this->object->getImagePath() . $answer->getImage());
474 $alt = $answer->getImage();
475 if (strlen($answer->getAnswertext())) {
476 $alt = $answer->getAnswertext();
478 $alt = preg_replace(
"/<[^>]*?>/",
"", $alt);
479 $template->setVariable(
"ATTR", $attr);
482 $template->parseCurrentBlock();
485 if ($show_feedback) {
486 $feedbackOutputRequired =
false;
488 switch ($this->object->getSpecificFeedbackSetting()) {
490 $feedbackOutputRequired =
true;
494 if (strcmp($user_solution, $answer_id) == 0) {
495 $feedbackOutputRequired =
true;
500 if ($this->object->getAnswer($answer_id)->getPoints() > 0) {
501 $feedbackOutputRequired =
true;
506 if ($feedbackOutputRequired) {
507 $fb = $this->
object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation(
508 $this->object->getId(),
513 $template->setCurrentBlock(
"feedback");
514 $template->setVariable(
"FEEDBACK", $this->object->prepareTextareaOutput($fb,
true));
515 $template->parseCurrentBlock();
519 $template->setCurrentBlock(
"answer_row");
520 $template->setVariable(
"ANSWER_ID", $answer_id);
521 $template->setVariable(
"ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(),
true));
522 if (strcmp($user_solution, $answer_id) == 0) {
523 $template->setVariable(
"CHECKED_ANSWER",
" checked=\"checked\"");
525 $template->parseCurrentBlock();
527 $template->setVariable(
"QUESTIONTEXT", $this->object->getQuestionForHTMLOutput());
528 $questionoutput = $template->get();
529 $pageoutput = $this->
outQuestionPage(
"", $is_postponed, $active_id, $questionoutput, $show_feedback);
540 $choiceKeys = array_keys($this->object->answers);
542 if ($this->object->getShuffle()) {
543 $choiceKeys = $this->
object->getShuffler()->shuffle($choiceKeys);
553 return $this->
object->prepareTextareaOutput($output,
true);
558 $this->
object->setShuffle(
$_POST[
"shuffle"]);
559 $this->
object->setMultilineAnswerSetting(
$_POST[
"types"]);
560 if (is_array(
$_POST[
'choice'][
'imagename']) &&
$_POST[
"types"] == 1) {
561 $this->
object->isSingleline =
true;
564 $this->
object->isSingleline = (
$_POST[
"types"] == 0) ?
true :
false;
566 $this->
object->setThumbSize((strlen(
$_POST[
"thumb_size"])) ?
$_POST[
"thumb_size"] :
"");
575 $shuffle->setChecked($this->object->getShuffle());
576 $shuffle->setRequired(
false);
579 if ($this->object->getId()) {
581 $hidden->setValue($this->object->getId());
585 if (!$this->object->getSelfAssessmentEditingMode()) {
588 $types->setRequired(
false);
589 $types->setValue(($isSingleline) ? 0 : 1);
592 0 => $this->lng->txt(
'answers_singleline'),
593 1 => $this->lng->txt(
'answers_multiline'),
601 $thumb_size =
new ilNumberInputGUI($this->lng->txt(
"thumb_size"),
"thumb_size");
602 $thumb_size->
setSuffix($this->lng->txt(
"thumb_size_unit_pixel"));
603 $thumb_size->setMinValue(20);
604 $thumb_size->setDecimals(0);
605 $thumb_size->setSize(6);
606 $thumb_size->setInfo($this->lng->txt(
'thumb_size_info'));
607 $thumb_size->setValue($this->object->getThumbSize());
608 $thumb_size->setRequired(
false);
631 $this->
object->flushAnswers();
632 if ($this->object->isSingleline) {
633 foreach (
$_POST[
'choice'][
'answer'] as
$index => $answertext) {
636 $file_org_name = $_FILES[
'choice'][
'name'][
'image'][
$index];
637 $file_temp_name = $_FILES[
'choice'][
'tmp_name'][
'image'][
$index];
639 if (strlen($file_temp_name)) {
641 $suffix = strtolower(array_pop(explode(
".", $file_org_name)));
642 if (in_array($suffix, array(
"jpg",
"jpeg",
"png",
"gif" ))) {
644 $filename = $this->
object->buildHashedImageFilename($file_org_name);
645 if ($this->object->setImageFile(
$filename, $file_temp_name) == 0) {
650 $this->
object->addAnswer($answertext,
$_POST[
'choice'][
'points'][
$index], $index, $picturefile,
$_POST[
'choice'][
'answer_id'][$index]);
653 foreach (
$_POST[
'choice'][
'answer'] as
$index => $answer) {
654 $answertext = $answer;
655 $this->
object->addAnswer($answertext,
$_POST[
'choice'][
'points'][
$index], $index,
"",
$_POST[
'choice'][
'answer_id'][$index]);
665 include_once
"./Modules/TestQuestionPool/classes/class.ilSingleChoiceWizardInputGUI.php";
668 $choices->setQuestionObject($this->
object);
669 $choices->setSingleline($isSingleline);
670 $choices->setAllowMove(
false);
671 if ($this->object->getSelfAssessmentEditingMode()) {
672 $choices->setSize(40);
674 $choices->setMaxLength(800);
675 if ($this->object->getAnswerCount() == 0) {
676 $this->
object->addAnswer(
"", 0, 0);
678 $choices->setValues(array_map(
680 $value->setAnswerText(html_entity_decode($value->getAnswerText()));
683 $this->
object->getAnswers()
719 $aggregate = array();
720 foreach ($answers_defined_on_question as $answer) {
721 $aggregated_info_for_answer = array();
722 $aggregated_info_for_answer[
'answertext'] = $answer->getAnswerText();
723 $aggregated_info_for_answer[
'count_checked'] = 0;
725 foreach ($relevant_answers_chosen as $relevant_answer) {
726 if ($relevant_answer[
'value1'] == $answer->getOrder()) {
727 $aggregated_info_for_answer[
'count_checked']++;
730 $aggregated_info_for_answer[
'count_unchecked'] =
731 ceil(count($relevant_answers_chosen) / count($answers_defined_on_question))
732 - $aggregated_info_for_answer[
'count_checked'];
734 $aggregate[] = $aggregated_info_for_answer;
746 $tpl =
new ilTemplate(
'tpl.il_as_aggregated_answers_table.html',
true,
true,
"Modules/TestQuestionPool");
748 $tpl->setCurrentBlock(
'headercell');
749 $tpl->setVariable(
'HEADER', $this->lng->txt(
'tst_answer_aggr_answer_header'));
750 $tpl->parseCurrentBlock();
752 $tpl->setCurrentBlock(
'headercell');
753 $tpl->setVariable(
'HEADER', $this->lng->txt(
'tst_answer_aggr_frequency_header'));
754 $tpl->parseCurrentBlock();
756 foreach ($aggregate as $line_data) {
757 $tpl->setCurrentBlock(
'aggregaterow');
758 $tpl->setVariable(
'OPTION', $line_data[
'answertext']);
759 $tpl->setVariable(
'COUNT', $line_data[
'count_checked']);
760 $tpl->parseCurrentBlock();
767 $feedbackOutputRequired =
false;
769 switch ($this->object->getSpecificFeedbackSetting()) {
771 $feedbackOutputRequired =
true;
775 if (strcmp($user_solution, $answer_id) == 0) {
776 $feedbackOutputRequired =
true;
781 if ($this->object->getAnswer($answer_id)->getPoints() > 0) {
782 $feedbackOutputRequired =
true;
787 if ($feedbackOutputRequired) {
788 $fb = $this->
object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation($this->object->getId(), 0, $answer_id);
790 $template->setCurrentBlock(
"feedback");
791 $template->setVariable(
"FEEDBACK", $this->object->prepareTextareaOutput($fb,
true));
792 $template->parseCurrentBlock();
799 $agg = $this->
aggregateAnswers($relevantAnswers, $this->object->getAnswers());
803 foreach ($agg as $ans) {
805 'answer' => $ans[
'answertext'],
806 'frequency' => $ans[
'count_checked']
815 require_once
'Modules/TestQuestionPool/classes/forms/class.ilAssSingleChoiceCorrectionsInputGUI.php';
818 $choices->setQuestionObject($this->
object);
819 $choices->setValues($this->object->getAnswers());
828 $points = $form->
getInput(
'choice')[
'points'];
830 foreach ($this->object->getAnswers() as
$index => $answer) {
832 $answer->setPoints((
float) $points[$index]);
isTestPresentationContext()
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms public
hasCorrectSolution($activeId, $passIndex)
aggregateAnswers($relevant_answers_chosen, $answers_defined_on_question)
addBasicQuestionFormProperties($form)
Add basic question form properties: assessment: title, author, description, question, working time.
getAggregatedAnswersView($relevant_answers)
Returns an html string containing a question specific representation of the answers so far given in t...
getSolutionOutput( $active_id, $pass=null, $graphicalOutput=false, $result_output=false, $show_question_only=true, $show_feedback=false, $show_correct_solution=false, $show_manual_scoring=false, $show_question_text=true)
Get the question solution output.
writePostData($always=false)
{}
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
Extracts the answer specific values from $_POST and applies them to the data object.
Class for answers with a binary state indicator.
populateInlineFeedback($template, $answer_id, $user_solution)
supportsIntermediateSolutionOutput()
Question type specific support of intermediate solution output The function getSolutionOutput respect...
renderAggregateView($aggregate)
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
getQuestionTemplate()
get question template
const CSS_CLASS_FEEDBACK_CORRECT
getAnswersFrequency($relevantAnswers, $questionIndex)
populateTaxonomyFormSection(ilPropertyFormGUI $form)
getUseIntermediateSolution()
Get if intermediate solution should be used for solution output.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
getTestOutput($active_id, $pass, $is_postponed=false, $use_post_solutions=false, $show_feedback=false)
writeQuestionGenericPostData()
getSpecificFeedbackOutput($userSolution)
getPreview($show_question_only=false, $showInlineFeedback=false)
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getILIASPage($html="")
Returns the ILIAS Page around a question.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
Class for single choice questions.
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
removechoice()
Remove an answer.
const CSS_CLASS_FEEDBACK_WRONG
Basic GUI class for assessment questions.
static getHtmlPath($relative_path)
get url of path
getAnswerFeedbackOutput($active_id, $pass)
Returns the answer generic feedback depending on the results of the question.
populateAnswerSpecificFormPart(\ilPropertyFormGUI $form)
populateCorrectionsFormProperties(ilPropertyFormGUI $form)
saveTaxonomyAssignments()
addchoice()
Add a new answer.
saveCorrectionsFormProperties(ilPropertyFormGUI $form)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="", $inlineFeedbackEnabled=false)
output question page
__construct(Container $dic, ilPlugin $plugin)
static secureString($a_str, $a_strip_html=true, $a_allow="")
Remove unsecure tags.
isRenderPurposePrintPdf()
Interface ilGuiAnswerScoringAdjustable.
Single choice question GUI representation.
__construct($id=-1)
assSingleChoiceGUI constructor
editQuestion($checkonly=false)
Creates an output of the edit form for the question.
removeimagechoice()
Remove an image.
Interface ilGuiQuestionScoringAdjustable.
getEditAnswersSingleLine($checkonly=false)
Get the single/multiline editing of answers.
uploadchoice()
Upload an image.
addQuestionFormCommandButtons($form)
Add the command buttons of a question properties form.
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from $_POST and applies them to the data object.
renderPurposeSupportsFormHtml()