ILIAS  Release_4_0_x_branch Revision 61816
 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', array());
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', array());
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  if (!$this->object->getAnonymity())
166  {
167  $additionalFields = $this->object->getEvaluationAdditionalFields();
168  }
169  else
170  {
171  $additionalFields = array();
172  }
173  if ($this->object->ects_output)
174  {
175  array_push($additionalFields, 'ects_grade');
176  }
177  include_once "./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
178  $table_gui = new ilEvaluationAllTableGUI($this, 'outEvaluation', $additionalFields, $this->object->getAnonymity());
179  $data = array();
180  $arrFilter = array();
181  foreach ($table_gui->getFilterItems() as $item)
182  {
183  if ($item->getValue() !== false)
184  {
185  switch ($item->getPostVar())
186  {
187  case 'group':
188  case 'name':
189  case 'course':
190  $arrFilter[$item->getPostVar()] = $item->getValue();
191  break;
192  case 'passed_only':
193  $passedonly = $item->getChecked();
194  break;
195  }
196  }
197  }
198  include_once "./Modules/Test/classes/class.ilTestEvaluationData.php";
199  $eval = new ilTestEvaluationData($this->object);
200  $eval->setFilterArray($arrFilter);
201  $foundParticipants =& $eval->getParticipants();
202  $counter = 1;
203  if (count($foundParticipants) > 0)
204  {
205  if ($this->object->ects_output)
206  {
207  $passed_array =& $this->object->getTotalPointsPassedArray();
208  }
209  foreach ($foundParticipants as $active_id => $userdata)
210  {
211  $remove = FALSE;
212  if ($passedonly)
213  {
214  $mark_obj = $this->object->getMarkSchema()->getMatchingMark($userdata->getReachedPointsInPercent());
215  if ($mark_obj->getPassed() == FALSE)
216  {
217  $remove = TRUE;
218  }
219  }
220  if (!$remove)
221  {
222  // build the evaluation row
223  $userfields = ilObjUser::_lookupFields($userdata->getUserID());
224  foreach ($userfields as $key => $value)
225  {
226  $evaluationrow[$key] = strlen($value) ? $value : ' ';
227  }
228  $evaluationrow = array();
229  $fullname = "";
230  if ($this->object->getAnonymity())
231  {
232  $fullname = $counter;
233  $evaluationrow['name'] = $fullname;
234  $evaluationrow['login'] = '';
235  }
236  else
237  {
238  $evaluationrow['name'] = $userdata->getName();
239  if (strlen($userdata->getLogin()))
240  {
241  $evaluationrow['login'] = "[" . $userdata->getLogin() . "]";
242  }
243  else
244  {
245  $evaluationrow['login'] = '';
246  }
247  }
248 
249  $evaluationrow['reached'] = $userdata->getReached();
250  $evaluationrow['max'] = $userdata->getMaxpoints();
251  $percentage = $userdata->getReachedPointsInPercent();
252  $mark = $this->object->getMarkSchema()->getMatchingMark($percentage);
253  if (is_object($mark))
254  {
255  $evaluationrow['mark'] = $mark->getShortName();
256  }
257  if ($this->object->ects_output)
258  {
259  $ects_mark = $this->object->getECTSGrade($passed_array, $userdata->getReached(), $userdata->getMaxPoints());
260  $evaluationrow['ects_grade'] = $ects_mark;
261  }
262  $evaluationrow['answered'] = $userdata->getQuestionsWorkedThrough() . " " . strtolower($this->lng->txt("of")) . " " . $userdata->getNumberOfQuestions() . " (" . sprintf("%2.2f", $userdata->getQuestionsWorkedThroughInPercent()) . " %" . ")";
263  $time_seconds = $userdata->getTimeOfWork();
264  $time_hours = floor($time_seconds/3600);
265  $time_seconds -= $time_hours * 3600;
266  $time_minutes = floor($time_seconds/60);
267  $time_seconds -= $time_minutes * 60;
268  $evaluationrow['working_time'] = sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $time_seconds);
269  $this->ctrl->setParameter($this, "active_id", $active_id);
270  $href = $this->ctrl->getLinkTarget($this, "detailedEvaluation");
271  $detailed_evaluation = $this->lng->txt("detailed_evaluation_show");
272  $evaluationrow['details'] = "<a class=\"il_ContainerItemCommand\" href=\"$href\">$detailed_evaluation</a>";
273  $userfields = ilObjUser::_lookupFields($userdata->getUserID());
274  $evaluationrow['gender'] = $userfields['gender'];
275  $evaluationrow['email'] = $userfields['email'];
276  $evaluationrow['institution'] = $userfields['institution'];
277  $evaluationrow['street'] = $userfields['street'];
278  $evaluationrow['city'] = $userfields['city'];
279  $evaluationrow['zipcode'] = $userfields['zipcode'];
280  $evaluationrow['country'] = $userfields['country'];
281  $evaluationrow['departement'] = $userfields['departement'];
282  $evaluationrow['matriculation'] = $userfields['matriculation'];
283  $counter++;
284  array_push($data, $evaluationrow);
285  }
286  }
287  }
288 
289  $table_gui->setData($data);
290  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_evaluation.html", "Modules/Test");
291  $this->tpl->setVariable('EVALUATION_DATA', $table_gui->getHTML());
292  if (count($foundParticipants) > 0)
293  {
294  $template = new ilTemplate("tpl.il_as_tst_evaluation_export.html", TRUE, TRUE, "Modules/Test");
295  $template->setVariable("EXPORT_DATA", $this->lng->txt("exp_eval_data"));
296  if (!$this->object->getAnonymity())
297  {
298  include_once "./Services/Certificate/classes/class.ilCertificate.php";
299  include_once "./Modules/Test/classes/class.ilTestCertificateAdapter.php";
301  {
302  $template->setVariable("TEXT_CERTIFICATE", $this->lng->txt("exp_type_certificate"));
303  }
304  }
305  $template->setVariable("TEXT_EXCEL", $this->lng->txt("exp_type_excel"));
306  $template->setVariable("TEXT_CSV", $this->lng->txt("exp_type_spss"));
307  $template->setVariable("CMD_EXPORT", "exportEvaluation");
308  $template->setVariable("BTN_EXPORT", $this->lng->txt("export"));
309  $template->setVariable("BTN_PRINT", $this->lng->txt("print"));
310  $template->setVariable("BTN_COMMAND", $this->ctrl->getCmd());
311  $template->setVariable("FORM_ACTION", $this->ctrl->getFormAction($this, "exportEvaluation"));
312  $exportoutput = $template->get();
313  $this->tpl->setVariable("EVALUATION_EXPORT", $exportoutput);
314  }
315 
316  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
317  if ($this->object->getShowSolutionAnswersOnly())
318  {
319  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
320  }
321  }
322 
331  {
332  global $ilAccess;
333 
334  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
335  {
336  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), TRUE);
337  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
338  }
339 
340  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_evaluation_details.html", "Modules/Test");
341 
342  $active_id = $_GET["active_id"];
343  if (strlen($active_id) == 0)
344  {
345  ilUtil::sendInfo($this->lng->txt("detailed_evaluation_missing_active_id"), TRUE);
346  $this->ctrl->redirect($this, "outEvaluation");
347  }
348 
349  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
350 
351  $data =& $this->object->getCompleteEvaluationData();
352  $this->tpl->setVariable("TEXT_BACK", $this->lng->txt("back"));
353  $this->tpl->setVariable("URL_BACK", $this->ctrl->getLinkTarget($this, "outEvaluation"));
354  $this->tpl->setVariable("HEADING_DETAILED_EVALUATION", sprintf($this->lng->txt("detailed_evaluation_for"),
355  $data->getParticipant($active_id)->getName())
356  );
357  $this->tpl->setVariable("STATISTICAL_DATA", $this->lng->txt("statistical_data"));
358  $this->tpl->setVariable("TXT_RESULTSPOINTS", $this->lng->txt("tst_stat_result_resultspoints"));
359  $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()) . " %" . ")");
360  if (strlen($data->getParticipant($active_id)->getMark()))
361  {
362  $this->tpl->setVariable("TXT_RESULTSMARKS", $this->lng->txt("tst_stat_result_resultsmarks"));
363  $this->tpl->setVariable("VALUE_RESULTSMARKS", $data->getParticipant($active_id)->getMark());
364  if (strlen($data->getParticipant($active_id)->getECTSMark()))
365  {
366  $this->tpl->setVariable("TXT_ECTS", $this->lng->txt("ects_grade"));
367  $this->tpl->setVariable("VALUE_ECTS", $data->getParticipant($active_id)->getECTSMark());
368  }
369  }
370  $this->tpl->setVariable("TXT_QWORKEDTHROUGH", $this->lng->txt("tst_stat_result_qworkedthrough"));
371  $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()) . " %" . ")");
372 
373  $this->tpl->setVariable("TXT_TIMEOFWORK", $this->lng->txt("tst_stat_result_timeofwork"));
374  $time_seconds = $data->getParticipant($active_id)->getTimeOfWork();
375  $atime_seconds = $data->getParticipant($active_id)->getNumberOfQuestions() ? $time_seconds / $data->getParticipant($active_id)->getNumberOfQuestions() : 0;
376  $time_hours = floor($time_seconds/3600);
377  $time_seconds -= $time_hours * 3600;
378  $time_minutes = floor($time_seconds/60);
379  $time_seconds -= $time_minutes * 60;
380  $this->tpl->setVariable("VALUE_TIMEOFWORK", sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $time_seconds));
381  $this->tpl->setVariable("TXT_ATIMEOFWORK", $this->lng->txt("tst_stat_result_atimeofwork"));
382  $time_hours = floor($atime_seconds/3600);
383  $atime_seconds -= $time_hours * 3600;
384  $time_minutes = floor($atime_seconds/60);
385  $atime_seconds -= $time_minutes * 60;
386  $this->tpl->setVariable("VALUE_ATIMEOFWORK", sprintf("%02d:%02d:%02d", $time_hours, $time_minutes, $atime_seconds));
387  $this->tpl->setVariable("TXT_FIRSTVISIT", $this->lng->txt("tst_stat_result_firstvisit"));
388  #$this->tpl->setVariable("VALUE_FIRSTVISIT",
389  # date($this->lng->text["lang_dateformat"] . " " . $this->lng->text["lang_timeformat"], $data->getParticipant($active_id)->getFirstVisit())
390  #);
391  $this->tpl->setVariable('VAL_FIRST_VISIT',ilDatePresentation::formatDate(
392  new ilDateTime($data->getParticipant($active_id)->getFirstVisit(),IL_CAL_UNIX)));
393  $this->tpl->setVariable("TXT_LASTVISIT", $this->lng->txt("tst_stat_result_lastvisit"));
394  #$this->tpl->setVariable("VALUE_LASTVISIT",
395  # date($this->lng->text["lang_dateformat"] . " " . $this->lng->text["lang_timeformat"], $data->getParticipant($active_id)->getLastVisit())
396  #);
397  $this->tpl->setVariable('VAL_FIRST_VISIT',ilDatePresentation::formatDate(
398  new ilDateTime($data->getParticipant($active_id)->getLastVisit(),IL_CAL_UNIX)));
399 
400  $this->tpl->setVariable("TXT_NROFPASSES", $this->lng->txt("tst_nr_of_passes"));
401  $this->tpl->setVariable("VALUE_NROFPASSES", $data->getParticipant($active_id)->getLastPass() + 1);
402  $this->tpl->setVariable("TXT_SCOREDPASS", $this->lng->txt("scored_pass"));
403  if ($this->object->getPassScoring() == SCORE_BEST_PASS)
404  {
405  $this->tpl->setVariable("VALUE_SCOREDPASS", $data->getParticipant($active_id)->getBestPass() + 1);
406  }
407  else
408  {
409  $this->tpl->setVariable("VALUE_SCOREDPASS", $data->getParticipant($active_id)->getLastPass() + 1);
410  }
411 
412  $median = $data->getStatistics()->getStatistics()->median();
413  $pct = $data->getParticipant($active_id)->getMaxpoints() ? ($median / $data->getParticipant($active_id)->getMaxpoints()) * 100.0 : 0;
414  $mark = $this->object->mark_schema->getMatchingMark($pct);
415  if (is_object($mark))
416  {
417  $this->tpl->setVariable("TXT_MARK_MEDIAN", $this->lng->txt("tst_stat_result_mark_median"));
418  $this->tpl->setVariable("VALUE_MARK_MEDIAN", $mark->getShortName());
419  }
420 
421  $this->tpl->setVariable("TXT_RANK_PARTICIPANT", $this->lng->txt("tst_stat_result_rank_participant"));
422  $this->tpl->setVariable("VALUE_RANK_PARTICIPANT", $data->getStatistics()->getStatistics()->rank($data->getParticipant($active_id)->getReached()));
423  $this->tpl->setVariable("TXT_RANK_MEDIAN", $this->lng->txt("tst_stat_result_rank_median"));
424  $this->tpl->setVariable("VALUE_RANK_MEDIAN", $data->getStatistics()->getStatistics()->rank_median());
425  $this->tpl->setVariable("TXT_TOTAL_PARTICIPANTS", $this->lng->txt("tst_stat_result_total_participants"));
426  $this->tpl->setVariable("VALUE_TOTAL_PARTICIPANTS", $data->getStatistics()->getStatistics()->count());
427  $this->tpl->setVariable("TXT_RESULT_MEDIAN", $this->lng->txt("tst_stat_result_median"));
428  $this->tpl->setVariable("VALUE_RESULT_MEDIAN", $median);
429 
430  for ($pass = 0; $pass <= $data->getParticipant($active_id)->getLastPass(); $pass++)
431  {
432  $finishdate = $this->object->getPassFinishDate($active_id, $pass);
433  if ($finishdate > 0)
434  {
435  $this->tpl->setCurrentBlock("question_header");
436  $this->tpl->setVariable("TXT_QUESTION_DATA", sprintf($this->lng->txt("tst_eval_question_points"), $pass+1));
437  $this->tpl->parseCurrentBlock();
438  global $ilAccess;
439  if (($ilAccess->checkAccess("write", "", $_GET["ref_id"])))
440  {
441  $this->tpl->setCurrentBlock("question_footer");
442  $this->tpl->setVariable("TEXT_TO_DETAILED_RESULTS", $this->lng->txt("tst_show_answer_sheet"));
443  $this->ctrl->setParameter($this, "statistics", "1");
444  $this->ctrl->setParameter($this, "active_id", $active_id);
445  $this->ctrl->setParameter($this, "pass", $pass);
446  $this->tpl->setVariable("URL_TO_DETAILED_RESULTS", $this->ctrl->getLinkTarget($this, "outParticipantsPassDetails"));
447  $this->tpl->parseCurrentBlock();
448  }
449  $questions = $data->getParticipant($active_id)->getQuestions($pass);
450  if (!is_array($questions))
451  {
452  $questions = $data->getParticipant($active_id)->getQuestions(0);
453  }
454  $counter = 1;
455  foreach ($questions as $question)
456  {
457  $this->tpl->setCurrentBlock("question_row");
458  $this->tpl->setVariable("QUESTION_COUNTER", $counter);
459  $this->tpl->setVariable("QUESTION_TITLE", $data->getQuestionTitle($question["id"]));
460  $answeredquestion = $data->getParticipant($active_id)->getPass($pass)->getAnsweredQuestionByQuestionId($question["id"]);
461  if (is_array($answeredquestion))
462  {
463  $percent = $answeredquestion["points"] ? $answeredquestion["reached"] / $answeredquestion["points"] * 100.0 : 0;
464  $this->tpl->setVariable("QUESTION_POINTS", $answeredquestion["reached"] . " " . strtolower($this->lng->txt("of")) . " " . $answeredquestion["points"] . " (" . sprintf("%.2f", $percent) . " %)");
465  }
466  else
467  {
468  $this->tpl->setVariable("QUESTION_POINTS", "0 " . strtolower($this->lng->txt("of")) . " " . $question["points"] . " (" . sprintf("%.2f", 0) . " %) - " . $this->lng->txt("question_not_answered"));
469  }
470  $this->tpl->parseCurrentBlock();
471  $counter++;
472  }
473  $this->tpl->touchBlock("question_stats");
474  }
475  }
476  }
477 
484  {
485  $this->getQuestionResultForTestUsers($_GET["qid"], $this->object->getTestId());
486  }
487 
494  {
495  $question_object =& ilObjTest::_instanciateQuestion($_GET["qid"]);
496  $download = "";
497  if (method_exists($question_object, "getFileUploadZIPFile"))
498  {
499  $question_object->getFileUploadZIPFile($this->object->getTestId());
500  }
501  else
502  {
503  $this->ctrl->redirect($this, "singleResults");
504  }
505  }
506 
514  function eval_a()
515  {
516  global $ilAccess;
517 
518  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
519  {
520  // allow only evaluation access
521  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), true);
522  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
523  }
524 
525  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_eval_anonymous_aggregation.html", "Modules/Test");
526  $eval =& $this->object->getCompleteEvaluationData();
527  $data = array();
528  $foundParticipants =& $eval->getParticipants();
529  if (count($foundParticipants))
530  {
531  $template = new ilTemplate("tpl.il_as_tst_evaluation_export.html", TRUE, TRUE, "Modules/Test");
532  $template->setVariable("EXPORT_DATA", $this->lng->txt("exp_eval_data"));
533  $template->setVariable("TEXT_EXCEL", $this->lng->txt("exp_type_excel"));
534  $template->setVariable("TEXT_CSV", $this->lng->txt("exp_type_spss"));
535  $template->setVariable("CMD_EXPORT", "exportAggregatedResults");
536  $template->setVariable("BTN_EXPORT", $this->lng->txt("export"));
537  $template->setVariable("BTN_PRINT", $this->lng->txt("print"));
538  $template->setVariable("BTN_COMMAND", $this->ctrl->getCmd());
539  $template->setVariable("FORM_ACTION", $this->ctrl->getFormAction($this, "exportAggregatedResults"));
540  $exportoutput = $template->get();
541  $this->tpl->setVariable("EVALUATION_EXPORT", $exportoutput);
542 
543  array_push($data, array(
544  'result' => $this->lng->txt("tst_eval_total_persons"),
545  'value' => count($foundParticipants)
546  ));
547  $total_finished = $this->object->evalTotalFinished();
548  array_push($data, array(
549  'result' => $this->lng->txt("tst_eval_total_finished"),
550  'value' => $total_finished
551  ));
552  $average_time = $this->object->evalTotalStartedAverageTime();
553  $diff_seconds = $average_time;
554  $diff_hours = floor($diff_seconds/3600);
555  $diff_seconds -= $diff_hours * 3600;
556  $diff_minutes = floor($diff_seconds/60);
557  $diff_seconds -= $diff_minutes * 60;
558  array_push($data, array(
559  'result' => $this->lng->txt("tst_eval_total_finished_average_time"),
560  'value' => sprintf("%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds)
561  ));
562  $total_passed = 0;
563  $total_passed_reached = 0;
564  $total_passed_max = 0;
565  $total_passed_time = 0;
566  foreach ($foundParticipants as $userdata)
567  {
568  if ($userdata->getPassed())
569  {
570  $total_passed++;
571  $total_passed_reached += $userdata->getReached();
572  $total_passed_max += $userdata->getMaxpoints();
573  $total_passed_time += $userdata->getTimeOfWork();
574  }
575  }
576  $average_passed_reached = $total_passed ? $total_passed_reached / $total_passed : 0;
577  $average_passed_max = $total_passed ? $total_passed_max / $total_passed : 0;
578  $average_passed_time = $total_passed ? $total_passed_time / $total_passed : 0;
579  array_push($data, array(
580  'result' => $this->lng->txt("tst_eval_total_passed"),
581  'value' => $total_passed
582  ));
583  array_push($data, array(
584  'result' => $this->lng->txt("tst_eval_total_passed_average_points"),
585  'value' => sprintf("%2.2f", $average_passed_reached) . " " . strtolower($this->lng->txt("of")) . " " . sprintf("%2.2f", $average_passed_max)
586  ));
587  $average_time = $average_passed_time;
588  $diff_seconds = $average_time;
589  $diff_hours = floor($diff_seconds/3600);
590  $diff_seconds -= $diff_hours * 3600;
591  $diff_minutes = floor($diff_seconds/60);
592  $diff_seconds -= $diff_minutes * 60;
593  array_push($data, array(
594  'result' => $this->lng->txt("tst_eval_total_passed_average_time"),
595  'value' => sprintf("%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds)
596  ));
597  }
598 
599  include_once "./Modules/Test/classes/tables/class.ilTestAggregatedResultsTableGUI.php";
600  $table_gui = new ilTestAggregatedResultsTableGUI($this, 'eval_a');
601  $table_gui->setData($data);
602  $this->tpl->setVariable('AGGREGATED_RESULTS', $table_gui->getHTML());
603 
604  $rows = array();
605  foreach ($eval->getQuestionTitles() as $question_id => $question_title)
606  {
607  $answered = 0;
608  $reached = 0;
609  $max = 0;
610  foreach ($foundParticipants as $userdata)
611  {
612  for ($i = 0; $i <= $userdata->getLastPass(); $i++)
613  {
614  if (is_object($userdata->getPass($i)))
615  {
616  $question =& $userdata->getPass($i)->getAnsweredQuestionByQuestionId($question_id);
617  if (is_array($question))
618  {
619  $answered++;
620  $reached += $question["reached"];
621  $max += $question["points"];
622  }
623  }
624  }
625  }
626  $percent = $max ? $reached/$max * 100.0 : 0;
627  $counter++;
628  $this->ctrl->setParameter($this, "qid", $question_id);
629  array_push($rows,
630  array(
631  'title' => $question_title,
632  'points' => sprintf("%.2f", $answered ? $reached / $answered : 0) . " " . strtolower($this->lng->txt("of")) . " " . sprintf("%.2f", $answered ? $max / $answered : 0),
633  'percentage' => (float)$percent,
634  'answers' => $answered
635  )
636  );
637  }
638  include_once "./Modules/Test/classes/tables/class.ilTestAverageReachedPointsTableGUI.php";
639  $table_gui = new ilTestAverageReachedPointsTableGUI($this, 'eval_a');
640  $table_gui->setData($rows);
641  $this->tpl->setVariable('TBL_AVG_REACHED', $table_gui->getHTML());
642  }
643 
649  function exportEvaluation()
650  {
651  $filterby = "";
652  if (array_key_exists("g_filterby", $_GET))
653  {
654  $filterby = $_GET["g_filterby"];
655  }
656  $filtertext = "";
657  if (array_key_exists("g_userfilter", $_GET))
658  {
659  $filtertext = $_GET["g_userfilter"];
660  }
661  $passedonly = FALSE;
662  if (array_key_exists("g_passedonly", $_GET))
663  {
664  if ($_GET["g_passedonly"] == 1)
665  {
666  $passedonly = TRUE;
667  }
668  }
669  switch ($_POST["export_type"])
670  {
671  case "excel":
672  include_once "./Modules/Test/classes/class.ilTestExport.php";
673  $exportObj = new ilTestExport($this->object, "results");
674  $exportObj->exportToExcel($deliver = TRUE, $filterby, $filtertext, $passedonly);
675  break;
676  case "csv":
677  include_once "./Modules/Test/classes/class.ilTestExport.php";
678  $exportObj = new ilTestExport($this->object, "results");
679  $exportObj->exportToCSV($deliver = TRUE, $filterby, $filtertext, $passedonly);
680  break;
681  case "certificate":
682  if ($passedonly)
683  {
684  $this->ctrl->setParameterByClass("iltestcertificategui", "g_passedonly", "1");
685  }
686  if (strlen($filtertext))
687  {
688  $this->ctrl->setParameterByClass("iltestcertificategui", "g_userfilter", $filtertext);
689  }
690  $this->ctrl->redirect($this, "exportCertificate");
691  break;
692  }
693  }
694 
701  {
702  switch ($_POST["export_type"])
703  {
704  case "excel":
705  include_once "./Modules/Test/classes/class.ilTestExport.php";
706  $exportObj = new ilTestExport($this->object, "aggregated");
707  $exportObj->exportToExcel($deliver = TRUE);
708  break;
709  case "csv":
710  include_once "./Modules/Test/classes/class.ilTestExport.php";
711  $exportObj = new ilTestExport($this->object, "aggregated");
712  $exportObj->exportToCSV($deliver = TRUE);
713  break;
714  }
715  }
716 
723  public function exportCertificate()
724  {
725  global $ilUser;
726 
727  include_once "./Services/Utilities/classes/class.ilUtil.php";
728  include_once "./Services/Certificate/classes/class.ilCertificate.php";
729  include_once "./Modules/Test/classes/class.ilTestCertificateAdapter.php";
730  $certificate = new ilCertificate(new ilTestCertificateAdapter($this->object));
731  $archive_dir = $certificate->createArchiveDirectory();
732  $total_users = array();
733  $total_users =& $this->object->evalTotalPersonsArray();
734  if (count($total_users))
735  {
736  foreach ($total_users as $active_id => $name)
737  {
738  $user_id = $this->object->_getUserIdFromActiveId($active_id);
739  $pdf = $certificate->outCertificate(
740  array(
741  "active_id" => $active_id,
742  "userfilter" => $userfilter,
743  "passedonly" => $passedonly
744  ),
745  FALSE
746  );
747  if (strlen($pdf))
748  {
749  $certificate->addPDFtoArchiveDirectory($pdf, $archive_dir, $user_id . "_" . str_replace(" ", "_", ilUtil::getASCIIFilename($name)) . ".pdf");
750  }
751  }
752  $zipArchive = $certificate->zipCertificatesInArchiveDirectory($archive_dir, TRUE);
753  }
754 
755  }
756 
763  function getEvaluationQuestionId($question_id, $original_id = "")
764  {
765  if ($original_id > 0)
766  {
767  return $original_id;
768  }
769  else
770  {
771  return $question_id;
772  }
773  }
774 
775  function saveEvalSettings()
776  {
777  $results = $_POST;
778  $additionalFields = array();
779  foreach ($results as $key => $value)
780  {
781  if (preg_match("/cb_(\w+)/", $key, $matches) && ($value == 1))
782  {
783  array_push($additionalFields, $matches[1]);
784  }
785  }
786  $this->object->setEvaluationAdditionalFields($additionalFields);
787  ilUtil::sendSuccess($this->lng->txt("msg_obj_modified"), TRUE);
788  $this->ctrl->redirect($this, "evalSettings");
789  }
790 
791  function evalSettings()
792  {
793  global $ilAccess;
794 
795  if ((!$ilAccess->checkAccess("tst_statistics", "", $this->ref_id)) && (!$ilAccess->checkAccess("write", "", $this->ref_id)))
796  {
797  // allow only evaluation access
798  ilUtil::sendInfo($this->lng->txt("cannot_edit_test"), true);
799  $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
800  }
801 
802  include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
803  $form = new ilPropertyFormGUI();
804  $form->setFormAction($this->ctrl->getFormAction($this, "saveEvalSettings"));
805  $form->setTitle($this->lng->txt("assessment_eval_settings"));
806 
807  // Additional User fields
808  $fields = array("gender", "email", "institution", "street", "city", "zipcode", "country", "department", "matriculation");
809  $additionalFields = $this->object->getEvaluationAdditionalFields();
810 
811  foreach ($fields as $dbfield)
812  {
813  $checkbox = new ilCheckboxInputGUI($this->lng->txt($dbfield), "cb_" . $dbfield);
814  if ($this->object->getAnonymity())
815  {
816  $checkbox->setDisabled(TRUE);
817  }
818  else
819  {
820  if (in_array($dbfield, $additionalFields)) $checkbox->setChecked(TRUE);
821  }
822  $form->addItem($checkbox);
823  }
824  $form->addCommandButton("saveEvalSettings", $this->lng->txt("save"));
825 
826  $this->tpl->setVariable("ADM_CONTENT", $form->getHTML());
827  }
828 
837  {
838  global $ilias;
839 
840  $this->ctrl->saveParameter($this, "pass");
841  $this->ctrl->saveParameter($this, "active_id");
842  $active_id = $_GET["active_id"];
843  $pass = $_GET["pass"];
844  $result_array =& $this->object->getTestResult($active_id, $pass);
845 
846  $overview = $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outParticipantsPassDetails");
847  $user_data = $this->getResultsUserdata($active_id, FALSE);
848  $user_id = $this->object->_getUserIdFromActiveId($active_id);
849 
850  $template = new ilTemplate("tpl.il_as_tst_pass_details_overview_participants.html", TRUE, TRUE, "Modules/Test");
851 
852  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
853  if(ilRPCServerSettings::getInstance()->isEnabled())
854  {
855  $this->ctrl->setParameter($this, "pdf", "1");
856  $template->setCurrentBlock("pdf_export");
857  $template->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outParticipantsPassDetails"));
858  $this->ctrl->setParameter($this, "pdf", "");
859  $template->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
860  $template->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
861  $template->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
862  $template->parseCurrentBlock();
863  }
864 
865  if (array_key_exists("statistics", $_GET) && ($_GET["statistics"] == 1))
866  {
867  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
868  $this->ctrl->setParameterByClass("ilTestEvaluationGUI", "active_id", $active_id);
869  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilTestEvaluationGUI", "detailedEvaluation"));
870  }
871  else
872  {
873  if ($this->object->getNrOfTries() == 1)
874  {
875  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
876  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "participants"));
877  }
878  else
879  {
880  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass(get_class($this), "outParticipantsResultsOverview"));
881  $template->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_overview"));
882  }
883  }
884  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
885  $template->setVariable("PRINT_URL", "javascript:window.print();");
886 
887  if ($this->object->getNrOfTries() == 1)
888  {
889  $statement = $this->getFinalStatement($active_id);
890  $template->setVariable("USER_MARK", $statement["mark"]);
891  if (strlen($statement["markects"]))
892  {
893  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
894  }
895  }
896 
897  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, TRUE);
898  $template->setVariable("LIST_OF_ANSWERS", $list_of_answers);
899  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
900  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
901  $template->setVariable("PASS_DETAILS", $overview);
902  $template->setVariable("USER_DETAILS", $user_data);
903  $uname = $this->object->userLookupFullName($user_id);
904  $template->setVariable("USER_NAME", sprintf($this->lng->txt("tst_result_user_name_pass"), $pass + 1, $uname));
905 
906  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
907  if ($this->object->getShowSolutionAnswersOnly())
908  {
909  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
910  }
911 
912  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
913  {
914  $this->object->deliverPDFfromHTML($template->get());
915  }
916  else
917  {
918  $this->tpl->setVariable("ADM_CONTENT", $template->get());
919  }
920  }
921 
930  {
931  global $ilias;
932 
933  $template = new ilTemplate("tpl.il_as_tst_pass_overview_participants.html", TRUE, TRUE, "Modules/Test");
934 
935  $active_id = $_GET["active_id"];
936  if ($this->object->getNrOfTries() == 1)
937  {
938  $this->ctrl->setParameter($this, "active_id", $active_id);
939  $this->ctrl->setParameter($this, "pass", ilObjTest::_getResultPass($active_id));
940  $this->ctrl->redirect($this, "outParticipantsPassDetails");
941  }
942 
943  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
944  if(ilRPCServerSettings::getInstance()->isEnabled())
945  {
946  $this->ctrl->setParameter($this, "pdf", "1");
947  $template->setCurrentBlock("pdf_export");
948  $template->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outParticipantsResultsOverview"));
949  $this->ctrl->setParameter($this, "pdf", "");
950  $template->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
951  $template->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
952  $template->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
953  $template->parseCurrentBlock();
954  }
955 
956  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outParticipantsPassDetails");
957  $template->setVariable("PASS_OVERVIEW", $overview);
958  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
959  $template->setVariable("BACK_TEXT", $this->lng->txt("back"));
960  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "participants"));
961  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
962  $template->setVariable("PRINT_URL", "javascript:window.print();");
963 
964  $statement = $this->getFinalStatement($active_id);
965  $user_id = $this->object->_getUserIdFromActiveId($active_id);
966  $user_data = $this->getResultsUserdata($active_id);
967  $template->setVariable("USER_DATA", $user_data);
968  $template->setVariable("TEXT_OVERVIEW", $this->lng->txt("tst_results_overview"));
969  $template->setVariable("USER_MARK", $statement["mark"]);
970  if (strlen($statement["markects"]))
971  {
972  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
973  }
974  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
975  $template->parseCurrentBlock();
976 
977  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
978  if ($this->object->getShowSolutionAnswersOnly())
979  {
980  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
981  }
982 
983  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
984  {
985  $this->object->deliverPDFfromHTML($template->get(), $this->object->getTitle());
986  }
987  else
988  {
989  $this->tpl->setVariable("ADM_CONTENT", $template->get());
990  }
991  }
992 
1001  {
1002  $this->ctrl->saveParameter($this, "pass");
1003  $this->ctrl->saveParameter($this, "active_id");
1004  $active_id = $_GET["active_id"];
1005  $pass = $_GET["pass"];
1006  $result_array =& $this->object->getTestResult($active_id, $pass);
1007 
1008  $command_solution_details = "";
1009  if ($this->object->getShowSolutionDetails())
1010  {
1011  $command_solution_details = "outCorrectSolution";
1012  }
1013  $overview = $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outUserPassDetails", $command_solution_details);
1014 
1015  $user_id = $this->object->_getUserIdFromActiveId($active_id);
1016 
1017  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_tst_pass_details_overview_participants.html", "Modules/Test");
1018 
1019  if ($this->object->getNrOfTries() == 1)
1020  {
1021  $this->tpl->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
1022  $this->tpl->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
1023  }
1024  else
1025  {
1026  $this->tpl->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass(get_class($this), "outUserResultsOverview"));
1027  $this->tpl->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_overview"));
1028  }
1029 
1030  $this->tpl->parseCurrentBlock();
1031 
1032  if ($this->object->getNrOfTries() == 1)
1033  {
1034  $statement = $this->getFinalStatement($active_id);
1035  $this->tpl->setVariable("USER_MARK", $statement["mark"]);
1036  if (strlen($statement["markects"]))
1037  {
1038  $this->tpl->setVariable("USER_MARK_ECTS", $statement["markects"]);
1039  }
1040  }
1041 
1042  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass);
1043 
1044  $this->tpl->setCurrentBlock("adm_content");
1045  $this->tpl->setVariable("LIST_OF_ANSWERS", $list_of_answers);
1046  $this->tpl->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results"));
1047  $this->tpl->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
1048  $this->tpl->setVariable("PASS_DETAILS", $overview);
1049  $uname = $this->object->userLookupFullName($user_id, TRUE);
1050  $this->tpl->setVariable("USER_NAME", sprintf($this->lng->txt("tst_result_user_name_pass"), $pass + 1, $uname));
1051  $this->tpl->parseCurrentBlock();
1052 
1053  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1054  if ($this->object->getShowSolutionAnswersOnly())
1055  {
1056  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1057  }
1058  }
1059 
1068  {
1069  global $ilUser, $ilias, $ilLog;
1070 
1071  if (!$this->object->canShowTestResults($ilUser->getId())) $this->ctrl->redirectByClass("ilobjtestgui", "infoScreen");
1072  include_once("./classes/class.ilTemplate.php");
1073  $templatehead = new ilTemplate("tpl.il_as_tst_results_participants.html", TRUE, TRUE, "Modules/Test");
1074  $template = new ilTemplate("tpl.il_as_tst_results_participant.html", TRUE, TRUE, "Modules/Test");
1075 
1076  $pass = null;
1077  $user_id = $ilUser->getId();
1078  $uname = $this->object->userLookupFullName($user_id, TRUE);
1079  $active_id = $this->object->getTestSession()->getActiveId();
1080  $hide_details = !$this->object->getShowPassDetails();
1081  if ($hide_details)
1082  {
1083  $executable = $this->object->isExecutable($ilUser->getId());
1084  if (!$executable["executable"]) $hide_details = FALSE;
1085  }
1086  $begin = microtime(true);
1087  if (($this->object->getNrOfTries() == 1) && (!$hide_details))
1088  {
1089  $pass = 0;
1090  }
1091  else
1092  {
1093  $template->setCurrentBlock("pass_overview");
1094  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outUserResultsOverview", FALSE, $hide_details);
1095  $template->setVariable("PASS_OVERVIEW", $overview);
1096  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_results_overview"));
1097  $template->parseCurrentBlock();
1098  }
1099 
1100  if (((array_key_exists("pass", $_GET)) && (strlen($_GET["pass"]) > 0)) || (!is_null($pass)))
1101  {
1102  if (is_null($pass)) $pass = $_GET["pass"];
1103  }
1104 
1105  include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
1106  if(ilRPCServerSettings::getInstance()->isEnabled())
1107  {
1108  $this->ctrl->setParameter($this, "pass", $pass);
1109  $this->ctrl->setParameter($this, "pdf", "1");
1110  $templatehead->setCurrentBlock("pdf_export");
1111  $templatehead->setVariable("PDF_URL", $this->ctrl->getLinkTarget($this, "outUserResultsOverview"));
1112  $this->ctrl->setParameter($this, "pass", "");
1113  $this->ctrl->setParameter($this, "pdf", "");
1114  $templatehead->setVariable("PDF_TEXT", $this->lng->txt("pdf_export"));
1115  $templatehead->setVariable("PDF_IMG_ALT", $this->lng->txt("pdf_export"));
1116  $templatehead->setVariable("PDF_IMG_URL", ilUtil::getHtmlPath(ilUtil::getImagePath("application-pdf.png")));
1117  $templatehead->parseCurrentBlock();
1118  if ($this->object->canShowCertificate($user_id, $active_id))
1119  {
1120  $templatehead->setVariable("CERTIFICATE_URL", $this->ctrl->getLinkTarget($this, "outCertificate"));
1121  $templatehead->setVariable("CERTIFICATE_TEXT", $this->lng->txt("certificate"));
1122  }
1123  }
1124  $templatehead->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
1125  $templatehead->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
1126  $templatehead->setVariable("PRINT_TEXT", $this->lng->txt("print"));
1127  $templatehead->setVariable("PRINT_URL", "javascript:window.print();");
1128 
1129  $statement = $this->getFinalStatement($active_id);
1130  $user_data = $this->getResultsUserdata($active_id, TRUE);
1131 
1132  // output of the details of a selected pass
1133  $this->ctrl->saveParameter($this, "pass");
1134  $this->ctrl->saveParameter($this, "active_id");
1135  if (!is_null($pass))
1136  {
1137  $result_array =& $this->object->getTestResult($active_id, $pass);
1138  $command_solution_details = "";
1139  if ($this->object->getShowSolutionDetails())
1140  {
1141  $command_solution_details = "outCorrectSolution";
1142  }
1143  $detailsoverview = (!$hide_details) ? $this->getPassDetailsOverview($result_array, $active_id, $pass, "iltestevaluationgui", "outUserResultsOverview", $command_solution_details) : '';
1144 
1145  $user_id = $this->object->_getUserIdFromActiveId($active_id);
1146 
1147  if (!$hide_details && $this->object->canShowSolutionPrintview())
1148  {
1149  $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass);
1150  }
1151  else if ($this->object->getShowSolutionDetails())
1152  {
1153  // if this is not commented out, all questions with checkmarks/crosses will be shown
1154  // $list_of_answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, true);
1155  }
1156 
1157  $template->setVariable("LIST_OF_ANSWERS", $list_of_answers);
1158  $template->setVariable("PASS_RESULTS_OVERVIEW", sprintf($this->lng->txt("tst_results_overview_pass"), $pass + 1));
1159  $template->setVariable("PASS_DETAILS", $detailsoverview);
1160 
1161  $signature = $this->getResultsSignature();
1162  $template->setVariable("SIGNATURE", $signature);
1163  }
1164  $template->setVariable("TEXT_HEADING", sprintf($this->lng->txt("tst_result_user_name"), $uname));
1165  $template->setVariable("USER_DATA", $user_data);
1166  $template->setVariable("USER_MARK", $statement["mark"]);
1167  if (strlen($statement["markects"]))
1168  {
1169  $template->setVariable("USER_MARK_ECTS", $statement["markects"]);
1170  }
1171  $template->parseCurrentBlock();
1172 
1173  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1174  if ($this->object->getShowSolutionAnswersOnly())
1175  {
1176  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1177  }
1178  $templatehead->setVariable("RESULTS_PARTICIPANT", $template->get());
1179 
1180  if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1))
1181  {
1182  $this->object->deliverPDFfromHTML($template->get(), sprintf($this->lng->txt("tst_result_user_name"), $uname));
1183  }
1184  else
1185  {
1186  $this->tpl->setVariable("PRINT_CONTENT", $templatehead->get());
1187  }
1188  }
1189 
1198  {
1199  global $ilUser;
1200 
1201  $template = new ilTemplate("tpl.il_as_tst_info_list_of_answers.html", TRUE, TRUE, "Modules/Test");
1202 
1203  $pass = null;
1204  if (array_key_exists("pass", $_GET))
1205  {
1206  if (strlen($_GET["pass"])) $pass = $_GET["pass"];
1207  }
1208  $user_id = $ilUser->getId();
1209  $active_id = $this->object->getTestSession()->getActiveId();
1210  $overview = "";
1211  if ($this->object->getNrOfTries() == 1)
1212  {
1213  $pass = 0;
1214  }
1215  else
1216  {
1217  $overview = $this->getPassOverview($active_id, "iltestevaluationgui", "outUserListOfAnswerPasses", TRUE);
1218  $template->setVariable("TEXT_RESULTS", $this->lng->txt("tst_passes"));
1219  $template->setVariable("PASS_OVERVIEW", $overview);
1220  }
1221 
1222  $signature = "";
1223  if (strlen($pass))
1224  {
1225  $signature = $this->getResultsSignature();
1226  $result_array =& $this->object->getTestResult($active_id, $pass);
1227  $user_id =& $this->object->_getUserIdFromActiveId($active_id);
1228  $showAllAnswers = TRUE;
1229  if ($this->object->isExecutable($user_id))
1230  {
1231  $showAllAnswers = FALSE;
1232  }
1233  $answers = $this->getPassListOfAnswers($result_array, $active_id, $pass, FALSE, $showAllAnswers);
1234  $template->setVariable("PASS_DETAILS", $answers);
1235  }
1236  $template->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
1237  $template->setVariable("BACK_TEXT", $this->lng->txt("tst_results_back_introduction"));
1238  $template->setVariable("BACK_URL", $this->ctrl->getLinkTargetByClass("ilobjtestgui", "infoScreen"));
1239  $template->setVariable("PRINT_TEXT", $this->lng->txt("print"));
1240  $template->setVariable("PRINT_URL", "javascript:window.print();");
1241 
1242  $user_data = $this->getResultsUserdata($active_id, TRUE);
1243  $template->setVariable("USER_DATA", $user_data);
1244  $template->setVariable("TEXT_LIST_OF_ANSWERS", $this->lng->txt("tst_list_of_answers"));
1245  if (strlen($signature))
1246  {
1247  $template->setVariable("SIGNATURE", $signature);
1248  }
1249  $this->tpl->setVariable("ADM_CONTENT", $template->get());
1250 
1251  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print.css", "Modules/Test"), "print");
1252  if ($this->object->getShowSolutionAnswersOnly())
1253  {
1254  $this->tpl->addCss(ilUtil::getStyleSheetLocation("output", "test_print_hide_content.css", "Modules/Test"), "print");
1255  }
1256  }
1257 
1265  function passDetails()
1266  {
1267  if (array_key_exists("pass", $_GET) && (strlen($_GET["pass"]) > 0))
1268  {
1269  $this->ctrl->saveParameter($this, "pass");
1270  $this->ctrl->saveParameter($this, "active_id");
1271  $this->outTestResults(false, $_GET["pass"]);
1272  }
1273  else
1274  {
1275  $this->outTestResults(false);
1276  }
1277  }
1278 
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($_GET["evaluation"], $_GET["active_id"], $_GET["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 ?>