ILIAS  Release_4_2_x_branch Revision 61807
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilTestEvaluationGUI.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 
24 include_once "./Modules/Test/classes/inc.AssessmentConstants.php";
25 include_once "./Modules/Test/classes/class.ilTestServiceGUI.php";
26 
40 {
50  function ilTestEvaluationGUI($a_object)
51  {
52  global $ilAccess;
53 
54  parent::ilTestServiceGUI($a_object);
55  }
56 
60  function &executeCommand()
61  {
62  global $ilUser;
63  $cmd = $this->ctrl->getCmd();
64  $next_class = $this->ctrl->getNextClass($this);
65  $this->ctrl->saveParameter($this, "sequence");
66  $this->ctrl->saveParameter($this, "active_id");
67  $cmd = $this->getCommand($cmd);
68  switch($next_class)
69  {
70  default:
71  $ret =& $this->$cmd();
72  break;
73  }
74  return $ret;
75  }
76 
77  function &getHeaderNames()
78  {
79  $headernames = array();
80  if ($this->object->getAnonymity())
81  {
82  array_push($headernames, $this->lng->txt("counter"));
83  }
84  else
85  {
86  array_push($headernames, $this->lng->txt("name"));
87  array_push($headernames, $this->lng->txt("login"));
88  }
89  $additionalFields = $this->object->getEvaluationAdditionalFields();
90  if (count($additionalFields))
91  {
92  foreach ($additionalFields as $fieldname)
93  {
94  array_push($headernames, $this->lng->txt($fieldname));
95  }
96  }
97  array_push($headernames, $this->lng->txt("tst_reached_points"));
98  array_push($headernames, $this->lng->txt("tst_mark"));
99  if ($this->object->ects_output)
100  {
101  array_push($headernames, $this->lng->txt("ects_grade"));
102  }
103  array_push($headernames, $this->lng->txt("tst_answered_questions"));
104  array_push($headernames, $this->lng->txt("working_time"));
105  array_push($headernames, $this->lng->txt("detailed_evaluation"));
106  return $headernames;
107  }
108 
109  function &getHeaderVars()
110  {
111  $headervars = array();
112  if ($this->object->getAnonymity())
113  {
114  array_push($headervars, "counter");
115  }
116  else
117  {
118  array_push($headervars, "name");
119  array_push($headervars, "login");
120  }
121  array_push($headervars, "resultspoints");
122  array_push($headervars, "resultsmarks");
123  if ($this->object->ects_output)
124  {
125  array_push($headervars, "ects_grade");
126  }
127  array_push($headervars, "qworkedthrough");
128  array_push($headervars, "timeofwork");
129  array_push($headervars, "");
130  return $headervars;
131  }
132 
133  public function filterEvaluation()
134  {
135  include_once "./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
136  $table_gui = new ilEvaluationAllTableGUI($this, 'outEvaluation');
137  $table_gui->writeFilterToSession();
138  $this->ctrl->redirect($this, "outEvaluation");
139  }
140 
141  public function resetfilterEvaluation()
142  {
143  include_once "./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
144  $table_gui = new ilEvaluationAllTableGUI($this, 'outEvaluation');
145  $table_gui->resetFilter();
146  $this->ctrl->redirect($this, "outEvaluation");
147  }
148 
154  function outEvaluation()
155  {
156  global $ilAccess;
157 
158  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
159  {
160  // allow only evaluation access
161  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), true);
162  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
163  }
164 
165  include_once "./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
166  $table_gui = new ilEvaluationAllTableGUI($this, 'outEvaluation', $this->object->getAnonymity());
167  $data = array();
168  $arrFilter = array();
169  foreach ($table_gui->getFilterItems() as $item)
170  {
171  if ($item->getValue() !== false)
172  {
173  switch ($item->getPostVar())
174  {
175  case 'group':
176  case 'name':
177  case 'course':
178  $arrFilter[$item->getPostVar()] = $item->getValue();
179  break;
180  case 'passed_only':
181  $passedonly = $item->getChecked();
182  break;
183  }
184  }
185  }
186  include_once "./Modules/Test/classes/class.ilTestEvaluationData.php";
187  $eval = new ilTestEvaluationData($this->object);
188  $eval->setFilterArray($arrFilter);
189  $foundParticipants =& $eval->getParticipants();
190  $counter = 1;
191  if (count($foundParticipants) > 0)
192  {
193  if ($this->object->ects_output)
194  {
195  $passed_array =& $this->object->getTotalPointsPassedArray();
196  }
197  foreach ($foundParticipants as $active_id => $userdata)
198  {
199  $remove = FALSE;
200  if ($passedonly)
201  {
202  $mark_obj = $this->object->getMarkSchema()->getMatchingMark($userdata->getReachedPointsInPercent());
203  if ($mark_obj->getPassed() == FALSE)
204  {
205  $remove = TRUE;
206  }
207  }
208  if (!$remove)
209  {
210  // build the evaluation row
211  $userfields = ilObjUser::_lookupFields($userdata->getUserID());
212  foreach ($userfields as $key => $value)
213  {
214  $evaluationrow[$key] = strlen($value) ? $value : ' ';
215  }
216  $evaluationrow = array();
217  $fullname = "";
218  if ($this->object->getAnonymity())
219  {
220  $fullname = $counter;
221  $evaluationrow['name'] = $fullname;
222  $evaluationrow['login'] = '';
223  }
224  else
225  {
226  $evaluationrow['name'] = $userdata->getName();
227  if (strlen($userdata->getLogin()))
228  {
229  $evaluationrow['login'] = "[" . $userdata->getLogin() . "]";
230  }
231  else
232  {
233  $evaluationrow['login'] = '';
234  }
235  }
236 
237  $evaluationrow['reached'] = $userdata->getReached();
238  $evaluationrow['max'] = $userdata->getMaxpoints();
239  $percentage = $userdata->getReachedPointsInPercent();
240  $mark = $this->object->getMarkSchema()->getMatchingMark($percentage);
241  if (is_object($mark))
242  {
243  $evaluationrow['mark'] = $mark->getShortName();
244  }
245  if ($this->object->ects_output)
246  {
247  $ects_mark = $this->object->getECTSGrade($passed_array, $userdata->getReached(), $userdata->getMaxPoints());
248  $evaluationrow['ects_grade'] = $ects_mark;
249  }
250  $evaluationrow['answered'] = $userdata->getQuestionsWorkedThrough() . " " . strtolower($this->lng->txt("of")) . " " . $userdata->getNumberOfQuestions() . " (" . sprintf("%2.2f", $userdata->getQuestionsWorkedThroughInPercent()) . " %" . ")";
251  $time_seconds = $userdata->getTimeOfWork();
252  $time_hours = floor($time_seconds/3600);
253  $time_seconds -= $time_hours * 3600;
254  $time_minutes = floor($time_seconds/60);
255  $time_seconds -= $time_minutes * 60;
256  $evaluationrow['working_time'] = sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $time_seconds);
257  $this->ctrl->setParameter($this, "active_id", $active_id);
258  $href = $this->ctrl->getLinkTarget($this, "detailedEvaluation");
259  $detailed_evaluation = $this->lng->txt("detailed_evaluation_show");
260  $evaluationrow['details'] = "<a class=\"il_ContainerItemCommand\" href=\"$href\">$detailed_evaluation</a>";
261  $userfields = ilObjUser::_lookupFields($userdata->getUserID());
262  $evaluationrow['gender'] = $userfields['gender'];
263  $evaluationrow['email'] = $userfields['email'];
264  $evaluationrow['institution'] = $userfields['institution'];
265  $evaluationrow['street'] = $userfields['street'];
266  $evaluationrow['city'] = $userfields['city'];
267  $evaluationrow['zipcode'] = $userfields['zipcode'];
268  $evaluationrow['country'] = $userfields['country'];
269  $evaluationrow['departement'] = $userfields['departement'];
270  $evaluationrow['matriculation'] = $userfields['matriculation'];
271  $counter++;
272  array_push($data, $evaluationrow);
273  }
274  }
275  }
276 
277  $table_gui->setData($data);
278  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_evaluation.html", "Modules/Test");
279  $this->tpl->setVariable('EVALUATION_DATA', $table_gui->getHTML());
280  if (count($foundParticipants) > 0)
281  {
282  $template = new ilTemplate("tpl.il_as_tst_evaluation_export.html", TRUE, TRUE, "Modules/Test");
283  $template->setVariable("EXPORT_DATA", $this->lng->txt("exp_eval_data"));
284  if (!$this->object->getAnonymity())
285  {
286  include_once "./Services/Certificate/classes/class.ilCertificate.php";
287  include_once "./Modules/Test/classes/class.ilTestCertificateAdapter.php";
289  {
290  $template->setVariable("TEXT_CERTIFICATE", $this->lng->txt("exp_type_certificate"));
291  }
292  }
293  $template->setVariable("TEXT_EXCEL", $this->lng->txt("exp_type_excel"));
294  $template->setVariable("TEXT_CSV", $this->lng->txt("exp_type_spss"));
295  $template->setVariable("CMD_EXPORT", "exportEvaluation");
296  $template->setVariable("BTN_EXPORT", $this->lng->txt("export"));
297  $template->setVariable("BTN_PRINT", $this->lng->txt("print"));
298  $template->setVariable("BTN_COMMAND", $this->ctrl->getCmd());
299  $template->setVariable("FORM_ACTION", $this->ctrl->getFormAction($this, "exportEvaluation"));
300  $exportoutput = $template->get();
301  $this->tpl->setVariable("EVALUATION_EXPORT", $exportoutput);
302  }
303 
304  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
305  if ($this->object->getShowSolutionAnswersOnly())
306  {
307  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
308  }
309  }
310 
319  {
320  global $ilAccess;
321 
322  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
323  {
324  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), TRUE);
325  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
326  }
327 
328  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_evaluation_details.html", "Modules/Test");
329 
330  $active_id = $_GET["active_id"];
331  if (strlen($active_id) == 0)
332  {
333  ilUtil::sendInfo($this->lng->txt("detailed_evaluation_missing_active_id"), TRUE);
334  $this->ctrl->redirect($this, "outEvaluation");
335  }
336 
337  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
338 
339  $data =& $this->object->getCompleteEvaluationData();
340  $this->tpl->setVariable("TEXT_BACK", $this->lng->txt("back"));
341  $this->tpl->setVariable("URL_BACK", $this->ctrl->getLinkTarget($this, "outEvaluation"));
342  $this->tpl->setVariable("HEADING_DETAILED_EVALUATION", sprintf($this->lng->txt("detailed_evaluation_for"),
343  $data->getParticipant($active_id)->getName())
344  );
345  $this->tpl->setVariable("STATISTICAL_DATA", $this->lng->txt("statistical_data"));
346  $this->tpl->setVariable("TXT_RESULTSPOINTS", $this->lng->txt("tst_stat_result_resultspoints"));
347  $this->tpl->setVariable("VALUE_RESULTSPOINTS", $data->getParticipant($active_id)->getReached() . " " . strtolower($this->lng->txt("of")) . " " . $data->getParticipant($active_id)->getMaxpoints() . " (" . sprintf("%2.2f", $data->getParticipant($active_id)->getReachedPointsInPercent()) . " %" . ")");
348  if (strlen($data->getParticipant($active_id)->getMark()))
349  {
350  $this->tpl->setVariable("TXT_RESULTSMARKS", $this->lng->txt("tst_stat_result_resultsmarks"));
351  $this->tpl->setVariable("VALUE_RESULTSMARKS", $data->getParticipant($active_id)->getMark());
352  if (strlen($data->getParticipant($active_id)->getECTSMark()))
353  {
354  $this->tpl->setVariable("TXT_ECTS", $this->lng->txt("ects_grade"));
355  $this->tpl->setVariable("VALUE_ECTS", $data->getParticipant($active_id)->getECTSMark());
356  }
357  }
358  $this->tpl->setVariable("TXT_QWORKEDTHROUGH", $this->lng->txt("tst_stat_result_qworkedthrough"));
359  $this->tpl->setVariable("VALUE_QWORKEDTHROUGH", $data->getParticipant($active_id)->getQuestionsWorkedThrough() . " " . strtolower($this->lng->txt("of")) . " " . $data->getParticipant($active_id)->getNumberOfQuestions() . " (" . sprintf("%2.2f", $data->getParticipant($active_id)->getQuestionsWorkedThroughInPercent()) . " %" . ")");
360 
361  $this->tpl->setVariable("TXT_TIMEOFWORK", $this->lng->txt("tst_stat_result_timeofwork"));
362  $time_seconds = $data->getParticipant($active_id)->getTimeOfWork();
363  $atime_seconds = $data->getParticipant($active_id)->getNumberOfQuestions() ? $time_seconds / $data->getParticipant($active_id)->getNumberOfQuestions() : 0;
364  $time_hours = floor($time_seconds/3600);
365  $time_seconds -= $time_hours * 3600;
366  $time_minutes = floor($time_seconds/60);
367  $time_seconds -= $time_minutes * 60;
368  $this->tpl->setVariable("VALUE_TIMEOFWORK", sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $time_seconds));
369  $this->tpl->setVariable("TXT_ATIMEOFWORK", $this->lng->txt("tst_stat_result_atimeofwork"));
370  $time_hours = floor($atime_seconds/3600);
371  $atime_seconds -= $time_hours * 3600;
372  $time_minutes = floor($atime_seconds/60);
373  $atime_seconds -= $time_minutes * 60;
374  $this->tpl->setVariable("VALUE_ATIMEOFWORK", sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $atime_seconds));
375  $this->tpl->setVariable("TXT_FIRSTVISIT", $this->lng->txt("tst_stat_result_firstvisit"));
376  #$this->tpl->setVariable("VALUE_FIRSTVISIT",
377  # date($this->lng->text["lang_dateformat"] . " " . $this->lng->text["lang_timeformat"], $data->getParticipant($active_id)->getFirstVisit())
378  #);
379  $this->tpl->setVariable('VAL_FIRST_VISIT',ilDatePresentation::formatDate(
380  new ilDateTime($data->getParticipant($active_id)->getFirstVisit(),IL_CAL_UNIX)));
381  $this->tpl->setVariable("TXT_LASTVISIT", $this->lng->txt("tst_stat_result_lastvisit"));
382  #$this->tpl->setVariable("VALUE_LASTVISIT",
383  # date($this->lng->text["lang_dateformat"] . " " . $this->lng->text["lang_timeformat"], $data->getParticipant($active_id)->getLastVisit())
384  #);
385  $this->tpl->setVariable('VAL_FIRST_VISIT',ilDatePresentation::formatDate(
386  new ilDateTime($data->getParticipant($active_id)->getLastVisit(),IL_CAL_UNIX)));
387 
388  $this->tpl->setVariable("TXT_NROFPASSES", $this->lng->txt("tst_nr_of_passes"));
389  $this->tpl->setVariable("VALUE_NROFPASSES", $data->getParticipant($active_id)->getLastPass() + 1);
390  $this->tpl->setVariable("TXT_SCOREDPASS", $this->lng->txt("scored_pass"));
391  if ($this->object->getPassScoring() == SCORE_BEST_PASS)
392  {
393  $this->tpl->setVariable("VALUE_SCOREDPASS", $data->getParticipant($active_id)->getBestPass() + 1);
394  }
395  else
396  {
397  $this->tpl->setVariable("VALUE_SCOREDPASS", $data->getParticipant($active_id)->getLastPass() + 1);
398  }
399 
400  $median = $data->getStatistics()->getStatistics()->median();
401  $pct = $data->getParticipant($active_id)->getMaxpoints() ? ($median / $data->getParticipant($active_id)->getMaxpoints()) * 100.0 : 0;
402  $mark = $this->object->mark_schema->getMatchingMark($pct);
403  if (is_object($mark))
404  {
405  $this->tpl->setVariable("TXT_MARK_MEDIAN", $this->lng->txt("tst_stat_result_mark_median"));
406  $this->tpl->setVariable("VALUE_MARK_MEDIAN", $mark->getShortName());
407  }
408 
409  $this->tpl->setVariable("TXT_RANK_PARTICIPANT", $this->lng->txt("tst_stat_result_rank_participant"));
410  $this->tpl->setVariable("VALUE_RANK_PARTICIPANT", $data->getStatistics()->getStatistics()->rank($data->getParticipant($active_id)->getReached()));
411  $this->tpl->setVariable("TXT_RANK_MEDIAN", $this->lng->txt("tst_stat_result_rank_median"));
412  $this->tpl->setVariable("VALUE_RANK_MEDIAN", $data->getStatistics()->getStatistics()->rank_median());
413  $this->tpl->setVariable("TXT_TOTAL_PARTICIPANTS", $this->lng->txt("tst_stat_result_total_participants"));
414  $this->tpl->setVariable("VALUE_TOTAL_PARTICIPANTS", $data->getStatistics()->getStatistics()->count());
415  $this->tpl->setVariable("TXT_RESULT_MEDIAN", $this->lng->txt("tst_stat_result_median"));
416  $this->tpl->setVariable("VALUE_RESULT_MEDIAN", $median);
417 
418  for ($pass = 0; $pass <= $data->getParticipant($active_id)->getLastPass(); $pass++)
419  {
420  $finishdate = $this->object->getPassFinishDate($active_id, $pass);
421  if ($finishdate > 0)
422  {
423  $this->tpl->setCurrentBlock("question_header");
424  $this->tpl->setVariable("TXT_QUESTION_DATA", sprintf($this->lng->txt("tst_eval_question_points"), $pass+1));
425  $this->tpl->parseCurrentBlock();
426  global $ilAccess;
427  if (($ilAccess->checkAccess("write", "", $_GET["ref_id"])))
428  {
429  $this->tpl->setCurrentBlock("question_footer");
430  $this->tpl->setVariable("TEXT_TO_DETAILED_RESULTS", $this->lng->txt("tst_show_answer_sheet"));
431  $this->ctrl->setParameter($this, "statistics", "1");
432  $this->ctrl->setParameter($this, "active_id", $active_id);
433  $this->ctrl->setParameter($this, "pass", $pass);
434  $this->tpl->setVariable("URL_TO_DETAILED_RESULTS", $this->ctrl->getLinkTarget($this, "outParticipantsPassDetails"));
435  $this->tpl->parseCurrentBlock();
436  }
437  $questions = $data->getParticipant($active_id)->getQuestions($pass);
438  if (!is_array($questions))
439  {
440  $questions = $data->getParticipant($active_id)->getQuestions(0);
441  }
442  $counter = 1;
443  foreach ($questions as $question)
444  {
445  $this->tpl->setCurrentBlock("question_row");
446  $this->tpl->setVariable("QUESTION_COUNTER", $counter);
447  $this->tpl->setVariable("QUESTION_TITLE", $data->getQuestionTitle($question["id"]));
448  $answeredquestion = $data->getParticipant($active_id)->getPass($pass)->getAnsweredQuestionByQuestionId($question["id"]);
449  if (is_array($answeredquestion))
450  {
451  $percent = $answeredquestion["points"] ? $answeredquestion["reached"] / $answeredquestion["points"] * 100.0 : 0;
452  $this->tpl->setVariable("QUESTION_POINTS", $answeredquestion["reached"] . " " . strtolower($this->lng->txt("of")) . " " . $answeredquestion["points"] . " (" . sprintf("%.2f", $percent) . " %)");
453  }
454  else
455  {
456  $this->tpl->setVariable("QUESTION_POINTS", "0 " . strtolower($this->lng->txt("of")) . " " . $question["points"] . " (" . sprintf("%.2f", 0) . " %) - " . $this->lng->txt("question_not_answered"));
457  }
458  $this->tpl->parseCurrentBlock();
459  $counter++;
460  }
461  $this->tpl->touchBlock("question_stats");
462  }
463  }
464  }
465 
472  {
473  $this->getQuestionResultForTestUsers($_GET["qid"], $this->object->getTestId());
474  }
475 
482  {
483  $question_object =& ilObjTest::_instanciateQuestion($_GET["qid"]);
484  $download = "";
485  if (method_exists($question_object, "getFileUploadZIPFile"))
486  {
487  $question_object->getFileUploadZIPFile($this->object->getTestId());
488  }
489  else
490  {
491  $this->ctrl->redirect($this, "singleResults");
492  }
493  }
494 
502  function eval_a()
503  {
504  global $ilAccess;
505 
506  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
507  {
508  // allow only evaluation access
509  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), true);
510  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
511  }
512 
513  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_eval_anonymous_aggregation.html", "Modules/Test");
514  $eval =& $this->object->getCompleteEvaluationData();
515  $data = array();
516  $foundParticipants =& $eval->getParticipants();
517  if (count($foundParticipants))
518  {
519  $template = new ilTemplate("tpl.il_as_tst_evaluation_export.html", TRUE, TRUE, "Modules/Test");
520  $template->setVariable("EXPORT_DATA", $this->lng->txt("exp_eval_data"));
521  $template->setVariable("TEXT_EXCEL", $this->lng->txt("exp_type_excel"));
522  $template->setVariable("TEXT_CSV", $this->lng->txt("exp_type_spss"));
523  $template->setVariable("CMD_EXPORT", "exportAggregatedResults");
524  $template->setVariable("BTN_EXPORT", $this->lng->txt("export"));
525  $template->setVariable("BTN_PRINT", $this->lng->txt("print"));
526  $template->setVariable("BTN_COMMAND", $this->ctrl->getCmd());
527  $template->setVariable("FORM_ACTION", $this->ctrl->getFormAction($this, "exportAggregatedResults"));
528  $exportoutput = $template->get();
529  $this->tpl->setVariable("EVALUATION_EXPORT", $exportoutput);
530 
531  array_push($data, array(
532  'result' => $this->lng->txt("tst_eval_total_persons"),
533  'value' => count($foundParticipants)
534  ));
535  $total_finished = $this->object->evalTotalFinished();
536  array_push($data, array(
537  'result' => $this->lng->txt("tst_eval_total_finished"),
538  'value' => $total_finished
539  ));
540  $average_time = $this->object->evalTotalStartedAverageTime();
541  $diff_seconds = $average_time;
542  $diff_hours = floor($diff_seconds/3600);
543  $diff_seconds -= $diff_hours * 3600;
544  $diff_minutes = floor($diff_seconds/60);
545  $diff_seconds -= $diff_minutes * 60;
546  array_push($data, array(
547  'result' => $this->lng->txt("tst_eval_total_finished_average_time"),
548  'value' => sprintf("%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds)
549  ));
550  $total_passed = 0;
551  $total_passed_reached = 0;
552  $total_passed_max = 0;
553  $total_passed_time = 0;
554  foreach ($foundParticipants as $userdata)
555  {
556  if ($userdata->getPassed())
557  {
558  $total_passed++;
559  $total_passed_reached += $userdata->getReached();
560  $total_passed_max += $userdata->getMaxpoints();
561  $total_passed_time += $userdata->getTimeOfWork();
562  }
563  }
564  $average_passed_reached = $total_passed ? $total_passed_reached / $total_passed : 0;
565  $average_passed_max = $total_passed ? $total_passed_max / $total_passed : 0;
566  $average_passed_time = $total_passed ? $total_passed_time / $total_passed : 0;
567  array_push($data, array(
568  'result' => $this->lng->txt("tst_eval_total_passed"),
569  'value' => $total_passed
570  ));
571  array_push($data, array(
572  'result' => $this->lng->txt("tst_eval_total_passed_average_points"),
573  'value' => sprintf("%2.2f", $average_passed_reached) . " " . strtolower($this->lng->txt("of")) . " " . sprintf("%2.2f", $average_passed_max)
574  ));
575  $average_time = $average_passed_time;
576  $diff_seconds = $average_time;
577  $diff_hours = floor($diff_seconds/3600);
578  $diff_seconds -= $diff_hours * 3600;
579  $diff_minutes = floor($diff_seconds/60);
580  $diff_seconds -= $diff_minutes * 60;
581  array_push($data, array(
582  'result' => $this->lng->txt("tst_eval_total_passed_average_time"),
583  'value' => sprintf("%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds)
584  ));
585  }
586 
587  include_once "./Modules/Test/classes/tables/class.ilTestAggregatedResultsTableGUI.php";
588  $table_gui = new ilTestAggregatedResultsTableGUI($this, 'eval_a');
589  $table_gui->setData($data);
590  $this->tpl->setVariable('AGGREGATED_RESULTS', $table_gui->getHTML());
591 
592  $rows = array();
593  foreach ($eval->getQuestionTitles() as $question_id => $question_title)
594  {
595  $answered = 0;
596  $reached = 0;
597  $max = 0;
598  foreach ($foundParticipants as $userdata)
599  {
600  for ($i = 0; $i <= $userdata->getLastPass(); $i++)
601  {
602  if (is_object($userdata->getPass($i)))
603  {
604  $question =& $userdata->getPass($i)->getAnsweredQuestionByQuestionId($question_id);
605  if (is_array($question))
606  {
607  $answered++;
608  $reached += $question["reached"];
609  $max += $question["points"];
610  }
611  }
612  }
613  }
614  $percent = $max ? $reached/$max * 100.0 : 0;
615  $counter++;
616  $this->ctrl->setParameter($this, "qid", $question_id);
617  array_push($rows,
618  array(
619  'title' => $question_title,
620  'points' => sprintf("%.2f", $answered ? $reached / $answered : 0) . " " . strtolower($this->lng->txt("of")) . " " . sprintf("%.2f", $answered ? $max / $answered : 0),
621  'percentage' => (float)$percent,
622  'answers' => $answered
623  )
624  );
625  }
626  include_once "./Modules/Test/classes/tables/class.ilTestAverageReachedPointsTableGUI.php";
627  $table_gui = new ilTestAverageReachedPointsTableGUI($this, 'eval_a');
628  $table_gui->setData($rows);
629  $this->tpl->setVariable('TBL_AVG_REACHED', $table_gui->getHTML());
630  }
631 
637  function exportEvaluation()
638  {
639  $filterby = "";
640  if (array_key_exists("g_filterby", $_GET))
641  {
642  $filterby = $_GET["g_filterby"];
643  }
644  $filtertext = "";
645  if (array_key_exists("g_userfilter", $_GET))
646  {
647  $filtertext = $_GET["g_userfilter"];
648  }
649  $passedonly = FALSE;
650  if (array_key_exists("g_passedonly", $_GET))
651  {
652  if ($_GET["g_passedonly"] == 1)
653  {
654  $passedonly = TRUE;
655  }
656  }
657  switch ($_POST["export_type"])
658  {
659  case "excel":
660  include_once "./Modules/Test/classes/class.ilTestExport.php";
661  $exportObj = new ilTestExport($this->object, "results");
662  $exportObj->exportToExcel($deliver = TRUE, $filterby, $filtertext, $passedonly);
663  break;
664  case "csv":
665  include_once "./Modules/Test/classes/class.ilTestExport.php";
666  $exportObj = new ilTestExport($this->object, "results");
667  $exportObj->exportToCSV($deliver = TRUE, $filterby, $filtertext, $passedonly);
668  break;
669  case "certificate":
670  if ($passedonly)
671  {
672  $this->ctrl->setParameterByClass("iltestcertificategui", "g_passedonly", "1");
673  }
674  if (strlen($filtertext))
675  {
676  $this->ctrl->setParameterByClass("iltestcertificategui", "g_userfilter", $filtertext);
677  }
678  $this->ctrl->redirect($this, "exportCertificate");
679  break;
680  }
681  }
682 
689  {
690  switch ($_POST["export_type"])
691  {
692  case "excel":
693  include_once "./Modules/Test/classes/class.ilTestExport.php";
694  $exportObj = new ilTestExport($this->object, "aggregated");
695  $exportObj->exportToExcel($deliver = TRUE);
696  break;
697  case "csv":
698  include_once "./Modules/Test/classes/class.ilTestExport.php";
699  $exportObj = new ilTestExport($this->object, "aggregated");
700  $exportObj->exportToCSV($deliver = TRUE);
701  break;
702  }
703  }
704 
711  public function exportCertificate()
712  {
713  global $ilUser;
714 
715  include_once "./Services/Utilities/classes/class.ilUtil.php";
716  include_once "./Services/Certificate/classes/class.ilCertificate.php";
717  include_once "./Modules/Test/classes/class.ilTestCertificateAdapter.php";
718  $certificate = new ilCertificate(new ilTestCertificateAdapter($this->object));
719  $archive_dir = $certificate->createArchiveDirectory();
720  $total_users = array();
721  $total_users =& $this->object->evalTotalPersonsArray();
722  if (count($total_users))
723  {
724  foreach ($total_users as $active_id => $name)
725  {
726  $user_id = $this->object->_getUserIdFromActiveId($active_id);
727  $pdf = $certificate->outCertificate(
728  array(
729  "active_id" => $active_id,
730  "userfilter" => $userfilter,
731  "passedonly" => $passedonly
732  ),
733  FALSE
734  );
735  if (strlen($pdf))
736  {
737  $certificate->addPDFtoArchiveDirectory($pdf, $archive_dir, $user_id . "_" . str_replace(" ", "_", ilUtil::getASCIIFilename($name)) . ".pdf");
738  }
739  }
740  $zipArchive = $certificate->zipCertificatesInArchiveDirectory($archive_dir, TRUE);
741  }
742 
743  }
744 
751  function getEvaluationQuestionId($question_id, $original_id = "")
752  {
753  if ($original_id > 0)
754  {
755  return $original_id;
756  }
757  else
758  {
759  return $question_id;
760  }
761  }
762 
771  {
772  global $ilias, $ilAccess;
773 
774  $this->ctrl->saveParameter($this, "pass");
775 
776  if (!$ilAccess->checkAccess('write', '', $this->ref_id))
777  {
778  // allow only write access
779  ilUtil::sendInfo($this->lng->txt('no_permission'), true);
780  $this->ctrl->redirectByClass('ilObjTestGUI', 'infoScreen');
781  }
782 
783  $this->ctrl->saveParameter($this, "active_id");
784  $active_id = $_GET["active_id"];
785 
786  $testSession = $this->object->getTestSession($active_id);
787 
788  // protect actives from other tests
789  if( $testSession->getTestId() != $this->object->getTestId() )
790  {
791  ilUtil::sendInfo($this->lng->txt('no_permission'), true);
792  $this->ctrl->redirectByClass('ilObjTestGUI', 'infoScreen');
793  }
794 
795  $this->ctrl->saveParameter($this, "pass");
796  $pass = (int)$_GET["pass"];
797 
798  $result_array =& $this->object->getTestResult($active_id, $pass);
799 
800  $overview = $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outParticipantsPassDetails");
801  $user_data = $this->getResultsUserdata($active_id, FALSE);
802  $user_id = $this->object->_getUserIdFromActiveId($active_id);
803 
804  $template = new ilTemplate("tpl.il_as_tst_pass_details_overview_participants.html", TRUE, TRUE, "Modules/Test");
805 
806  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
807  if(ilRPCServerSettings::getInstance()->isEnabled())
808  {
809  $this->ctrl->setParameter($this, "pdf", "1");
810  $template->setCurrentBlock("pdf_export");
811  $template->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outParticipantsPassDetails"));
812  $this->ctrl->setParameter($this, "pdf", "");
813  $template->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
814  $template->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
815  $template->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
816  $template->parseCurrentBlock();
817  }
818 
819  if (array_key_exists("statistics", $_GET) && ($_GET["statistics"] == 1))
820  {
821  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
822  $this->ctrl->setParameterByClass("ilTestEvaluationGUI", "active_id", $active_id);
823  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilTestEvaluationGUI", "detailedEvaluation"));
824  }
825  else
826  {
827  if ($this->object->getNrOfTries() == 1)
828  {
829  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
830  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "participants"));
831  }
832  else
833  {
834  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass(get_class($this), "outParticipantsResultsOverview"));
835  $template->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_overview"));
836  }
837  }
838  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
839  $template->setVariable("PRINT_URL", "javascript:window.print();");
840 
841  if ($this->object->getNrOfTries() == 1)
842  {
843  $statement = $this->getFinalStatement($active_id);
844  $template->setVariable("USER_MARK", $statement["mark"]);
845  if (strlen($statement["markects"]))
846  {
847  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
848  }
849  }
850 
851  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, TRUE);
852  $template->setVariable("LIST_OF_ANSWERS", $list_of_answers);
853  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
854  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
855  $template->setVariable("PASS_DETAILS", $overview);
856  $template->setVariable("USER_DETAILS", $user_data);
857  $uname = $this->object->userLookupFullName($user_id);
858  $template->setVariable("USER_NAME", sprintf($this->lng->txt("tst_result_user_name_pass"), $pass + 1, $uname));
859 
860  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
861  if ($this->object->getShowSolutionAnswersOnly())
862  {
863  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
864  }
865 
866  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
867  {
868  $this->object->deliverPDFfromHTML($template->get());
869  }
870  else
871  {
872  $this->tpl->setVariable("ADM_CONTENT", $template->get());
873  }
874  }
875 
884  {
885  global $ilias, $ilAccess;
886 
887  if (!$ilAccess->checkAccess('write', '', $this->ref_id))
888  {
889  // allow only write access
890  ilUtil::sendInfo($this->lng->txt('no_permission'), true);
891  $this->ctrl->redirectByClass('ilObjTestGUI', 'infoScreen');
892  }
893 
894  $active_id = (int)$_GET["active_id"];
895  $testSession = $this->object->getTestSession($active_id);
896 
897  // protect actives from other tests
898  if( $testSession->getTestId() != $this->object->getTestId() )
899  {
900  ilUtil::sendInfo($this->lng->txt('no_permission'), true);
901  $this->ctrl->redirectByClass('ilObjTestGUI', 'infoScreen');
902  }
903 
904  if ($this->object->getNrOfTries() == 1)
905  {
906  $this->ctrl->setParameter($this, "active_id", $active_id);
907  $this->ctrl->setParameter($this, "pass", ilObjTest::_getResultPass($active_id));
908  $this->ctrl->redirect($this, "outParticipantsPassDetails");
909  }
910 
911  $template = new ilTemplate("tpl.il_as_tst_pass_overview_participants.html", TRUE, TRUE, "Modules/Test");
912 
913  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
914  if(ilRPCServerSettings::getInstance()->isEnabled())
915  {
916  $this->ctrl->setParameter($this, "pdf", "1");
917  $template->setCurrentBlock("pdf_export");
918  $template->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outParticipantsResultsOverview"));
919  $this->ctrl->setParameter($this, "pdf", "");
920  $template->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
921  $template->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
922  $template->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
923  $template->parseCurrentBlock();
924  }
925 
926  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outParticipantsPassDetails");
927  $template->setVariable("PASS_OVERVIEW", $overview);
928  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
929  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
930  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "participants"));
931  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
932  $template->setVariable("PRINT_URL", "javascript:window.print();");
933 
934  $statement = $this->getFinalStatement($active_id);
935  $user_id = $this->object->_getUserIdFromActiveId($active_id);
936  $user_data = $this->getResultsUserdata($active_id);
937  $template->setVariable("USER_DATA", $user_data);
938  $template->setVariable("TEXT_OVERVIEW", $this->lng->txt("tst_results_overview"));
939  $template->setVariable("USER_MARK", $statement["mark"]);
940  if (strlen($statement["markects"]))
941  {
942  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
943  }
944  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
945  $template->parseCurrentBlock();
946 
947  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
948  if ($this->object->getShowSolutionAnswersOnly())
949  {
950  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
951  }
952 
953  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
954  {
955  $this->object->deliverPDFfromHTML($template->get(), $this->object->getTitle());
956  }
957  else
958  {
959  $this->tpl->setVariable("ADM_CONTENT", $template->get());
960  }
961  }
962 
971  {
972  $testSession = $this->object->getTestSession();
973 
974  $active_id = $testSession->getActiveId();
975  $user_id = $testSession->getUserId();
976 
977  $this->ctrl->saveParameter($this, "pass");
978  $pass = $_GET["pass"];
979  $result_array =& $this->object->getTestResult($active_id, $pass);
980 
981  $command_solution_details = "";
982  if ($this->object->getShowSolutionDetails())
983  {
984  $command_solution_details = "outCorrectSolution";
985  }
986  $overview = $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outUserPassDetails", $command_solution_details);
987 
988  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_pass_details_overview_participants.html", "Modules/Test");
989 
990  if ($this->object->getNrOfTries() == 1)
991  {
992  $this->tpl->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
993  $this->tpl->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
994  }
995  else
996  {
997  $this->tpl->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass(get_class($this), "outUserResultsOverview"));
998  $this->tpl->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_overview"));
999  }
1000 
1001  $this->tpl->parseCurrentBlock();
1002 
1003  if ($this->object->getNrOfTries() == 1)
1004  {
1005  $statement = $this->getFinalStatement($active_id);
1006  $this->tpl->setVariable("USER_MARK", $statement["mark"]);
1007  if (strlen($statement["markects"]))
1008  {
1009  $this->tpl->setVariable("USER_MARK_ECTS", $statement["markects"]);
1010  }
1011  }
1012 
1013  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass);
1014 
1015  $this->tpl->setCurrentBlock("adm_content");
1016  $this->tpl->setVariable("LIST_OF_ANSWERS", $list_of_answers);
1017  $this->tpl->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
1018  $this->tpl->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
1019  $this->tpl->setVariable("PASS_DETAILS", $overview);
1020  $uname = $this->object->userLookupFullName($user_id, TRUE);
1021  $this->tpl->setVariable("USER_NAME", sprintf($this->lng->txt("tst_result_user_name_pass"), $pass + 1, $uname));
1022  $this->tpl->parseCurrentBlock();
1023 
1024  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1025  if ($this->object->getShowSolutionAnswersOnly())
1026  {
1027  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1028  }
1029  }
1030 
1039  {
1040  global $ilUser, $ilias, $ilLog;
1041 
1042  if (!$this->object->canShowTestResults($ilUser->getId())) $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1043  include_once("./classes/class.ilTemplate.php");
1044  $templatehead = new ilTemplate("tpl.il_as_tst_results_participants.html", TRUE, TRUE, "Modules/Test");
1045  $template = new ilTemplate("tpl.il_as_tst_results_participant.html", TRUE, TRUE, "Modules/Test");
1046 
1047  $pass = null;
1048  $user_id = $ilUser->getId();
1049  $uname = $this->object->userLookupFullName($user_id, TRUE);
1050  $active_id = $this->object->getTestSession()->getActiveId();
1051  $hide_details = !$this->object->getShowPassDetails();
1052  if ($hide_details)
1053  {
1054  $executable = $this->object->isExecutable($ilUser->getId());
1055  if (!$executable["executable"]) $hide_details = FALSE;
1056  }
1057  $begin = microtime(true);
1058  if (($this->object->getNrOfTries() == 1) && (!$hide_details))
1059  {
1060  $pass = 0;
1061  }
1062  else
1063  {
1064  $template->setCurrentBlock("pass_overview");
1065  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outUserResultsOverview", FALSE, $hide_details);
1066  $template->setVariable("PASS_OVERVIEW", $overview);
1067  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results_overview"));
1068  $template->parseCurrentBlock();
1069  }
1070 
1071  if (((array_key_exists("pass", $_GET)) && (strlen($_GET["pass"]) > 0)) || (!is_null($pass)))
1072  {
1073  if (is_null($pass)) $pass = $_GET["pass"];
1074  }
1075 
1076  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
1077  if(ilRPCServerSettings::getInstance()->isEnabled())
1078  {
1079  $this->ctrl->setParameter($this, "pass", $pass);
1080  $this->ctrl->setParameter($this, "pdf", "1");
1081  $templatehead->setCurrentBlock("pdf_export");
1082  $templatehead->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outUserResultsOverview"));
1083  $this->ctrl->setParameter($this, "pass", "");
1084  $this->ctrl->setParameter($this, "pdf", "");
1085  $templatehead->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
1086  $templatehead->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
1087  $templatehead->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
1088  $templatehead->parseCurrentBlock();
1089  if ($this->object->canShowCertificate($user_id, $active_id))
1090  {
1091  $templatehead->setVariable("CERTIFICATE_URL", $this->ctrl->getLinkTarget($this, "outCertificate"));
1092  $templatehead->setVariable("CERTIFICATE_TEXT", $this->lng->txt("certificate"));
1093  }
1094  }
1095  $templatehead->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
1096  $templatehead->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
1097  $templatehead->setVariable("PRINT_TEXT", $this->lng->txt("print"));
1098  $templatehead->setVariable("PRINT_URL", "javascript:window.print();");
1099 
1100  $statement = $this->getFinalStatement($active_id);
1101  $user_data = $this->getResultsUserdata($active_id, TRUE);
1102 
1103  // output of the details of a selected pass
1104  $this->ctrl->saveParameter($this, "pass");
1105  $this->ctrl->saveParameter($this, "active_id");
1106  if (!is_null($pass))
1107  {
1108  $result_array =& $this->object->getTestResult($active_id, $pass);
1109  $command_solution_details = "";
1110  if ($this->object->getShowSolutionDetails())
1111  {
1112  $command_solution_details = "outCorrectSolution";
1113  }
1114  $detailsoverview = (!$hide_details) ? $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outUserResultsOverview", $command_solution_details) : '';
1115 
1116  $user_id = $this->object->_getUserIdFromActiveId($active_id);
1117 
1118  if (!$hide_details && $this->object->canShowSolutionPrintview())
1119  {
1120  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass);
1121  }
1122  else if ($this->object->getShowSolutionDetails())
1123  {
1124  // if this is not commented out, all questions with checkmarks/crosses will be shown
1125  // $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, true);
1126  }
1127 
1128  $template->setVariable("LIST_OF_ANSWERS", $list_of_answers);
1129  $template->setVariable("PASS_RESULTS_OVERVIEW", sprintf($this->lng->txt("tst_results_overview_pass"), $pass + 1));
1130  $template->setVariable("PASS_DETAILS", $detailsoverview);
1131 
1132  $signature = $this->getResultsSignature();
1133  $template->setVariable("SIGNATURE", $signature);
1134  }
1135  if ($this->object->getAnonymity()) {
1136  $template->setVariable("TEXT_HEADING", $this->lng->txt("tst_result"));
1137  }
1138  else {
1139  $template->setVariable("TEXT_HEADING", sprintf($this->lng->txt("tst_result_user_name"), $uname));
1140  $template->setVariable("USER_DATA", $user_data);
1141  }
1142  $template->setVariable("USER_MARK", $statement["mark"]);
1143  if (strlen($statement["markects"]))
1144  {
1145  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
1146  }
1147  $template->parseCurrentBlock();
1148 
1149  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1150  if ($this->object->getShowSolutionAnswersOnly())
1151  {
1152  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1153  }
1154  $templatehead->setVariable("RESULTS_PARTICIPANT", $template->get());
1155 
1156  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
1157  {
1158  $this->object->deliverPDFfromHTML($template->get(), sprintf($this->lng->txt("tst_result_user_name"), $uname));
1159  }
1160  else
1161  {
1162  $this->tpl->setVariable("PRINT_CONTENT", $templatehead->get());
1163  }
1164  }
1165 
1174  {
1175  global $ilUser;
1176 
1177  if (!$this->object->getShowSolutionPrintview())
1178  {
1179  ilUtil::sendInfo($this->lng->txt("no_permission"), true);
1180  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1181  }
1182 
1183  $template = new ilTemplate("tpl.il_as_tst_info_list_of_answers.html", TRUE, TRUE, "Modules/Test");
1184 
1185  $pass = null;
1186  if (array_key_exists("pass", $_GET))
1187  {
1188  if (strlen($_GET["pass"])) $pass = $_GET["pass"];
1189  }
1190  $user_id = $ilUser->getId();
1191  $active_id = $this->object->getTestSession()->getActiveId();
1192  $overview = "";
1193  if ($this->object->getNrOfTries() == 1)
1194  {
1195  $pass = 0;
1196  }
1197  else
1198  {
1199  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outUserListOfAnswerPasses", TRUE);
1200  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_passes"));
1201  $template->setVariable("PASS_OVERVIEW", $overview);
1202  }
1203 
1204  $signature = "";
1205  if (strlen($pass))
1206  {
1207  $signature = $this->getResultsSignature();
1208  $result_array =& $this->object->getTestResult($active_id, $pass);
1209  $user_id =& $this->object->_getUserIdFromActiveId($active_id);
1210  $showAllAnswers = TRUE;
1211  if ($this->object->isExecutable($user_id))
1212  {
1213  $showAllAnswers = FALSE;
1214  }
1215  $answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, FALSE, $showAllAnswers);
1216  $template->setVariable("PASS_DETAILS", $answers);
1217  }
1218  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
1219  $template->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
1220  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
1221  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
1222  $template->setVariable("PRINT_URL", "javascript:window.print();");
1223 
1224  $user_data = $this->getResultsUserdata($active_id, TRUE);
1225  $template->setVariable("USER_DATA", $user_data);
1226  $template->setVariable("TEXT_LIST_OF_ANSWERS", $this->lng->txt("tst_list_of_answers"));
1227  if (strlen($signature))
1228  {
1229  $template->setVariable("SIGNATURE", $signature);
1230  }
1231  $this->tpl->setVariable("ADM_CONTENT", $template->get());
1232 
1233  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1234  if ($this->object->getShowSolutionAnswersOnly())
1235  {
1236  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1237  }
1238  }
1239 
1247  function passDetails()
1248  {
1249  if (array_key_exists("pass", $_GET) && (strlen($_GET["pass"]) > 0))
1250  {
1251  $this->ctrl->saveParameter($this, "pass");
1252  $this->ctrl->saveParameter($this, "active_id");
1253  $this->outTestResults(false, $_GET["pass"]);
1254  }
1255  else
1256  {
1257  $this->outTestResults(false);
1258  }
1259  }
1260 
1267  {
1268  if( !$this->object->getShowSolutionDetails() )
1269  {
1270  ilUtil::sendInfo($this->lng->txt("no_permission"), true);
1271  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1272  }
1273 
1274  $activeId = $this->testSessionFactory->getSession()->getActiveId();
1275 
1276  if( !($activeId > 0) )
1277  {
1278  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1279  }
1280 
1281  $this->ctrl->saveParameter($this, "pass");
1282  $pass = (int)$_GET['pass'];
1283 
1284  $questionId = (int)$_GET['evaluation'];
1285 
1286  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_correct_solution.html", "Modules/Test");
1287 
1288  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
1289  $this->tpl->setCurrentBlock("ContentStyle");
1290  $this->tpl->setVariable("LOCATION_CONTENT_STYLESHEET", ilObjStyleSheet::getContentStylePath(0));
1291  $this->tpl->parseCurrentBlock();
1292 
1293  $this->tpl->setCurrentBlock("SyntaxStyle");
1294  $this->tpl->setVariable("LOCATION_SYNTAX_STYLESHEET", ilObjStyleSheet::getSyntaxStylePath());
1295  $this->tpl->parseCurrentBlock();
1296 
1297  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1298  if ($this->object->getShowSolutionAnswersOnly())
1299  {
1300  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1301  }
1302 
1303  $this->tpl->setCurrentBlock("adm_content");
1304  $solution = $this->getCorrectSolutionOutput($questionId, $activeId, $pass);
1305  $this->tpl->setVariable("OUTPUT_SOLUTION", $solution);
1306  $this->tpl->setVariable("TEXT_BACK", $this->lng->txt("back"));
1307  $this->ctrl->saveParameter($this, "pass");
1308  $this->ctrl->saveParameter($this, "active_id");
1309  $this->tpl->setVariable("URL_BACK", $this->ctrl->getLinkTarget($this, "outUserResultsOverview"));
1310  $this->tpl->parseCurrentBlock();
1311  }
1312 
1318  function singleResults()
1319  {
1320  global $ilAccess;
1321 
1322  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
1323  {
1324  // allow only evaluation access
1325  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), true);
1326  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1327  }
1328 
1329  $data =& $this->object->getCompleteEvaluationData();
1330  $color_class = array("tblrow1", "tblrow2");
1331  $counter = 0;
1332  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_eval_single_answers.html", "Modules/Test");
1333  $foundParticipants =& $data->getParticipants();
1334  if (count($foundParticipants) == 0)
1335  {
1336  ilUtil::sendInfo($this->lng->txt("tst_no_evaluation_data"));
1337  return;
1338  }
1339  else
1340  {
1341  $rows = array();
1342  foreach ($data->getQuestionTitles() as $question_id => $question_title)
1343  {
1344  $answered = 0;
1345  $reached = 0;
1346  $max = 0;
1347  foreach ($foundParticipants as $userdata)
1348  {
1349  $pass = $userdata->getScoredPass();
1350  if (is_object($userdata->getPass($pass)))
1351  {
1352  $question =& $userdata->getPass($pass)->getAnsweredQuestionByQuestionId($question_id);
1353  if (is_array($question))
1354  {
1355  $answered++;
1356  }
1357  }
1358  }
1359  $counter++;
1360  $this->ctrl->setParameter($this, "qid", $question_id);
1361  $question_object =& ilObjTest::_instanciateQuestion($question_id);
1362  $download = "";
1363  if (method_exists($question_object, "hasFileUploads"))
1364  {
1365  if ($question_object->hasFileUploads($this->object->getTestId()))
1366  {
1367  $download = "<a href=\"" . $this->ctrl->getLinkTarget($this, "exportFileUploadsForAllParticipants"). "\">" . $this->lng->txt("download") . "</a>";
1368  }
1369  }
1370  array_push($rows,
1371  array(
1372  $question_title,
1373  $answered,
1374  "<a href=\"" . $this->ctrl->getLinkTarget($this, "exportQuestionForAllParticipants"). "\">" . $this->lng->txt("pdf_export") . "</a>",
1375  $download
1376  )
1377  );
1378  }
1379  if (count($rows))
1380  {
1381  include_once("./Modules/Test/classes/tables/class.ilResultsByQuestionTableGUI.php");
1382  $table_gui = new ilResultsByQuestionTableGUI($this, "singleResults", $this->object->hasPDFProcessing());
1383 
1384  $table_gui->setTitle($this->lng->txt("tst_answered_questions_test"));
1385  $table_gui->setData($rows);
1386 
1387  $this->tpl->setVariable("TBL_SINGLE_ANSWERS", $table_gui->getHTML());
1388  }
1389  else
1390  {
1391  $this->tpl->setVariable("TBL_SINGLE_ANSWERS", $this->lng->txt("adm_no_special_users"));
1392  }
1393  }
1394  }
1395 
1399  public function outCertificate()
1400  {
1401  global $ilUser;
1402 
1403  $active_id = $this->object->getTestSession()->getActiveId();
1404  $counted_pass = ilObjTest::_getResultPass($active_id);
1405  include_once "./Services/Certificate/classes/class.ilCertificate.php";
1406  include_once "./Modules/Test/classes/class.ilTestCertificateAdapter.php";
1407  $certificate = new ilCertificate(new ilTestCertificateAdapter($this->object));
1408  $certificate->outCertificate(array("active_id" => $active_id, "pass" => $counted_pass));
1409  }
1410 
1411 }
1412 ?>