ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.assOrderingHorizontalGUI.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.assQuestionGUI.php';
5 require_once './Modules/TestQuestionPool/interfaces/interface.ilGuiQuestionScoringAdjustable.php';
6 require_once './Modules/Test/classes/inc.AssessmentConstants.php';
7 
23 {
32  function __construct($id = -1)
33  {
34  parent::__construct();
35  include_once "./Modules/TestQuestionPool/classes/class.assOrderingHorizontal.php";
36  $this->object = new assOrderingHorizontal();
37  $this->setErrorMessage($this->lng->txt("msg_form_save_error"));
38  if ($id >= 0)
39  {
40  $this->object->loadFromDb($id);
41  }
42  }
43 
44  function getCommand($cmd)
45  {
46  return $cmd;
47  }
48 
52  protected function writePostData($always = false)
53  {
54  $hasErrors = (!$always) ? $this->editQuestion(true) : false;
55  if (!$hasErrors)
56  {
57  require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
60  $this->saveTaxonomyAssignments();
61  return 0;
62  }
63  return 1;
64  }
65 
71  public function editQuestion($checkonly = FALSE)
72  {
73  $save = $this->isSaveCommand();
74  $this->getQuestionTemplate();
75 
76  include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
77  $form = new ilPropertyFormGUI();
78  $this->editForm = $form;
79 
80  $form->setFormAction($this->ctrl->getFormAction($this));
81  $form->setTitle($this->outQuestionType());
82  $form->setMultipart(FALSE);
83  $form->setTableWidth("100%");
84  $form->setId("orderinghorizontal");
85 
86  $this->addBasicQuestionFormProperties( $form );
87  $this->populateQuestionSpecificFormPart( $form );
88 
89 
90  $this->populateTaxonomyFormSection($form);
91 
92  $this->addQuestionFormCommandButtons($form);
93 
94  $errors = false;
95 
96  if ($save)
97  {
98  $form->setValuesByPost();
99  $errors = !$form->checkInput();
100  $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
101  if ($errors) $checkonly = false;
102  }
103 
104  if (!$checkonly) $this->tpl->setVariable("QUESTION_DATA", $form->getHTML());
105  return $errors;
106  }
107 
122  $active_id,
123  $pass = NULL,
124  $graphicalOutput = FALSE,
125  $result_output = FALSE,
126  $show_question_only = TRUE,
127  $show_feedback = FALSE,
128  $show_correct_solution = FALSE,
129  $show_manual_scoring = FALSE,
130  $show_question_text = TRUE
131  )
132  {
133  // get the solution of the user for the active pass or from the last pass if allowed
134  $template = new ilTemplate("tpl.il_as_qpl_orderinghorizontal_output_solution.html", TRUE, TRUE, "Modules/TestQuestionPool");
135 
136  //$solutionvalue = "";
137  if (($active_id > 0) && (!$show_correct_solution))
138  {
139  $solutions =& $this->object->getSolutionValues($active_id, $pass);
140  if (strlen($solutions[0]["value1"]))
141  {
142  $elements = explode("{::}", $solutions[0]["value1"]);
143  }
144 
145  if( !count($elements) )
146  {
147  $elements = $this->object->getRandomOrderingElements();
148  }
149 
150  foreach ($elements as $id => $element)
151  {
152  $template->setCurrentBlock("element");
153  $template->setVariable("ELEMENT_ID", "sol_e_" . $this->object->getId() . "_$id");
154  $template->setVariable("ELEMENT_VALUE", ilUtil::prepareFormOutput($element));
155  $template->parseCurrentBlock();
156  }
157 
158  //$solutionvalue = str_replace("{::}", " ", $solutions[0]["value1"]);
159  }
160  else
161  {
162  $elements = $this->object->getOrderingElements();
163  foreach ($elements as $id => $element)
164  {
165  $template->setCurrentBlock("element");
166  $template->setVariable("ELEMENT_ID", "sol_e_" . $this->object->getId() . "_$id");
167  $template->setVariable("ELEMENT_VALUE", ilUtil::prepareFormOutput($element));
168  $template->parseCurrentBlock();
169  }
170  //$solutionvalue = join($this->object->getOrderingElements(), " ");
171  }
172 
173  if (($active_id > 0) && (!$show_correct_solution))
174  {
175  if($this->object->getStep() === NULL)
176  {
177  $reached_points = $this->object->getReachedPoints($active_id, $pass);
178  }
179  else
180  {
181  $reached_points = $this->object->calculateReachedPoints($active_id, $pass);
182  }
183  if ($graphicalOutput)
184  {
185  // output of ok/not ok icons for user entered solutions
186  if ($reached_points == $this->object->getMaximumPoints())
187  {
188  $template->setCurrentBlock("icon_ok");
189  $template->setVariable("ICON_OK", ilUtil::getImagePath("icon_ok.svg"));
190  $template->setVariable("TEXT_OK", $this->lng->txt("answer_is_right"));
191  $template->parseCurrentBlock();
192  }
193  else
194  {
195  $template->setCurrentBlock("icon_ok");
196  if ($reached_points > 0)
197  {
198  $template->setVariable("ICON_NOT_OK", ilUtil::getImagePath("icon_mostly_ok.svg"));
199  $template->setVariable("TEXT_NOT_OK", $this->lng->txt("answer_is_not_correct_but_positive"));
200  }
201  else
202  {
203  $template->setVariable("ICON_NOT_OK", ilUtil::getImagePath("icon_not_ok.svg"));
204  $template->setVariable("TEXT_NOT_OK", $this->lng->txt("answer_is_wrong"));
205  }
206  $template->parseCurrentBlock();
207  }
208  }
209  }
210  else
211  {
212  $reached_points = $this->object->getPoints();
213  }
214 
215  if ($result_output)
216  {
217  $resulttext = ($reached_points == 1) ? "(%s " . $this->lng->txt("point") . ")" : "(%s " . $this->lng->txt("points") . ")";
218  $template->setVariable("RESULT_OUTPUT", sprintf($resulttext, $reached_points));
219  }
220  if($show_question_text==true)
221  {
222  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($this->object->getQuestion(), TRUE));
223  }
224 // $template->setVariable("SOLUTION_TEXT", ilUtil::prepareFormOutput($solutionvalue));
225  if ($this->object->textsize >= 10) $template->setVariable("STYLE", " style=\"font-size: " . $this->object->textsize . "%;\"");
226 
227  $questionoutput = $template->get();
228  $solutiontemplate = new ilTemplate("tpl.il_as_tst_solution_output.html",TRUE, TRUE, "Modules/TestQuestionPool");
229  $solutiontemplate->setVariable("SOLUTION_OUTPUT", $questionoutput);
230 
231 
232  $feedback = '';
233  if($show_feedback)
234  {
235  if( !$this->isTestPresentationContext() )
236  {
237  $fb = $this->getGenericFeedbackOutput($active_id, $pass);
238  $feedback .= strlen($fb) ? $fb : '';
239  }
240 
241  $fb = $this->getSpecificFeedbackOutput($active_id, $pass);
242  $feedback .= strlen($fb) ? $fb : '';
243  }
244  if (strlen($feedback))
245  {
246  $cssClass = ( $this->hasCorrectSolution($active_id, $pass) ?
248  );
249 
250  $solutiontemplate->setVariable("ILC_FB_CSS_CLASS", $cssClass);
251  $solutiontemplate->setVariable("FEEDBACK", $this->object->prepareTextareaOutput( $feedback, true ));
252  }
253  $solutionoutput = $solutiontemplate->get();
254  if (!$show_question_only)
255  {
256  // get page object output
257  $solutionoutput = $this->getILIASPage($solutionoutput);
258  }
259  return $solutionoutput;
260  }
261 
262  function getPreview($show_question_only = FALSE, $showInlineFeedback = false)
263  {
264  if( is_object($this->getPreviewSession()) && strlen((string)$this->getPreviewSession()->getParticipantsSolution()) )
265  {
266  $elements = (string)$this->getPreviewSession()->getParticipantsSolution();
267  $elements = $this->object->splitAndTrimOrderElementText($elements, $this->object->getAnswerSeparator());
268  }
269  else
270  {
271  $elements = $this->object->getRandomOrderingElements();
272  }
273 
274  $template = new ilTemplate("tpl.il_as_qpl_orderinghorizontal_preview.html",TRUE, TRUE, "Modules/TestQuestionPool");
275  foreach ($elements as $id => $element)
276  {
277  $template->setCurrentBlock("element");
278  $template->setVariable("ELEMENT_ID", "e_" . $this->object->getId() . "_$id");
279  $template->setVariable("ORDERING_VALUE", ilUtil::prepareFormOutput($element));
280  $template->setVariable("ELEMENT_VALUE", ilUtil::prepareFormOutput($element));
281  $template->parseCurrentBlock();
282  }
283  $template->setVariable("QUESTION_ID", $this->object->getId());
284  $template->setVariable("VALUE_ORDERRESULT", ' value="' . join($elements, '{::}') . '"');
285  if ($this->object->textsize >= 10) $template->setVariable("STYLE", " style=\"font-size: " . $this->object->textsize . "%;\"");
286  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($this->object->getQuestion(), TRUE));
287  $questionoutput = $template->get();
288  if (!$show_question_only)
289  {
290  // get page object output
291  $questionoutput = $this->getILIASPage($questionoutput);
292  }
293  $this->tpl->addJavascript("./Modules/TestQuestionPool/templates/default/orderinghorizontal.js");
294  return $questionoutput;
295  }
296 
297  // hey: prevPassSolutions - pass will be always available from now on
298  function getTestOutput($active_id, $pass, $is_postponed = FALSE, $use_post_solutions = FALSE, $show_feedback = FALSE)
299  // hey.
300  {
301  // generate the question output
302  $template = new ilTemplate("tpl.il_as_qpl_orderinghorizontal_output.html",TRUE, TRUE, "Modules/TestQuestionPool");
303  $elements = $this->object->getRandomOrderingElements();
304 
305  if ($active_id)
306  {
307  // hey: prevPassSolutions - obsolete due to central check
308  #$solutions = NULL;
309  #include_once "./Modules/Test/classes/class.ilObjTest.php";
310  #if (!ilObjTest::_getUsePreviousAnswers($active_id, true))
311  #{
312  # if (is_null($pass)) $pass = ilObjTest::_getPass($active_id);
313  #}
314  $solutions = $this->object->getTestOutputSolutions($active_id, $pass);
315  // hey.
316  if (count($solutions) == 1)
317  {
318  $elements = explode("{::}", $solutions[0]["value1"]);
319  }
320  }
321  if (count($solutions) == 0)
322  {
323  $_SESSION['qst_ordering_horizontal_elements'] = $elements;
324  }
325  else
326  {
327  unset($_SESSION['qst_ordering_horizontal_elements']);
328  }
329  foreach ($elements as $id => $element)
330  {
331  $template->setCurrentBlock("element");
332  $template->setVariable("ELEMENT_ID", "e_" . $this->object->getId() . "_$id");
333  $template->setVariable("ORDERING_VALUE", ilUtil::prepareFormOutput($element));
334  $template->setVariable("ELEMENT_VALUE", ilUtil::prepareFormOutput($element));
335  $template->parseCurrentBlock();
336  }
337  $template->setVariable("QUESTION_ID", $this->object->getId());
338  if ($this->object->textsize >= 10) $template->setVariable("STYLE", " style=\"font-size: " . $this->object->textsize . "%;\"");
339  $template->setVariable("VALUE_ORDERRESULT", ' value="' . join($elements, '{::}') . '"');
340  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($this->object->getQuestion(), TRUE));
341  $questionoutput = $template->get();
342  if (!$show_question_only)
343  {
344  // get page object output
345  $questionoutput = $this->getILIASPage($questionoutput);
346  }
347  $this->tpl->addJavascript("./Modules/TestQuestionPool/templates/default/orderinghorizontal.js");
348  $questionoutput = $template->get();
349  $pageoutput = $this->outQuestionPage("", $is_postponed, $active_id, $questionoutput);
350  return $pageoutput;
351  }
352 
358  function saveFeedback()
359  {
360  include_once "./Services/AdvancedEditing/classes/class.ilObjAdvancedEditing.php";
361  $errors = $this->feedback(true);
362  $this->object->saveFeedbackGeneric(0, $_POST["feedback_incomplete"]);
363  $this->object->saveFeedbackGeneric(1, $_POST["feedback_complete"]);
364  $this->object->cleanupMediaObjectUsage();
365  parent::saveFeedback();
366  }
367 
375  function setQuestionTabs()
376  {
377  global $rbacsystem, $ilTabs;
378 
379  $ilTabs->clearTargets();
380 
381  $this->ctrl->setParameterByClass("ilAssQuestionPageGUI", "q_id", $_GET["q_id"]);
382  include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
383  $q_type = $this->object->getQuestionType();
384 
385  if (strlen($q_type))
386  {
387  $classname = $q_type . "GUI";
388  $this->ctrl->setParameterByClass(strtolower($classname), "sel_question_types", $q_type);
389  $this->ctrl->setParameterByClass(strtolower($classname), "q_id", $_GET["q_id"]);
390  }
391 
392  if ($_GET["q_id"])
393  {
394  if ($rbacsystem->checkAccess('write', $_GET["ref_id"]))
395  {
396  // edit page
397  $ilTabs->addTarget("edit_page",
398  $this->ctrl->getLinkTargetByClass("ilAssQuestionPageGUI", "edit"),
399  array("edit", "insert", "exec_pg"),
400  "", "", $force_active);
401  }
402 
403  $this->addTab_QuestionPreview($ilTabs);
404  }
405 
406  $force_active = false;
407  if ($rbacsystem->checkAccess('write', $_GET["ref_id"]))
408  {
409  $url = "";
410  if ($classname) $url = $this->ctrl->getLinkTargetByClass($classname, "editQuestion");
411  $commands = $_POST["cmd"];
412  if (is_array($commands))
413  {
414  foreach ($commands as $key => $value)
415  {
416  if (preg_match("/^suggestrange_.*/", $key, $matches))
417  {
418  $force_active = true;
419  }
420  }
421  }
422  // edit question properties
423  $ilTabs->addTarget("edit_question",
424  $url,
425  array("editQuestion", "save", "saveEdit", "originalSyncForm"),
426  $classname, "", $force_active);
427  }
428 
429  // add tab for question feedback within common class assQuestionGUI
430  $this->addTab_QuestionFeedback($ilTabs);
431 
432  // add tab for question hint within common class assQuestionGUI
433  $this->addTab_QuestionHints($ilTabs);
434 
435  // add tab for question's suggested solution within common class assQuestionGUI
436  $this->addTab_SuggestedSolution($ilTabs, $classname);
437 
438  // Assessment of questions sub menu entry
439  if ($_GET["q_id"])
440  {
441  $ilTabs->addTarget("statistics",
442  $this->ctrl->getLinkTargetByClass($classname, "assessment"),
443  array("assessment"),
444  $classname, "");
445  }
446 
447  $this->addBackTab($ilTabs);
448  }
449 
450  function getSpecificFeedbackOutput($active_id, $pass)
451  {
452  if(strpos($this->object->getOrderText(),'::'))
453  {
454  $answers = explode('::', $this->object->getOrderText());
455  } else {
456  $answers = explode(' ', $this->object->getOrderText());
457  }
458 
459  if( !$this->object->feedbackOBJ->specificAnswerFeedbackExists(array_values($answers)) )
460  {
461  return '';
462  }
463 
464  $output = '<table class="test_specific_feedback"><tbody>';
465 
466  foreach($answers as $idx => $answer)
467  {
468  $feedback = $this->object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation(
469  $this->object->getId(), $idx
470  );
471 
472  $output .= "<tr><td>{$answer}</td><td>{$feedback}</td></tr>";
473  }
474 
475  $output .= '</tbody></table>';
476 
477  return $this->object->prepareTextareaOutput($output, TRUE);
478  }
479 
481  {
482  $this->object->setTextSize( $_POST["textsize"] );
483  $this->object->setOrderText( $_POST["ordertext"] );
484  $this->object->setPoints( $_POST["points"] );
485  }
486 
497  {
498  return array();
499  }
500 
502  {
503  // ordertext
504  $ordertext = new ilTextAreaInputGUI($this->lng->txt( "ordertext" ), "ordertext");
505  $ordertext->setValue( $this->object->prepareTextareaOutput( $this->object->getOrderText() ) );
506  $ordertext->setRequired( TRUE );
507  $ordertext->setInfo( sprintf( $this->lng->txt( "ordertext_info" ), $this->object->separator ) );
508  $ordertext->setRows( 10 );
509  $ordertext->setCols( 80 );
510  $form->addItem( $ordertext );
511  // textsize
512  $textsize = new ilNumberInputGUI($this->lng->txt( "textsize" ), "textsize");
513  $textsize->setValue( $this->object->getTextSize() );
514  $textsize->setInfo( $this->lng->txt( "textsize_info" ) );
515  $textsize->setSize( 6 );
516  $textsize->setMinValue( 10 );
517  $textsize->setRequired( FALSE );
518  $form->addItem( $textsize );
519  // points
520  $points = new ilNumberInputGUI($this->lng->txt( "points" ), "points");
521 
522  $points->allowDecimals( true );
523  // mbecker: Fix for mantis bug 7866: Predefined values schould make sense.
524  // This implements a default value of "1" for this question type.
525  if ($this->object->getPoints() == null)
526  {
527  $points->setValue( "1" );
528  }
529  else
530  {
531  $points->setValue( $this->object->getPoints() );
532  }
533  $points->setRequired( TRUE );
534  $points->setSize( 3 );
535  $points->setMinValue( 0.0 );
536  $points->setMinvalueShouldBeGreater( true );
537  $form->addItem( $points );
538  }
539 
548  public function getAggregatedAnswersView($relevant_answers)
549  {
550  return $this->renderAggregateView(
551  $this->aggregateAnswers( $relevant_answers, $this->object->getOrderText() ) )->get();
552  }
553 
554  public function aggregateAnswers($relevant_answers_chosen, $answer_defined_on_question)
555  {
556  $aggregate = array();
557  foreach($relevant_answers_chosen as $answer)
558  {
559  $answer = str_replace($this->object->getAnswerSeparator(), '&nbsp;&nbsp;-&nbsp;&nbsp;', $answer);
560  if (in_array($answer['value1'], $aggregate))
561  {
562  $aggregate[$answer['value1']] = $aggregate[$answer['value1']]+1;
563  }
564  else
565  {
566  $aggregate[$answer['value1']] = 1;
567  }
568  }
569 
570  return $aggregate;
571  }
572 
578  public function renderAggregateView($aggregate)
579  {
580  $tpl = new ilTemplate('tpl.il_as_aggregated_answers_table.html', true, true, "Modules/TestQuestionPool");
581 
582  foreach ($aggregate as $key => $line_data)
583  {
584  $tpl->setCurrentBlock( 'aggregaterow' );
585  $tpl->setVariable( 'COUNT', $line_data );
586  $tpl->setVariable( 'OPTION', $key );
587  $tpl->parseCurrentBlock();
588  }
589  return $tpl;
590  }
591 }
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms public
hasCorrectSolution($activeId, $passIndex)
addTab_QuestionPreview(ilTabsGUI $tabsGUI)
Class for horizontal ordering questions.
addBasicQuestionFormProperties($form)
Add basic question form properties: assessment: title, author, description, question, working time.
setValue($a_value)
Set Value.
$_SESSION["AccountId"]
addTab_QuestionHints(ilTabsGUI $tabs)
adds the hints tab to ilTabsGUI
editQuestion($checkonly=FALSE)
Creates an output of the edit form for the question.
This class represents a property form user interface.
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.
saveFeedback()
Saves the feedback for a single choice question.
$_GET["client_id"]
$cmd
Definition: sahs_server.php:35
setValue($a_value)
Set Value.
The assOrderingHorizontalGUI class encapsulates the GUI representation for horizontal ordering questi...
Add rich text string
The name of the decorator.
addItem($a_item)
Add Item (Property, SectionHeader).
$url
Definition: shib_logout.php:72
getQuestionTemplate()
get question template
populateTaxonomyFormSection(ilPropertyFormGUI $form)
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
allowDecimals($a_value)
Toggle Decimals.
if(!is_dir( $entity_dir)) exit("Fatal Error ([A-Za-z0-9]+)\+" &#(? foreach( $entity_files as $file) $output
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)
This class represents a number property in a property form.
special template class to simplify handling of ITX/PEAR
getTestOutput($active_id, $pass, $is_postponed=FALSE, $use_post_solutions=FALSE, $show_feedback=FALSE)
getAggregatedAnswersView($relevant_answers)
Returns an html string containing a question specific representation of the answers so far given in t...
aggregateAnswers($relevant_answers_chosen, $answer_defined_on_question)
addTab_QuestionFeedback(ilTabsGUI $tabs)
adds the feedback tab to ilTabsGUI
Basic GUI class for assessment questions.
setErrorMessage($errormessage)
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from $_POST and applies them to the data object.
Create styles array
The data for the language used.
$errors
__construct($id=-1)
assOrderingHorizontalGUI constructor
setQuestionTabs()
Sets the ILIAS tabs for this question type.
Create new PHPExcel object
obj_idprivate
This class represents a text area property in a property form.
addBackTab(ilTabsGUI $ilTabs)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="")
output question page
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getGenericFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
Interface ilGuiQuestionScoringAdjustable.
$_POST["username"]
getPreview($show_question_only=FALSE, $showInlineFeedback=false)
addTab_SuggestedSolution(ilTabsGUI $tabs, $classname)
addQuestionFormCommandButtons($form)
Add the command buttons of a question properties form.