4 require_once
'Services/Object/classes/class.ilObject.php';
5 require_once
'Modules/Test/classes/inc.AssessmentConstants.php';
6 require_once
'Modules/Test/interfaces/interface.ilMarkSchemaAware.php';
7 require_once
'Modules/Test/interfaces/interface.ilEctsGradesEnabled.php';
591 public function __construct($a_id = 0,$a_call_by_reference =
true)
596 $lng->loadLanguageModule(
"assessment");
598 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
600 $this->mark_schema->createSimpleSchema(
601 $lng->txt(
"failed_short"),
602 $lng->txt(
"failed_official"),
605 $lng->txt(
"passed_short"),
606 $lng->txt(
"passed_official"),
612 $this->author = $ilUser->fullname;
613 $this->introductionEnabled =
false;
614 $this->introduction =
"";
615 $this->questions = array();
618 $this->instant_verification = 0;
619 $this->answer_feedback_points = 0;
620 $this->reporting_date =
"";
621 $this->nr_of_tries = 0;
623 $this->use_previous_answers = 1;
624 $this->title_output = 0;
625 $this->starting_time =
"";
626 $this->ending_time =
"";
627 $this->processing_time =
"";
628 $this->enable_processing_time =
"0";
629 $this->reset_processing_time = 0;
630 $this->ects_output = FALSE;
631 $this->ects_fx = NULL;
632 $this->shuffle_questions = FALSE;
633 $this->mailnottype = 0;
634 $this->exportsettings = 0;
635 $this->show_summary = 8;
640 $this->answer_feedback = 0;
641 $this->password =
"";
642 $this->certificate_visibility = 0;
643 $this->allowedUsers =
"";
644 $this->_showfinalstatement = FALSE;
645 $this->_finalstatement =
"";
646 $this->_showinfo = TRUE;
647 $this->_forcejs = TRUE;
648 $this->_customStyle =
"";
649 $this->allowedUsersTimeGap =
"";
650 $this->anonymity = 0;
651 $this->show_cancel = 0;
652 $this->show_marker = 0;
653 $this->fixed_participants = 0;
658 $this->testSession = FALSE;
659 $this->testSequence = FALSE;
660 $this->mailnotification = 0;
661 $this->poolUsage = 1;
663 $this->ects_grades = array(
671 $this->autosave = FALSE;
672 $this->autosave_ival = 30000;
674 $this->enable_examview =
false;
675 $this->show_examview_html =
false;
676 $this->show_examview_pdf =
false;
677 $this->enable_archiving =
false;
679 $this->express_mode =
false;
680 $this->template_id =
'';
681 $this->redirection_mode = 0;
682 $this->redirection_url = NULL;
683 $this->show_exam_id_in_test_pass_enabled =
false;
684 $this->show_exam_id_in_test_results_enabled =
false;
685 $this->sign_submission =
false;
686 $this->char_selector_availability = 0;
687 $this->char_selector_definition = null;
689 $this->showGradingStatusEnabled =
true;
690 $this->showGradingMarkEnabled =
true;
692 $this->instantFeedbackAnswerFixationEnabled =
false;
694 $this->testFinalBroken =
false;
696 $this->tmpCopyWizardCopyId = null;
698 $this->
ilObject($a_id, $a_call_by_reference);
740 if (!parent::update())
755 function read($a_force_db =
false)
757 parent::read($a_force_db);
771 if (!parent::delete())
792 global $tree,
$ilDB, $ilPluginAdmin,
$lng;
794 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
796 $participantData->load($this->
getTestId());
799 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_mark WHERE test_fi = %s",
804 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_tests WHERE test_id = %s",
809 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
811 $testQuestionSetConfigFactory->getQuestionSetConfig()->removeQuestionSetRelatedData();
814 include_once
"./Services/Utilities/classes/class.ilUtil.php";
816 $directory = $tst_data_dir.
"/tst_".$this->
getId();
817 if (is_dir($directory))
819 include_once
"./Services/Utilities/classes/class.ilUtil.php";
822 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
828 foreach(
$mobs as $mob)
853 function notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params = 0)
893 if ($a_node_id==
$_GET[
"ref_id"])
895 $parent_obj =& $this->
ilias->obj_factory->getInstanceByRefId($a_node_id);
896 $parent_type = $parent_obj->getType();
897 if ($parent_type == $this->
getType())
899 $a_node_id = (int) $tree->getParentId($a_node_id);
903 parent::notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params);
913 include_once
"./Services/Utilities/classes/class.ilUtil.php";
916 if (!is_writable($tst_data_dir))
918 $this->
ilias->raiseError(
"Test Data Directory (".$tst_data_dir
919 .
") not writeable.",$this->
ilias->error_obj->MESSAGE);
923 $tst_dir = $tst_data_dir.
"/tst_".$this->
getId();
925 if (!@is_dir($tst_dir))
927 $this->
ilias->raiseError(
"Creation of Test Directory failed.",$this->
ilias->error_obj->MESSAGE);
930 $export_dir = $tst_dir.
"/export";
932 if (!@is_dir($export_dir))
934 $this->
ilias->raiseError(
"Creation of Export Directory failed.",$this->
ilias->error_obj->MESSAGE);
945 include_once
"./Services/Utilities/classes/class.ilUtil.php";
956 function getExportFiles($dir)
959 if(!@is_dir($dir) || !is_writeable($dir))
975 $files[] = $file->getBasename();
988 if (strlen($a_import_dir))
990 $_SESSION[
"tst_import_dir"] = $a_import_dir;
1006 if (strlen(
$_SESSION[
"tst_import_dir"]))
1026 include_once
"./Services/Utilities/classes/class.ilUtil.php";
1030 if (!is_writable($tst_data_dir))
1032 $this->
ilias->raiseError(
"Test Data Directory (".$tst_data_dir
1033 .
") not writeable.",$this->
ilias->error_obj->FATAL);
1037 $tst_dir = $tst_data_dir.
"/tst_import";
1039 if (!@is_dir($tst_dir))
1041 $ilias->raiseError(
"Creation of test import directory failed.",$ilias->error_obj->FATAL);
1056 $result = $ilDB->queryF(
"SELECT DISTINCT(qpl_qst_type.type_tag) foundtypes FROM qpl_questions, tst_test_result, qpl_qst_type, tst_active WHERE tst_test_result.question_fi = qpl_questions.question_id AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND tst_test_result.active_fi = tst_active.active_id AND tst_active.test_fi = %s",
1063 if (strcmp(
$row[
'foundtypes'],
'assSingleChoice') == 0)
1081 $result = $ilDB->queryF(
"SELECT DISTINCT(qpl_qst_type.type_tag) foundtypes FROM qpl_questions, tst_test_result, qpl_qst_type, tst_active WHERE tst_test_result.question_fi = qpl_questions.question_id AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND tst_test_result.active_fi = tst_active.active_id AND tst_active.test_fi = %s",
1088 if (strcmp(
$row[
'foundtypes'],
'assSingleChoice') == 0)
1113 SELECT DISTINCT(qpl_qst_sc.shuffle) foundshuffles 1119 WHERE tst_test_result.question_fi = qpl_questions.question_id 1120 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id 1121 AND tst_test_result.active_fi = tst_active.active_id 1122 AND qpl_questions.question_id = qpl_qst_sc.question_fi 1123 AND tst_active.test_fi = %s 1124 AND qpl_qst_type.type_tag = %s 1126 array(
'integer',
'text'),
1127 array($this->
getTestId(),
'assSingleChoice')
1132 return (
$row[
'foundshuffles'] == 0);
1145 if( !count($this->mark_schema->mark_steps) )
1166 global $tree,
$ilDB, $ilPluginAdmin;
1169 $test->loadFromDb();
1171 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1174 return $test->isComplete( $testQuestionSetConfigFactory->getQuestionSetConfig() );
1190 if(!preg_match(
'/\d+/', $this->
getECTSFX()))
1198 SET ects_output = %s, ects_a = %s, ects_b = %s, ects_c = %s, ects_d = %s, ects_e = %s, ects_fx = %s 1199 WHERE test_id = %s",
1200 array(
'text',
'float',
'float',
'float',
'float',
'float',
'float',
'integer'),
1203 $grades[
'A'], $grades[
'B'], $grades[
'C'], $grades[
'D'], $grades[
'E'],
1220 if($this->
isComplete($testQuestionSetConfig))
1227 "UPDATE tst_tests SET complete = %s WHERE test_id = %s",
1228 array(
'text',
'integer'),
1229 array($complete, $this->test_id)
1254 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1255 $completecontent =
"";
1258 $completecontent .= $content;
1271 global $tree,
$ilDB, $ilPluginAdmin;
1278 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1280 $testQuestionSetConfig = $testQuestionSetConfigFactory->getQuestionSetConfig();
1282 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1283 if ($this->test_id == -1)
1286 $next_id = $ilDB->nextId(
'tst_tests');
1288 $ilDB->insert(
'tst_tests', array(
1289 'test_id' => array(
'integer', $next_id),
1290 'obj_fi' => array(
'integer', $this->
getId()),
1291 'author' => array(
'text', $this->
getAuthor()),
1295 'showinfo' => array(
'integer', $this->
getShowInfo()),
1296 'forcejs' => array(
'integer', $this->
getForceJS()),
1308 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1309 'kiosk' => array(
'integer', $this->
getKiosk()),
1320 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1322 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : NULL),
1323 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : NULL),
1324 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : NULL),
1325 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : NULL),
1326 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : NULL),
1327 'ects_fx' => array(
'float', $this->
getECTSFX()),
1336 'password' => array(
'text', $this->
getPassword()),
1344 'created' => array(
'integer', time()),
1345 'tstamp' => array(
'integer', time()),
1347 'template_id' => array(
'integer', $this->
getTemplate()),
1348 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1362 'online_status' => array(
'integer', (
int)$this->
isOnline()),
1364 'autosave' => array(
'integer', (
int)$this->
getAutosave()),
1388 $this->test_id = $next_id;
1401 $result = $ilDB->queryF(
"SELECT * FROM tst_tests WHERE test_id = %s",
1403 array($this->test_id)
1407 $oldrow = $ilDB->fetchAssoc(
$result);
1411 $ilDB->update(
'tst_tests',
1413 'author' => array(
'text', $this->
getAuthor()),
1417 'showinfo' => array(
'integer', $this->
getShowInfo()),
1418 'forcejs' => array(
'integer', $this->
getForceJS()),
1430 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1431 'kiosk' => array(
'integer', $this->
getKiosk()),
1442 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1444 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : NULL),
1445 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : NULL),
1446 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : NULL),
1447 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : NULL),
1448 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : NULL),
1449 'ects_fx' => array(
'float', $this->
getECTSFX()),
1458 'password' => array(
'text', $this->
getPassword()),
1466 'tstamp' => array(
'integer', time()),
1468 'template_id' => array(
'integer', $this->
getTemplate()),
1469 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1483 'online_status' => array(
'integer', (
int)$this->
isOnline()),
1485 'autosave' => array(
'integer', (
int)$this->
getAutosave()),
1509 'test_id' => array(
'integer', (
int)$this->
getTestId())
1513 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1516 $logresult = $ilDB->queryF(
"SELECT * FROM tst_tests WHERE test_id = %s",
1521 if ($logresult->numRows() == 1)
1523 $newrow = $ilDB->fetchAssoc($logresult);
1525 $changed_fields = array();
1526 foreach ($oldrow as $key => $value)
1528 if (strcmp($oldrow[$key], $newrow[$key]) != 0)
1530 array_push($changed_fields,
"$key: " . $oldrow[$key] .
" => " . $newrow[$key]);
1533 $changes = join($changed_fields,
", ");
1534 if (count($changed_fields) > 0)
1545 $aresult = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE test_fi = %s AND tries >= %s AND submitted = %s",
1546 array(
'integer',
'integer',
'integer'),
1549 while (
$row = $ilDB->fetchAssoc($aresult))
1551 $ilDB->manipulateF(
"UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1552 array(
'integer',
'timestamp',
'integer'),
1553 array(1, date(
'Y-m-d H:i:s'),
$row[
"active_id"])
1558 $aresult = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE test_fi = %s AND tries < %s AND submitted = %s",
1559 array(
'integer',
'integer',
'integer'),
1562 while (
$row = $ilDB->fetchAssoc($aresult))
1564 $ilDB->manipulateF(
"UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1565 array(
'integer',
'timestamp',
'integer'),
1566 array(0, NULL,
$row[
"active_id"])
1573 $aresult = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE test_fi = %s AND submitted = %s",
1574 array(
'integer',
'integer'),
1577 while (
$row = $ilDB->fetchAssoc($aresult))
1579 $ilDB->manipulateF(
"UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1580 array(
'integer',
'timestamp',
'integer'),
1581 array(0, NULL,
$row[
"active_id"])
1591 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
1607 $item->update($this->ref_id);
1610 if (!$properties_only)
1615 $ilias->raiseError(
$result->getMessage());
1623 $this->mark_schema->saveToDb($this->test_id);
1638 $oldquestions = array();
1639 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
1642 $result = $ilDB->queryF(
"SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1650 array_push($oldquestions,
$row[
"question_fi"]);
1656 $currentQuestionsObligationsQuery =
'SELECT question_fi, obligatory FROM tst_test_question WHERE test_fi = %s';
1657 $rset = $ilDB->queryF($currentQuestionsObligationsQuery, array(
'integer'), array($this->
getTestId()));
1658 while (
$row = $ilDB->fetchAssoc($rset)) {
1659 $obligatoryQuestionState[
$row[
'question_fi']] = $row[
'obligatory'];
1662 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_test_question WHERE test_fi = %s",
1667 foreach ($this->questions as $key => $value)
1670 if( !isset($obligatoryQuestionState[$value]) || is_null($obligatoryQuestionState[$value]) )
1672 $obligatoryQuestionState[$value] = 0;
1676 $next_id = $ilDB->nextId(
'tst_test_question');
1677 $ilDB->insert(
'tst_test_question', array(
1678 'test_question_id' => array(
'integer', $next_id),
1679 'test_fi' => array(
'integer', $this->
getTestId()),
1680 'question_fi' => array(
'integer', $value),
1681 'sequence' => array(
'integer', $key),
1682 'obligatory' => array(
'integer', $obligatoryQuestionState[$value]),
1683 'tstamp' => array(
'integer', time())
1686 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1689 $result = $ilDB->queryF(
"SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1693 $newquestions = array();
1698 array_push($newquestions,
$row[
"question_fi"]);
1701 foreach ($oldquestions as $index => $question_id)
1703 if (strcmp($newquestions[$index], $question_id) != 0)
1705 $pos = array_search($question_id, $newquestions);
1716 foreach ($newquestions as $index => $question_id)
1718 if (array_search($question_id, $oldquestions) === FALSE)
1734 $result = $ilDB->queryF(
'SELECT copy_id FROM tst_rnd_cpy WHERE tst_fi = %s',
1738 return $result->numRows() > 0;
1762 $result = $ilDB->queryF(
"SELECT qpl_questions.original_id FROM qpl_questions, tst_test_question WHERE qpl_questions.question_id = tst_test_question.question_fi AND qpl_questions.tstamp > 0 AND tst_test_question.test_fi = %s",
1766 $original_ids = array();
1767 $paramtypes = array();
1768 $paramvalues = array();
1771 array_push($original_ids,
$row[
'original_id']);
1776 if (($questionpool == 0) && (!is_array($qpls)))
1778 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
1780 if (count($available_pools))
1782 $available =
" AND " . $ilDB->in(
'obj_fi', $available_pools,
false,
'integer');
1790 $constraint_qpls =
"";
1791 $result_array = array();
1792 if ($questionpool == 0)
1794 if (is_array($qpls))
1796 if (count($qpls) > 0)
1798 $constraint_qpls =
" AND " . $ilDB->in(
'obj_fi', $qpls,
false,
'integer');
1803 $original_clause =
"";
1804 if (count($original_ids))
1806 $original_clause =
" AND " . $ilDB->in(
'question_id', $original_ids,
true,
'integer');
1809 if ($questionpool == 0)
1811 $result = $ilDB->queryF(
"SELECT question_id FROM qpl_questions WHERE original_id IS NULL $available $constraint_qpls AND owner > %s AND complete = %s $original_clause",
1812 array(
'integer',
'text'),
1818 $result = $ilDB->queryF(
"SELECT question_id FROM qpl_questions WHERE original_id IS NULL AND obj_fi = %s AND owner > %s AND complete = %s $original_clause",
1819 array(
'integer',
'integer',
'text'),
1820 array($questionpool, 0,
"1")
1823 $found_ids = array();
1826 array_push($found_ids,
$row[
'question_id']);
1828 $nr_of_questions = ($nr_of_questions > count($found_ids)) ? count($found_ids) : $nr_of_questions;
1829 if ($nr_of_questions == 0)
return array();
1830 $rand_keys = array_rand($found_ids, $nr_of_questions);
1832 if (is_array($rand_keys))
1834 foreach ($rand_keys as $key)
1836 $result[$found_ids[$key]] = $found_ids[$key];
1841 $result[$found_ids[$rand_keys]] = $found_ids[$rand_keys];
1857 $result = $ilDB->queryF(
"SELECT test_result_id FROM tst_test_result WHERE active_fi = %s AND pass = %s",
1858 array(
'integer',
'integer'),
1859 array($active_id,
$pass)
1877 $result = $ilDB->queryF(
"SELECT test_random_question_id FROM tst_test_rnd_qst WHERE active_fi = %s AND pass = %s",
1878 array(
'integer',
'integer'),
1879 array($active_id,
$pass)
1881 return (
$result->numRows() > 0) ?
true :
false;
1891 $result = $ilDB->queryF(
"SELECT * FROM tst_tests WHERE obj_fi = %s",
1893 array($this->
getId())
1904 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1941 "A" =>
$data->ects_a,
1942 "B" =>
$data->ects_b,
1943 "C" =>
$data->ects_c,
1944 "D" =>
$data->ects_d,
1945 "E" =>
$data->ects_e
1949 $this->mark_schema->flush();
1950 $this->mark_schema->loadFromDb($this->
getTestId());
2008 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
2010 switch($activation[
"timing_type"])
2037 $this->questions = array();
2040 if (strcmp($active_id,
"") == 0)
2048 $result = $ilDB->queryF(
"SELECT tst_test_rnd_qst.* FROM tst_test_rnd_qst, qpl_questions WHERE tst_test_rnd_qst.active_fi = %s AND qpl_questions.question_id = tst_test_rnd_qst.question_fi AND tst_test_rnd_qst.pass = %s ORDER BY sequence",
2049 array(
'integer',
'integer'),
2050 array($active_id,
$pass)
2058 $result = $ilDB->queryF(
"SELECT tst_test_rnd_qst.* FROM tst_test_rnd_qst, qpl_questions WHERE tst_test_rnd_qst.active_fi = %s AND qpl_questions.question_id = tst_test_rnd_qst.question_fi AND tst_test_rnd_qst.pass = 0 ORDER BY sequence",
2066 $result = $ilDB->queryF(
"SELECT tst_test_question.* FROM tst_test_question, qpl_questions WHERE tst_test_question.test_fi = %s AND qpl_questions.question_id = tst_test_question.question_fi ORDER BY sequence",
2068 array($this->test_id)
2074 $this->questions[$index++] =
$data[
"question_fi"];
2102 return (strlen($this->introduction)) ? $this->introduction : NULL;
2127 $this->_finalstatement = $a_statement;
2139 $this->_showinfo = ($a_info) ? 1 : 0;
2151 $this->_forcejs = ($a_js) ? 1 : 0;
2163 $this->_customStyle = $a_customStyle;
2175 return (strlen($this->_customStyle)) ? $this->_customStyle : NULL;
2188 $css_path = str_replace(
"ta.css",
"customstyles", $css_path) .
"/";
2189 $customstyles = array();
2190 if (is_dir($css_path))
2193 include_once
"./Services/Utilities/classes/class.ilFileUtils.php";
2199 if (strpos($filename,
".css"))
2201 array_push($customstyles, $filename);
2206 return $customstyles;
2221 $custom = str_replace(
"ta.css",
"customstyles/" . $this->
getCustomStyle(), $default);
2222 if (file_exists($custom))
2225 $custom = str_replace(
"ta.css",
"customstyles/" . $this->
getCustomStyle(), $custom);
2248 $this->_showfinalstatement = ($show) ? 1 : 0;
2259 return (strlen($this->_finalstatement)) ? $this->_finalstatement : NULL;
2271 return ($this->_showinfo) ? 1 : 0;
2283 return ($this->_forcejs) ? 1 : 0;
2295 return ($this->_showfinalstatement) ? 1 : 0;
2315 return ($this->ects_output) ? 1 : 0;
2323 $this->ects_output = $a_ects_output ? 1 : 0;
2331 return (strlen($this->ects_fx)) ? $this->ects_fx : NULL;
2339 $this->ects_fx = $a_ects_fx;
2355 $this->ects_grades = $a_ects_grades;
2365 return ($this->sequence_settings) ? $this->sequence_settings : 0;
2415 switch ($instant_feedback)
2418 $this->instant_verification = 1;
2421 $this->instant_verification = 0;
2435 switch ($answer_feedback)
2438 $this->answer_feedback = 1;
2441 $this->answer_feedback = 0;
2454 switch ($generic_answer_feedback)
2457 $this->answer_feedback = 1;
2460 $this->answer_feedback = 0;
2474 switch ($answer_feedback_points)
2477 $this->answer_feedback_points = 1;
2480 $this->answer_feedback_points = 0;
2491 if(!$reporting_date)
2493 $this->reporting_date =
'';
2516 return ($this->score_reporting) ? $this->score_reporting : 0;
2533 return ($this->instant_verification) ? $this->instant_verification : 0;
2546 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2559 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2571 return ($this->answer_feedback_points) ? $this->answer_feedback_points : 0;
2583 return ($this->count_system) ? $this->count_system : 0;
2596 $result = $ilDB->queryF(
"SELECT tst_tests.count_system FROM tst_tests, tst_active WHERE tst_active.active_id = %s AND tst_active.test_fi = tst_tests.test_id",
2603 return $row[
"count_system"];
2617 return ($this->mc_scoring) ? $this->mc_scoring : 0;
2629 return ($this->score_cutting) ? $this->score_cutting : 0;
2641 return ($this->pass_scoring) ? $this->pass_scoring : 0;
2654 $result = $ilDB->queryF(
"SELECT tst_tests.pass_scoring FROM tst_tests, tst_active WHERE tst_tests.test_id = tst_active.test_fi AND tst_active.active_id = %s",
2661 return $row[
"pass_scoring"];
2676 $result = $ilDB->queryF(
"SELECT tst_tests.mc_scoring FROM tst_tests, tst_active WHERE tst_active.active_id = %s AND tst_active.test_fi = tst_tests.test_id",
2683 return $row[
"mc_scoring"];
2698 $result = $ilDB->queryF(
"SELECT tst_tests.score_cutting FROM tst_tests, tst_active WHERE tst_active.active_id = %s AND tst_tests.test_id = tst_active.test_fi",
2705 return $row[
"score_cutting"];
2719 return (strlen($this->reporting_date)) ? $this->reporting_date : NULL;
2731 return ($this->nr_of_tries) ? $this->nr_of_tries : 0;
2743 return ($this->_kiosk) ? $this->_kiosk : 0;
2756 $this->_kiosk = $kiosk;
2768 if (($this->_kiosk & 1) > 0)
2789 $this->_kiosk = $this->_kiosk | 1;
2795 $this->_kiosk = $this->_kiosk ^ 1;
2809 if (($this->_kiosk & 2) > 0)
2829 $this->_kiosk = $this->_kiosk | 2;
2835 $this->_kiosk = $this->_kiosk ^ 2;
2849 if (($this->_kiosk & 4) > 0)
2869 $this->_kiosk = $this->_kiosk | 4;
2875 $this->_kiosk = $this->_kiosk ^ 4;
2889 return ($this->use_previous_answers) ? $this->use_previous_answers : 0;
2901 return ($this->title_output) ? $this->title_output : 0;
2916 $result = $ilDB->queryF(
"SELECT tst_tests.title_output FROM tst_tests, tst_active WHERE tst_tests.test_id = tst_active.test_fi AND tst_active.active_id = %s",
2923 return $row[
"title_output"];
2942 $use_previous_answers = 1;
2944 $result = $ilDB->queryF(
"SELECT tst_tests.use_previous_answers FROM tst_tests, tst_active WHERE tst_tests.test_id = tst_active.test_fi AND tst_active.active_id = %s",
2951 $use_previous_answers =
$row[
"use_previous_answers"];
2954 if ($use_previous_answers == 1)
2956 if ($user_active_user_setting)
2958 $res = $ilUser->getPref(
"tst_use_previous_answers");
2961 $use_previous_answers =
$res;
2977 return (strlen($this->processing_time)) ? $this->processing_time : NULL;
2988 if (strlen($this->processing_time))
2990 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches))
2992 if ((
int)$matches[1]+(
int)$matches[2]+(
int)$matches[3] == 0)
2999 'hh' => $matches[1],
3000 'mm' => $matches[2],
3001 'ss' => $matches[3],
3011 if (strlen($this->processing_time))
3013 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches))
3015 return ($matches[1] * 60) + $matches[2];
3019 return self::DEFAULT_PROCESSING_TIME_MINUTES;
3031 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $this->
getProcessingTime(), $matches))
3034 return ($matches[1] * 3600) + ($matches[2] * 60) + $matches[3] + $extratime;
3051 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getEndingTime(), $matches))
3053 $ending = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
3055 return $ending - $now;
3072 return ($this->enable_processing_time) ? $this->enable_processing_time : 0;
3084 return ($this->reset_processing_time) ? $this->reset_processing_time : 0;
3112 return (strlen($this->starting_time)) ? $this->starting_time : NULL;
3152 return (strlen($this->ending_time)) ? $this->ending_time : NULL;
3188 if ($use_previous_answers)
3190 $this->use_previous_answers = 1;
3194 $this->use_previous_answers = 0;
3224 switch ($title_output)
3227 $this->title_output = 1;
3230 $this->title_output = 2;
3233 $this->title_output = 0;
3252 $this->processing_time = sprintf(
"%02d:%02d:00", floor($minutes/60), $minutes%60);
3265 $this->enable_processing_time =
"1";
3267 $this->enable_processing_time =
"0";
3282 $this->reset_processing_time = 1;
3286 $this->reset_processing_time = 0;
3299 $this->count_system = $a_count_system;
3327 return (strlen($this->password)) ? $this->password : NULL;
3339 $this->password = $a_password;
3351 $this->score_cutting = $a_score_cutting;
3363 $this->mc_scoring = $a_mc_scoring;
3375 switch ($a_pass_scoring)
3391 foreach ($removeQuestionIds as $value) {
3408 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3413 $question->delete($question_id);
3431 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3433 $participantData->setUserIds($userIds);
3434 $participantData->load($this->
getTestId());
3449 require_once
'Services/Object/classes/class.ilObjectLP.php';
3451 $testLP->setTestObject($this);
3452 $testLP->resetLPDataForUserIds($participantData->
getUserIds(),
false);
3465 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3467 $participantData->setUserIds($userIds);
3468 $participantData->load($this->
getTestId());
3470 $IN_userIds = $ilDB->in(
'usr_id', $participantData->getUserIds(),
false,
'integer');
3471 $ilDB->manipulateF(
"DELETE FROM usr_pref WHERE $IN_userIds AND keyword = %s",
3472 array(
'text'), array(
"tst_password_".$this->
getTestId())
3475 if( count($participantData->getActiveIds()) )
3485 $IN_activeIds = $ilDB->in(
'active_fi', $activeIds,
false,
'integer');
3487 $ilDB->manipulate(
"DELETE FROM tst_solutions WHERE $IN_activeIds");
3488 $ilDB->manipulate(
"DELETE FROM tst_qst_solved WHERE $IN_activeIds");
3489 $ilDB->manipulate(
"DELETE FROM tst_test_result WHERE $IN_activeIds");
3490 $ilDB->manipulate(
"DELETE FROM tst_pass_result WHERE $IN_activeIds");
3491 $ilDB->manipulate(
"DELETE FROM tst_result_cache WHERE $IN_activeIds");
3492 $ilDB->manipulate(
"DELETE FROM tst_sequence WHERE $IN_activeIds");
3493 $ilDB->manipulate(
"DELETE FROM tst_times WHERE $IN_activeIds");
3497 $ilDB->manipulate(
"DELETE FROM tst_test_rnd_qst WHERE $IN_activeIds");
3501 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_tracking WHERE $IN_activeIds");
3502 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_answstatus WHERE $IN_activeIds");
3503 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_postponed WHERE $IN_activeIds");
3504 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_checked WHERE $IN_activeIds");
3507 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3509 foreach ($activeIds as $active_id)
3513 if (@is_dir(CLIENT_WEB_DIR .
"/assessment/tst_" . $this->
getTestId() .
"/$active_id"))
3524 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
3532 $IN_activeIds = $ilDB->in(
'active_id', $activeIds,
false,
'integer');
3533 $ilDB->manipulate(
"DELETE FROM tst_active WHERE $IN_activeIds");
3548 $result = $ilDB->queryF(
"SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3549 array(
'integer',
'integer'),
3553 if (
$data->sequence > 1)
3556 $result = $ilDB->queryF(
"SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3557 array(
'integer',
'integer'),
3560 $data_previous = $ilDB->fetchObject(
$result);
3562 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3563 array(
'integer',
'integer'),
3564 array(
$data->sequence, $data_previous->test_question_id)
3567 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3568 array(
'integer',
'integer'),
3569 array(
$data->sequence - 1,
$data->test_question_id)
3571 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3592 $result = $ilDB->queryF(
"SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3593 array(
'integer',
'integer'),
3597 $result = $ilDB->queryF(
"SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3598 array(
'integer',
'integer'),
3604 $data_next = $ilDB->fetchObject(
$result);
3606 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3607 array(
'integer',
'integer'),
3608 array(
$data->sequence, $data_next->test_question_id)
3611 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3612 array(
'integer',
'integer'),
3613 array(
$data->sequence + 1,
$data->test_question_id)
3615 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3635 $duplicate_id = $question->duplicate(
true, null, null, null, $this->
getId());
3637 return $duplicate_id;
3651 #var_dump($question_id); 3654 $duplicate_id = $question_id;
3662 $result = $ilDB->queryF(
"SELECT MAX(sequence) seq FROM tst_test_question WHERE test_fi=%s",
3671 $sequence =
$data->seq + 1;
3674 $next_id = $ilDB->nextId(
'tst_test_question');
3675 $affectedRows = $ilDB->manipulateF(
"INSERT INTO tst_test_question (test_question_id, test_fi, question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
3676 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
3677 array($next_id, $this->
getTestId(), $duplicate_id, $sequence, time())
3679 if ($affectedRows == 1)
3681 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3688 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_active WHERE test_fi = %s",
3694 return $duplicate_id;
3710 $result = $ilDB->queryF(
"SELECT qpl_questions.title FROM tst_test_question, qpl_questions WHERE tst_test_question.test_fi = %s AND tst_test_question.question_fi = qpl_questions.question_id ORDER BY tst_test_question.sequence",
3716 array_push($titles,
$row[
"title"]);
3735 $result = $ilDB->queryF(
"SELECT qpl_questions.title, qpl_questions.question_id FROM tst_test_question, qpl_questions WHERE tst_test_question.test_fi = %s AND tst_test_question.question_fi = qpl_questions.question_id ORDER BY tst_test_question.sequence",
3741 $titles[
$row[
'question_id']] = $row[
"title"];
3759 return $this->lng->txt(
"ass_question");
3779 $result = $ilDB->queryF(
"SELECT qpl_questions.*, qpl_qst_type.type_tag FROM qpl_questions, qpl_qst_type WHERE qpl_questions.question_id = %s AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id",
3798 $existing_questions = array();
3803 $result = $ilDB->queryF(
"SELECT qpl_questions.original_id FROM qpl_questions, tst_test_rnd_qst WHERE tst_test_rnd_qst.active_fi = %s AND tst_test_rnd_qst.question_fi = qpl_questions.question_id AND tst_test_rnd_qst.pass = %s",
3804 array(
'integer',
'integer'),
3805 array($active_id,
$pass)
3810 $result = $ilDB->queryF(
"SELECT qpl_questions.original_id FROM qpl_questions, tst_test_question WHERE tst_test_question.test_fi = %s AND tst_test_question.question_fi = qpl_questions.question_id",
3817 if(
$data->original_id === null )
3822 array_push($existing_questions,
$data->original_id);
3824 return $existing_questions;
3838 if ($question_id < 1)
return -1;
3839 $result = $ilDB->queryF(
"SELECT type_tag FROM qpl_questions, qpl_qst_type WHERE qpl_questions.question_id = %s AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id",
3846 return $data->type_tag;
3864 $next_id = $ilDB->nextId(
'tst_times');
3865 $affectedRows = $ilDB->manipulateF(
"INSERT INTO tst_times (times_id, active_fi, started, finished, pass, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
3866 array(
'integer',
'integer',
'timestamp',
'timestamp',
'integer',
'integer'),
3867 array($next_id, $active_id, strftime(
"%Y-%m-%d %H:%M:%S"), strftime(
"%Y-%m-%d %H:%M:%S"),
$pass, time())
3882 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_times SET finished = %s, tstamp = %s WHERE times_id = %s",
3883 array(
'timestamp',
'integer',
'integer'),
3884 array(strftime(
"%Y-%m-%d %H:%M:%S"), time(), $times_id)
3901 $result = $ilDB->queryF(
"SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3902 array(
'integer',
'integer'),
3903 array($active_id, 0)
3908 $result = $ilDB->queryF(
"SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3909 array(
'integer',
'integer'),
3910 array($active_id,
$pass)
3913 $result_array = array();
3916 array_push($result_array,
$row[
"question_fi"]);
3918 return $result_array;
3932 return ((($currentpass > 0) && ($num == 0)) || $this->
isTestFinished($active_id)) ? true :
false;
3946 $result_array = array();
3951 if (count($this->questions) == 0)
return $result_array;
3956 $result = $ilDB->queryF(
"SELECT qpl_questions.* FROM qpl_questions, tst_test_rnd_qst WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id AND tst_test_rnd_qst.active_fi = %s AND tst_test_rnd_qst.pass = %s AND " . $ilDB->in(
'qpl_questions.question_id', $this->questions,
false,
'integer'),
3957 array(
'integer',
'integer'),
3958 array($active_id,
$pass)
3963 if (count($this->questions) == 0)
return $result_array;
3964 $result = $ilDB->query(
"SELECT qpl_questions.* FROM qpl_questions, tst_test_question WHERE tst_test_question.question_fi = qpl_questions.question_id AND " . $ilDB->in(
'qpl_questions.question_id', $this->questions,
false,
'integer'));
3968 $result_array[
$row[
"question_id"]] =
$row;
3970 return $result_array;
3986 if (!$user_id) $user_id = $ilUser->getId();
3989 $result = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
3990 array(
'integer',
'integer',
'text'),
3994 else if (strlen($anonymous_id))
3996 $result = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
3997 array(
'integer',
'integer',
'text'),
3998 array($user_id, $this->test_id, $anonymous_id)
4003 if (
$_SESSION[
"AccountId"] == ANONYMOUS_USER_ID)
4007 $result = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
4008 array(
'integer',
'integer'),
4009 array($user_id, $this->test_id)
4015 return $row[
"active_id"];
4037 $user_id = $ilUser->id;
4043 $result = $ilDB->queryF(
"SELECT tst_active.active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
4044 array(
'integer',
'integer'),
4045 array($user_id, $test_id)
4050 return $row[
"active_id"];
4066 $keys = array_keys($array);
4069 foreach ($keys as $key)
4083 function &
getTestResult($active_id,
$pass = NULL, $ordered_sequence = FALSE, $considerHiddenQuestions =
true, $considerOptionalQuestions =
true)
4085 global $tree,
$ilDB,
$lng, $ilPluginAdmin;
4089 if( is_null(
$pass) )
4094 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
4096 $testSession = $testSessionFactory->getSession($active_id);
4098 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4100 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id,
$pass);
4104 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4106 $dynamicQuestionSetConfig->loadFromDb();
4108 $testSequence->loadFromDb($dynamicQuestionSetConfig);
4111 $sequence = $testSequence->getUserSequenceQuestions();
4115 $testSequence->setConsiderHiddenQuestionsEnabled($considerHiddenQuestions);
4116 $testSequence->setConsiderOptionalQuestionsEnabled($considerOptionalQuestions);
4118 $testSequence->loadFromDb();
4119 $testSequence->loadQuestions();
4121 if( $ordered_sequence )
4123 $sequence = $testSequence->getOrderedSequenceQuestions();
4127 $sequence = $testSequence->getUserSequenceQuestions();
4131 $arrResults = array();
4134 SELECT tst_test_result.question_fi, 4135 tst_test_result.points reached, 4136 tst_test_result.hint_count requested_hints, 4137 tst_test_result.hint_points hint_points, 4138 tst_test_result.answered answered 4140 FROM tst_test_result 4142 LEFT JOIN tst_solutions 4143 ON tst_solutions.active_fi = tst_test_result.active_fi 4144 AND tst_solutions.question_fi = tst_test_result.question_fi 4146 WHERE tst_test_result.active_fi = %s 4147 AND tst_test_result.pass = %s 4150 $solutionresult = $ilDB->queryF(
4151 $query, array(
'integer',
'integer'), array($active_id,
$pass)
4154 while(
$row = $ilDB->fetchAssoc($solutionresult) )
4156 $arrResults[
$row[
'question_fi'] ] =
$row;
4159 $numWorkedThrough = count($arrResults);
4161 require_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
4163 $IN_question_ids = $ilDB->in(
'qpl_questions.question_id', $sequence,
false,
'integer');
4166 SELECT qpl_questions.*, 4167 qpl_qst_type.type_tag, 4168 qpl_sol_sug.question_fi has_sug_sol 4173 LEFT JOIN qpl_sol_sug 4174 ON qpl_sol_sug.question_fi = qpl_questions.question_id 4176 WHERE qpl_qst_type.question_type_id = qpl_questions.question_type_fi 4177 AND $IN_question_ids 4182 $unordered = array();
4186 $obligationsAnswered =
true;
4191 $row[
'points'] ? $arrResults[
$row[
'question_id'] ][
'reached'] /
$row[
'points'] : 0
4194 if( $percentvalue < 0 ) $percentvalue = 0.0;
4199 "max" => round(
$row[
'points'], 2),
4200 "reached" => round($arrResults[
$row[
'question_id']][
'reached'],2),
4201 'requested_hints' => $arrResults[$row[
'question_id']][
'requested_hints'],
4202 'hint_points' => $arrResults[$row[
'question_id']][
'hint_points'],
4203 "percent" => sprintf(
"%2.2f ", ($percentvalue) * 100) .
"%",
4205 "type" => $row[
"type_tag"],
4206 "qid" => $row[
'question_id'],
4207 "original_id" => $row[
"original_id"],
4208 "workedthrough" => isset($arrResults[$row[
'question_id']]) ? 1 : 0,
4209 'answered' => $arrResults[$row[
'question_id']][
'answered']
4212 if( !$arrResults[ $row[
'question_id'] ][
'answered'] )
4214 $obligationsAnswered =
false;
4217 $unordered[ $row[
'question_id'] ] =
$data;
4222 $numQuestionsTotal = count($unordered);
4226 $pass_requested_hints = 0;
4227 $pass_hint_points = 0;
4232 foreach( $sequence as $qid )
4236 $pass_max += round($unordered[$qid][
'max'], 2);
4237 $pass_reached += round($unordered[$qid][
'reached'], 2);
4238 $pass_requested_hints += $unordered[$qid][
'requested_hints'];
4239 $pass_hint_points += $unordered[$qid][
'hint_points'];
4243 $unordered[$qid][
'nr'] = $key;
4244 array_push($found, $unordered[$qid]);
4254 if(
$results[
'reached_points'] < 0 )
4259 if( $pass_reached < 0 ) $pass_reached = 0;
4262 $found[
'pass'][
'total_max_points'] = $pass_max;
4263 $found[
'pass'][
'total_reached_points'] = $pass_reached;
4264 $found[
'pass'][
'total_requested_hints'] = $pass_requested_hints;
4265 $found[
'pass'][
'total_hint_points'] = $pass_hint_points;
4266 $found[
'pass'][
'percent'] = ($pass_max > 0) ? $pass_reached / $pass_max : 0;
4267 $found[
'pass'][
'obligationsAnswered'] = $obligationsAnswered;
4268 $found[
'pass'][
'num_workedthrough'] = $numWorkedThrough;
4269 $found[
'pass'][
'num_questions_total'] = $numQuestionsTotal;
4271 $found[
"test"][
"total_max_points"] =
$results[
'max_points'];
4272 $found[
"test"][
"total_reached_points"] =
$results[
'reached_points'];
4273 $found[
"test"][
"total_requested_hints"] =
$results[
'hint_count'];
4274 $found[
"test"][
"total_hint_points"] =
$results[
'hint_points'];
4275 $found[
"test"][
"result_pass"] =
$results[
'pass'];
4276 $found[
'test'][
'obligations_answered'] =
$results[
'obligations_answered'];
4278 if( (!$total_reached_points) or (!$total_max_points) )
4284 $percentage = ($total_reached_points / $total_max_points) * 100.0;
4286 if( $percentage < 0 ) $percentage = 0.0;
4289 $found[
"test"][
"passed"] =
$results[
'passed'];
4304 $result = $ilDB->queryF(
"SELECT COUNT(active_id) total FROM tst_active WHERE test_fi = %s",
4309 return $row[
"total"];
4322 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi AND tst_active.user_fi = %s",
4323 array(
'integer',
'integer'),
4329 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4330 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4331 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4332 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4333 $time += ($epoch_2 - $epoch_1);
4360 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi ORDER BY tst_times.active_fi, tst_times.started",
4368 if (!array_key_exists(
$row[
"active_fi"], $times))
4370 $times[
$row[
"active_fi"]] = 0;
4372 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4373 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4374 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4375 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4376 $times[
$row[
"active_fi"]] += ($epoch_2 - $epoch_1);
4391 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi AND tst_active.active_id = %s ORDER BY tst_times.active_fi, tst_times.started",
4392 array(
'integer',
'integer'),
4398 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4399 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4400 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4401 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4402 $time += ($epoch_2 - $epoch_1);
4417 $result = $ilDB->queryF(
"SELECT * FROM tst_times WHERE active_fi = %s AND pass = %s ORDER BY started",
4418 array(
'integer',
'integer'),
4419 array($active_id,
$pass)
4424 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4425 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4426 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4427 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4428 $time += ($epoch_2 - $epoch_1);
4457 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi AND tst_active.active_id = %s ORDER BY tst_times.started",
4458 array(
'integer',
'integer'),
4459 array($test_id, $active_id)
4465 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4466 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4467 if ($firstvisit == 0 || $epoch_1 < $firstvisit) $firstvisit = $epoch_1;
4468 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4469 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4470 if ($epoch_2 > $lastvisit) $lastvisit = $epoch_2;
4472 return array(
"firstvisit" => $firstvisit,
"lastvisit" => $lastvisit);
4487 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.active_id = %s AND tst_active.active_id = tst_times.active_fi",
4496 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->started, $matches);
4497 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4498 if (!$first_visit) {
4499 $first_visit = $epoch_1;
4501 if ($epoch_1 < $first_visit) {
4502 $first_visit = $epoch_1;
4504 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->finished, $matches);
4505 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4507 $last_visit = $epoch_2;
4509 if ($epoch_2 > $last_visit) {
4510 $last_visit = $epoch_2;
4512 $times[
$row->active_fi] += ($epoch_2 - $epoch_1);
4515 foreach ($times as $key => $value) {
4516 $max_time += $value;
4518 if ((!$test_result[
"test"][
"total_reached_points"]) or (!$test_result[
"test"][
"total_max_points"]))
4524 $percentage = ($test_result[
"test"][
"total_reached_points"] / $test_result[
"test"][
"total_max_points"]) * 100.0;
4525 if ($percentage < 0) $percentage = 0.0;
4527 $mark_obj = $this->mark_schema->getMatchingMark($percentage);
4528 $first_date = getdate($first_visit);
4529 $last_date = getdate($last_visit);
4530 $qworkedthrough = 0;
4531 foreach ($test_result as $key => $value)
4533 if (preg_match(
"/\d+/", $key))
4535 $qworkedthrough += $value[
"workedthrough"];
4538 if (!$qworkedthrough)
4544 $atimeofwork = $max_time / $qworkedthrough;
4547 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4554 $result_mark = $mark_obj->getShortName();
4556 if( $mark_obj->getPassed() && $obligationsAnswered )
4565 $percent_worked_through = 0;
4566 if (count($this->questions))
4568 $percent_worked_through = $qworkedthrough / count($this->questions);
4570 $result_array = array(
4571 "qworkedthrough" => $qworkedthrough,
4572 "qmax" => count($this->questions),
4573 "pworkedthrough" => $percent_worked_through,
4574 "timeofwork" => $max_time,
4575 "atimeofwork" => $atimeofwork,
4576 "firstvisit" => $first_date,
4577 "lastvisit" => $last_date,
4578 "resultspoints" => $test_result[
"test"][
"total_reached_points"],
4579 "maxpoints" => $test_result[
"test"][
"total_max_points"],
4580 "resultsmarks" => $result_mark,
4581 "passed" => $passed,
4582 "distancemedian" =>
"0" 4584 foreach ($test_result as $key => $value)
4586 if (preg_match(
"/\d+/", $key))
4588 $result_array[$key] = $value;
4591 return $result_array;
4603 $totalpoints_array = array();
4605 foreach ($all_users as $active_id => $user_name)
4608 $reached = $test_result[
"test"][
"total_reached_points"];
4609 $total = $test_result[
"test"][
"total_max_points"];
4611 $mark = $this->mark_schema->getMatchingMark($percentage*100.0);
4613 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4617 if( $mark->getPassed() && $obligationsAnswered )
4619 array_push($totalpoints_array, $test_result[
"test"][
"total_reached_points"]);
4623 return $totalpoints_array;
4634 $result = $ilDB->queryF(
"SELECT tst_active.active_id, usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login FROM tst_active LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id WHERE tst_active.test_fi = %s ORDER BY usr_data.lastname ASC",
4638 $persons_array = array();
4641 $name = $this->lng->txt(
"anonymous");
4642 $fullname = $this->lng->txt(
"anonymous");
4646 if (strlen(
$row[
"firstname"].
$row[
"lastname"].
$row[
"title"]) == 0)
4648 $name = $this->lng->txt(
"deleted_user");
4649 $fullname = $this->lng->txt(
"deleted_user");
4650 $login = $this->lng->txt(
"unknown");
4654 $login = $row[
"login"];
4655 if ($row[
"user_fi"] == ANONYMOUS_USER_ID)
4657 $name = $this->lng->txt(
"anonymous");
4658 $fullname = $this->lng->txt(
"anonymous");
4662 $name = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4663 $fullname = trim($row[
"title"] .
" " . $row[
"firstname"] .
" " . $row[
"lastname"]);
4667 $persons_array[
$row[
"active_id"]] = array(
4669 "fullname" => $fullname,
4673 return $persons_array;
4685 $result = $ilDB->queryF(
"SELECT tst_active.active_id, usr_data.firstname, usr_data.lastname, usr_data.title FROM tst_active LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id WHERE tst_active.test_fi = %s ORDER BY usr_data.lastname " . strtoupper($name_sort_order),
4689 $persons_array = array();
4694 $persons_array[
$row[
"active_id"]] = $this->lng->txt(
"anonymous");
4698 if (strlen(
$row[
"firstname"].
$row[
"lastname"].
$row[
"title"]) == 0)
4700 $persons_array[$row[
"active_id"]] = $this->lng->txt(
"deleted_user");
4704 if ($row[
"user_fi"] == ANONYMOUS_USER_ID)
4706 $persons_array[$row[
"active_id"]] = $row[
"lastname"];
4710 $persons_array[$row[
"active_id"]] = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4715 return $persons_array;
4727 $result = $ilDB->queryF(
"SELECT tst_active.active_id, usr_data.login, usr_data.firstname, usr_data.lastname, usr_data.title FROM tst_active LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id WHERE tst_active.test_fi = %s ORDER BY usr_data.lastname " . strtoupper($name_sort_order),
4731 $persons_array = array();
4736 $persons_array[
$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"anonymous"));
4740 if (strlen(
$row[
"firstname"].
$row[
"lastname"].
$row[
"title"]) == 0)
4742 $persons_array[$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"deleted_user"));
4746 if ($row[
"user_fi"] == ANONYMOUS_USER_ID)
4748 $persons_array[$row[
"active_id"]] = array(
"name" => $row[
"lastname"]);
4752 $persons_array[$row[
"active_id"]] = array(
"name" => trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]),
"login" => $row[
"login"]);
4757 return $persons_array;
4770 $result = $ilDB->queryF(
"SELECT COUNT(active_id) total FROM tst_active WHERE test_fi = %s AND submitted = %s",
4771 array(
'integer',
'integer'),
4775 return $row[
"total"];
4790 $result = $ilDB->queryF(
"SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4791 "tst_test_rnd_qst.pass, qpl_questions.points " .
4792 "FROM tst_test_rnd_qst, qpl_questions " .
4793 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4794 "AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence",
4801 $result = $ilDB->queryF(
"SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4802 "qpl_questions.points " .
4803 "FROM tst_test_question, tst_active, qpl_questions " .
4804 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4805 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4815 array_push($qtest,
$row);
4833 $result = $ilDB->queryF(
"SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4834 "qpl_questions.points " .
4835 "FROM tst_test_rnd_qst, qpl_questions " .
4836 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4837 "AND tst_test_rnd_qst.active_fi = %s AND tst_test_rnd_qst.pass = %s " .
4838 "ORDER BY tst_test_rnd_qst.sequence",
4839 array(
'integer',
'integer'),
4840 array($active_id,
$pass)
4845 $result = $ilDB->queryF(
"SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4846 "qpl_questions.points " .
4847 "FROM tst_test_question, tst_active, qpl_questions " .
4848 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4849 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4859 array_push($qpass,
$row);
4869 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
4870 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
4871 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
4876 SELECT tst_test_result.*, 4877 qpl_questions.original_id, 4878 qpl_questions.title questiontitle, 4879 qpl_questions.points maxpoints 4881 FROM tst_test_result, qpl_questions, tst_active 4883 WHERE tst_active.active_id = tst_test_result.active_fi 4884 AND qpl_questions.question_id = tst_test_result.question_fi 4885 AND tst_active.test_fi = %s 4887 ORDER BY tst_active.active_id ASC, tst_test_result.pass ASC, tst_test_result.tstamp DESC 4897 $questionData = array();
4901 $participantObject =
$data->getParticipant(
$row[
"active_fi"]);
4908 $passObject = $participantObject->getPass(
$row[
"pass"]);
4915 $passObject->addAnsweredQuestion(
4920 foreach( array_keys(
$data->getParticipants()) as $active_id )
4924 for( $testpass = 0; $testpass <=
$data->getParticipant($active_id)->getLastPass(); $testpass++ )
4927 $result = $ilDB->queryF(
"SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, qpl_questions.original_id, " .
4928 "tst_test_rnd_qst.pass, qpl_questions.points, qpl_questions.title " .
4929 "FROM tst_test_rnd_qst, qpl_questions " .
4930 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4931 "AND tst_test_rnd_qst.pass = %s " .
4932 "AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence",
4933 array(
'integer',
'integer'),
4934 array($testpass, $active_id)
4940 $tpass = array_key_exists(
"pass",
$row) ?
$row[
"pass"] : 0;
4941 $data->getParticipant($active_id)->addQuestion(
$row[
"original_id"],
$row[
"question_fi"],
$row[
"points"],
$row[
"sequence"], $tpass);
4942 $data->addQuestionTitle(
$row[
"question_fi"],
$row[
"title"]);
4949 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4950 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4951 require_once
'Modules/Test/classes/class.ilTestDynamicQuestionSetFilterSelection.php';
4953 $lastPass =
$data->getParticipant($active_id)->getLastPass();
4954 for($testpass = 0; $testpass <= $lastPass; $testpass++)
4956 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4960 $dynamicQuestionSetConfig->loadFromDb();
4962 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4964 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id, $testpass);
4966 $testSequence->loadFromDb($dynamicQuestionSetConfig);
4969 $sequence = (array)$testSequence->getUserSequenceQuestions();
4971 $questionsIdsToRequest = array_diff(array_values($sequence), array_values($questionData));
4972 if(count($questionsIdsToRequest) > 0)
4974 $questionIdsCondition =
' ' . $ilDB->in(
'question_id', array_values($questionsIdsToRequest),
false,
'integer') .
' ';
4976 $res = $ilDB->queryF(
" 4979 WHERE {$questionIdsCondition}",
4983 while(
$row = $ilDB->fetchAssoc(
$res))
4985 $questionData[
$row[
'question_id']] =
$row;
4986 $data->addQuestionTitle($row[
'question_id'], $row[
'title']);
4990 foreach($sequence as $questionId)
4992 if(!isset($questionData[$questionId]))
4997 $row = $questionData[$questionId];
4999 $data->getParticipant(
5000 $active_id)->addQuestion(
$row[
'original_id'],
$row[
'question_id'],
$row[
'points'],
5008 $result = $ilDB->queryF(
"SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
5009 "qpl_questions.points, qpl_questions.title, qpl_questions.original_id " .
5010 "FROM tst_test_question, tst_active, qpl_questions " .
5011 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
5012 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi ORDER BY tst_test_question.sequence",
5018 $questionsbysequence = array();
5022 $questionsbysequence[
$row[
"sequence"]] =
$row;
5025 $seqresult = $ilDB->queryF(
"SELECT * FROM tst_sequence WHERE active_fi = %s",
5030 while ($seqrow = $ilDB->fetchAssoc($seqresult))
5032 $questionsequence = unserialize($seqrow[
"sequence"]);
5033 foreach ($questionsequence as $sidx => $seq)
5035 $data->getParticipant($active_id)->addQuestion($questionsbysequence[$seq][
"original_id"], $questionsbysequence[$seq][
"question_fi"], $questionsbysequence[$seq][
"points"], $sidx + 1, $seqrow[
"pass"]);
5036 $data->addQuestionTitle($questionsbysequence[$seq][
"question_fi"], $questionsbysequence[$seq][
"title"]);
5048 foreach( array_keys(
$data->getParticipants()) as $active_id )
5050 $tstUserData =
$data->getParticipant($active_id);
5052 $percentage = $tstUserData->getReachedPointsInPercent();
5054 $obligationsAnswered = $tstUserData->areObligationsAnswered();
5056 $mark = $this->mark_schema->getMatchingMark($percentage);
5058 if (is_object($mark))
5060 $tstUserData->setMark($mark->getShortName());
5061 $tstUserData->setMarkOfficial($mark->getOfficialName());
5063 $tstUserData->setPassed(
5064 $mark->getPassed() && $tstUserData->areObligationsAnswered()
5071 $passed_array, $tstUserData->getReached(), $tstUserData->getMaxPoints()
5074 $tstUserData->setECTSMark($ects_mark);
5079 $tstUserData->setFirstVisit($visitingTime[
"firstvisit"]);
5080 $tstUserData->setLastVisit($visitingTime[
"lastvisit"]);
5096 $res = $ilDB->queryF(
" 5097 SELECT COUNT(qpl_questions.question_id) qcount, 5098 SUM(qpl_questions.points) qsum 5100 INNER JOIN tst_tests 5101 ON tst_tests.test_id = tst_active.test_fi 5102 INNER JOIN tst_dyn_quest_set_cfg 5103 ON tst_dyn_quest_set_cfg.test_fi = tst_tests.test_id 5104 INNER JOIN qpl_questions 5105 ON qpl_questions.obj_fi = tst_dyn_quest_set_cfg.source_qpl_fi 5106 AND qpl_questions.original_id IS NULL 5107 AND qpl_questions.complete = %s 5108 WHERE tst_active.active_id = %s 5110 array(
'integer',
'integer'),
5111 array(1, $active_id)
5118 $res = $ilDB->queryF(
" 5119 SELECT tst_test_rnd_qst.pass, 5120 COUNT(tst_test_rnd_qst.question_fi) qcount, 5121 SUM(qpl_questions.points) qsum 5123 FROM tst_test_rnd_qst, 5126 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id 5127 AND tst_test_rnd_qst.active_fi = %s 5130 GROUP BY tst_test_rnd_qst.active_fi, 5131 tst_test_rnd_qst.pass 5133 array(
'integer',
'integer'),
5134 array($active_id,
$pass)
5141 $res = $ilDB->queryF(
" 5142 SELECT COUNT(tst_test_question.question_fi) qcount, 5143 SUM(qpl_questions.points) qsum 5145 FROM tst_test_question, 5149 WHERE tst_test_question.question_fi = qpl_questions.question_id 5150 AND tst_test_question.test_fi = tst_active.test_fi 5151 AND tst_active.active_id = %s 5153 GROUP BY tst_test_question.test_fi 5163 throw new ilTestException(
"not supported question set type: $questionSetType");
5168 if( is_array(
$row) )
5170 return array(
"count" =>
$row[
"qcount"],
"points" =>
$row[
"qsum"]);
5173 return array(
"count" => 0,
"points" => 0);
5178 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
5179 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
5180 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
5182 if ($withStatistics)
5184 $data->calculateStatistics();
5186 $data->setFilter($filterby, $filtertext);
5211 $result = $ilDB->queryF(
"SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5212 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5213 "qpl_questions.points maxpoints " .
5214 "FROM tst_test_result, qpl_questions, tst_active " .
5215 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5216 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5217 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5218 "AND tst_active.test_fi = %s " .
5219 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5223 $overview = array();
5226 if (!array_key_exists(
$row[
"active_fi"], $overview))
5228 $overview[
$row[
"active_fi"]] = array();
5229 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5230 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5231 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5232 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5233 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5234 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5235 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5237 if (!array_key_exists(
$row[
"pass"], $overview[
$row[
"active_fi"]]))
5239 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5240 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5241 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5243 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5244 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5260 $result = $ilDB->queryF(
"SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5261 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5262 "qpl_questions.points maxpoints " .
5263 "FROM tst_test_result, qpl_questions, tst_active " .
5264 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5265 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5266 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5267 "AND tst_active.test_fi = %s AND tst_active.active_id = %s" .
5268 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5269 array(
'integer',
'integer'),
5272 $overview = array();
5275 if (!array_key_exists(
$row[
"active_fi"], $overview))
5277 $overview[
$row[
"active_fi"]] = array();
5278 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5279 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5280 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5281 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5282 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5283 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5284 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5286 if (!array_key_exists(
$row[
"pass"], $overview[
$row[
"active_fi"]]))
5288 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5289 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5290 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5292 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5293 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5312 if (strlen($firstname.$lastname.$title) == 0)
5314 $name = $this->lng->txt(
"deleted_user");
5318 if ($user_id == ANONYMOUS_USER_ID)
5324 $name = trim($lastname .
", " . $firstname .
" " .
$title);
5328 $name = $this->lng->txt(
"anonymous");
5350 if (strlen($firstname.$lastname.$title) == 0)
5352 $name = $lng->txt(
"deleted_user");
5356 if ($user_id == ANONYMOUS_USER_ID)
5362 $name = trim($lastname .
", " . $firstname .
" " .
$title);
5366 $name = $lng->txt(
"anonymous");
5382 $result = $ilDB->queryF(
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi",
5389 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->started, $matches);
5390 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5391 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->finished, $matches);
5392 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5393 $times[
$row->active_fi] += ($epoch_2 - $epoch_1);
5397 foreach ($times as $key => $value)
5399 $max_time += $value;
5404 $average_time = round($max_time / $counter);
5410 return $average_time;
5419 function &
getAvailableQuestionpools($use_object_id =
false, $equal_points =
false, $could_be_offline =
false, $show_path = FALSE, $with_questioncount = FALSE, $permission =
"read")
5421 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5433 $time_in_seconds = 0;
5434 foreach ($this->questions as $question_id)
5437 $est_time = $question->getEstimatedWorkingTime();
5438 $time_in_seconds += $est_time[
"h"] * 3600 + $est_time[
"m"] * 60 + $est_time[
"s"];
5440 $hours = (int)($time_in_seconds / 3600) ;
5441 $time_in_seconds = $time_in_seconds - ($hours * 3600);
5442 $minutes = (int)($time_in_seconds / 60);
5443 $time_in_seconds = $time_in_seconds - ($minutes * 60);
5444 $result = array(
"hh" => $hours,
"mm" => $minutes,
"ss" => $time_in_seconds);
5456 return CLIENT_WEB_DIR .
"/assessment/" . $this->
getId() .
"/images/";
5467 include_once
"./Services/Utilities/classes/class.ilUtil.php";
5482 if ((!$question_type) and ($question_id > 0))
5487 if (!strlen($question_type))
return null;
5489 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5493 $question =
new $question_type_gui();
5495 if ($question_id > 0)
5497 $question->object->loadFromDb($question_id);
5502 $question->object->feedbackOBJ =
new $feedbackObjectClassname($question->object, $ilCtrl, $ilDB, $lng);
5504 $assSettings =
new ilSetting(
'assessment');
5505 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
5507 $processLockerFactory->setQuestionId($question->object->getId());
5508 $processLockerFactory->setUserId($ilUser->getId());
5509 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
5511 $question->object->setProcessLocker($processLockerFactory->getLocker());
5528 if (strcmp($question_id,
"") != 0)
5530 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5545 $this->questions = array_values($this->questions);
5546 $array_pos = array_search($target_index, $this->questions);
5547 if ($insert_mode == 0)
5549 $part1 = array_slice($this->questions, 0, $array_pos);
5550 $part2 = array_slice($this->questions, $array_pos);
5552 else if ($insert_mode == 1)
5554 $part1 = array_slice($this->questions, 0, $array_pos + 1);
5555 $part2 = array_slice($this->questions, $array_pos + 1);
5557 foreach ($move_questions as $question_id)
5559 if (!(array_search($question_id, $part1) === FALSE))
5561 unset($part1[array_search($question_id, $part1)]);
5563 if (!(array_search($question_id, $part2) === FALSE))
5565 unset($part2[array_search($question_id, $part2)]);
5568 $part1 = array_values($part1);
5569 $part2 = array_values($part2);
5570 $new_array = array_values(array_merge($part1, $move_questions, $part2));
5571 $this->questions = array();
5573 foreach ($new_array as $question_id)
5575 $this->questions[$counter] = $question_id;
5593 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getStartingTime(), $matches))
5595 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5597 if ($now < $epoch_time)
5618 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getEndingTime(), $matches))
5620 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5622 if ($now > $epoch_time)
5642 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5645 if (count($available_pools))
5647 $available =
" AND " . $ilDB->in(
'qpl_questions.obj_fi', $available_pools,
false,
'integer');
5655 $available .=
" AND qpl_questions.complete = " . $ilDB->quote(
"1",
'text');
5659 if (is_array($arrFilter))
5661 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title']))
5663 $where .=
" AND " . $ilDB->like(
'qpl_questions.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
5665 if (array_key_exists(
'description', $arrFilter) && strlen($arrFilter[
'description']))
5667 $where .=
" AND " . $ilDB->like(
'qpl_questions.description',
'text',
"%%" . $arrFilter[
'description'] .
"%%");
5669 if (array_key_exists(
'author', $arrFilter) && strlen($arrFilter[
'author']))
5671 $where .=
" AND " . $ilDB->like(
'qpl_questions.author',
'text',
"%%" . $arrFilter[
'author'] .
"%%");
5673 if (array_key_exists(
'type', $arrFilter) && strlen($arrFilter[
'type']))
5675 $where .=
" AND qpl_qst_type.type_tag = " . $ilDB->quote($arrFilter[
'type'],
'text');
5677 if (array_key_exists(
'qpl', $arrFilter) && strlen($arrFilter[
'qpl']))
5679 $where .=
" AND " . $ilDB->like(
'object_data.title',
'text',
"%%" . $arrFilter[
'qpl'] .
"%%");
5684 $original_clause =
" qpl_questions.original_id IS NULL";
5685 if (count($original_ids))
5687 $original_clause =
" qpl_questions.original_id IS NULL AND " . $ilDB->in(
'qpl_questions.question_id', $original_ids,
true,
'integer');
5690 $query_result = $ilDB->query(
5691 "SELECT qpl_questions.*, qpl_questions.tstamp, qpl_qst_type.type_tag, qpl_qst_type.plugin, object_data.title qpl " .
5692 "FROM qpl_questions, qpl_qst_type, object_data WHERE $original_clause $available AND " .
5693 "object_data.obj_id = qpl_questions.obj_fi AND qpl_questions.tstamp > 0 AND " .
5694 "qpl_questions.question_type_fi = qpl_qst_type.question_type_id$where");
5697 if ($query_result->numRows())
5699 while (
$row = $ilDB->fetchAssoc($query_result))
5701 $row[
'ttype'] = $types[
$row[
'type_tag']];
5706 array_push($rows, $row);
5711 array_push($rows, $row);
5723 global $ilPluginAdmin;
5725 $lng->loadLanguageModule(
"assessment");
5726 $result = $ilDB->query(
"SELECT * FROM qpl_qst_type");
5730 if (
$row[
"plugin"] == 0)
5732 $types[
$row[
'type_tag']] = $lng->txt($row[
"type_tag"]);
5736 $pl_names = $ilPluginAdmin->getActivePluginsForSlot(
IL_COMP_MODULE,
"TestQuestionPool",
"qst");
5737 foreach ($pl_names as $pl_name)
5740 if (strcmp($pl->getQuestionType(),
$row[
"type_tag"]) == 0)
5742 $types[
$row[
'type_tag']] = $pl->getQuestionTypeTranslation();
5763 foreach ($assessment->objectives as $objectives)
5765 foreach ($objectives->materials as $material)
5782 foreach ($assessment->assessmentcontrol as $assessmentcontrol)
5784 switch ($assessmentcontrol->getSolutionswitch())
5800 foreach ($assessment->qtimetadata as $metadata)
5802 switch ($metadata[
"label"])
5806 $type = $metadata[
"entry"];
5827 case "sequence_settings":
5830 case "solution_details":
5833 case "print_bs_with_res":
5843 $this->
setKiosk($metadata[
"entry"]);
5845 case "showfinalstatement":
5858 case "highscore_enabled":
5862 case "highscore_anon":
5866 case "highscore_achieved_ts":
5870 case "highscore_score":
5874 case "highscore_percentage":
5878 case "highscore_hints":
5882 case "highscore_wtime":
5886 case "highscore_own_table":
5890 case "highscore_top_table":
5894 case "highscore_top_num":
5898 case "hide_previous_results":
5899 if ($metadata[
"entry"] == 0)
5908 case "use_previous_answers":
5911 case "answer_feedback":
5914 case "hide_title_points":
5917 case "title_output":
5920 case "question_set_type":
5924 if( $metadata[
"entry"] )
5933 case "results_presentation":
5936 case "reset_processing_time":
5939 case "instant_verification":
5942 case "instant_feedback_answer_fixation":
5945 case "force_instant_feedback":
5948 case "answer_feedback_points":
5963 case "fixed_participants":
5966 case "score_reporting":
5969 case "shuffle_questions":
5972 case "count_system":
5978 case "mailnotification":
5984 case "exportsettings":
5987 case "score_cutting":
5994 case "allowedUsers":
5998 case "allowedUsersTimeGap":
6001 case "pass_scoring":
6004 case 'pass_deletion_allowed':
6007 case "show_summary":
6010 case "reporting_date":
6011 $iso8601period = $metadata[
"entry"];
6012 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches))
6014 $this->
setReportingDate(sprintf(
"%02d%02d%02d%02d%02d%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6017 case 'enable_processing_time':
6020 case "processing_time":
6023 case "starting_time":
6024 $iso8601period = $metadata[
"entry"];
6025 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches))
6027 $this->
setStartingTime(sprintf(
"%02d%02d%02d%02d%02d%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6032 $iso8601period = $metadata[
"entry"];
6033 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches))
6035 $this->
setEndingTime(sprintf(
"%02d%02d%02d%02d%02d%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6039 case "enable_examview":
6042 case 'show_examview_html':
6045 case 'show_examview_pdf':
6048 case 'redirection_mode':
6051 case 'redirection_url':
6054 case 'examid_in_kiosk':
6055 case 'examid_in_test_pass':
6058 case 'show_exam_id':
6059 case 'examid_in_test_res':
6062 case 'enable_archiving':
6065 case 'sign_submission':
6068 case 'char_selector_availability':
6071 case 'char_selector_definition':
6074 case 'skill_service':
6077 case 'result_tax_filters':
6078 $this->
setResultFilterTaxIds(strlen($metadata[
'entry']) ? unserialize($metadata[
'entry']) : array());
6080 case 'show_grading_status':
6083 case 'show_grading_mark':
6086 case 'activation_limited':
6089 case 'activation_start_time':
6092 case 'activation_end_time':
6095 case 'activation_visibility':
6101 case 'autosave_ival':
6104 case 'offer_question_hints':
6107 case 'instant_feedback_specific':
6110 case 'obligations_enabled':
6114 if (preg_match(
"/mark_step_\d+/", $metadata[
"label"]))
6116 $xmlmark = $metadata[
"entry"];
6117 preg_match(
"/<short>(.*?)<\/short>/", $xmlmark, $matches);
6118 $mark_short = $matches[1];
6119 preg_match(
"/<official>(.*?)<\/official>/", $xmlmark, $matches);
6120 $mark_official = $matches[1];
6121 preg_match(
"/<percentage>(.*?)<\/percentage>/", $xmlmark, $matches);
6122 $mark_percentage = $matches[1];
6123 preg_match(
"/<passed>(.*?)<\/passed>/", $xmlmark, $matches);
6124 $mark_passed = $matches[1];
6125 $this->mark_schema->addMarkStep($mark_short, $mark_official, $mark_percentage, $mark_passed);
6129 if (is_array(
$_SESSION[
"import_mob_xhtml"]))
6131 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6132 include_once
"./Services/RTE/classes/class.ilRTE.php";
6133 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
6134 foreach (
$_SESSION[
"import_mob_xhtml"] as $mob)
6137 if (file_exists($importfile))
6147 $ilLog->write(
"Error: Could not open XHTML mob file for test introduction during test import. File $importfile does not exist!");
6161 include_once(
"./Services/Xml/classes/class.ilXmlWriter.php");
6165 $a_xml_writer->xmlSetDtdDef(
"<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">");
6166 $a_xml_writer->xmlStartTag(
"questestinterop");
6169 "ident" =>
"il_".IL_INST_ID.
"_tst_".$this->getTestId(),
6172 $a_xml_writer->xmlStartTag(
"assessment", $attrs);
6174 $a_xml_writer->xmlElement(
"qticomment", NULL, $this->
getDescription());
6177 if ($this->enable_processing_time)
6179 preg_match(
"/(\d+):(\d+):(\d+)/", $this->processing_time, $matches);
6180 $a_xml_writer->xmlElement(
"duration", NULL, sprintf(
"P0Y0M0DT%dH%dM%dS", $matches[1], $matches[2], $matches[3]));
6184 $a_xml_writer->xmlStartTag(
"qtimetadata");
6185 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6186 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"ILIAS_VERSION");
6187 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
ilias->getSetting(
"ilias_version"));
6188 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6191 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6192 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"anonymity");
6193 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getAnonymity()));
6194 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6196 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6197 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"use_pool");
6198 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getPoolUsage() ? 1 : 0);
6199 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6202 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6203 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"question_set_type");
6205 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6208 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6209 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"sequence_settings");
6211 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6214 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6215 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"author");
6216 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getAuthor());
6217 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6220 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6221 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"reset_processing_time");
6223 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6226 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6227 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"count_system");
6228 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getCountSystem());
6229 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6232 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6233 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"mc_scoring");
6234 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getMCScoring());
6235 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6238 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6239 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"score_cutting");
6240 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getScoreCutting());
6241 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6244 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6245 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"password");
6246 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getPassword());
6247 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6250 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6251 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"allowedUsers");
6252 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getAllowedUsers());
6253 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6256 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6257 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"allowedUsersTimeGap");
6259 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6262 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6263 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"pass_scoring");
6264 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getPassScoring());
6265 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6267 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6268 $a_xml_writer->xmlElement(
'fieldlabel', NULL,
'pass_deletion_allowed');
6270 $a_xml_writer->xmlEndTag(
'qtimetadatafield');
6275 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6276 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"reporting_date");
6277 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->reporting_date, $matches);
6278 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6279 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6282 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6283 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"nr_of_tries");
6284 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getNrOfTries()));
6285 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6288 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6289 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"kiosk");
6290 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getKiosk()));
6291 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6295 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6296 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"redirection_mode");
6298 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6301 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6302 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"redirection_url");
6304 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6307 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6308 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"use_previous_answers");
6310 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6313 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6314 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"title_output");
6315 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getTitleOutput()));
6316 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6319 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6320 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"results_presentation");
6322 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6325 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6326 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"examid_in_test_pass");
6328 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6331 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6332 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"examid_in_test_res");
6334 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6337 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6338 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_summary");
6340 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6343 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6344 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"score_reporting");
6345 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getScoreReporting()));
6346 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6348 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6349 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"solution_details");
6351 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6352 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6353 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"print_bs_with_res");
6355 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6358 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6359 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"instant_verification");
6361 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6364 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6365 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"answer_feedback");
6366 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getAnswerFeedback()));
6367 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6370 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6371 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"answer_feedback_points");
6373 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6376 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6377 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"instant_feedback_answer_fixation");
6379 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6382 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6383 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"force_instant_feedback");
6385 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6389 $highscore_metadata = array(
6401 foreach($highscore_metadata as $label =>
$data)
6403 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6404 $a_xml_writer->xmlElement(
"fieldlabel", NULL, $label);
6405 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d",
$data[
'value']));
6406 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6410 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6411 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_cancel");
6412 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getShowCancel()));
6413 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6416 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6417 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_marker");
6418 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getShowMarker()));
6419 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6422 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6423 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"fixed_participants");
6425 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6428 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6429 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"showfinalstatement");
6430 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", (($this->
getShowFinalStatement()) ?
"1" :
"0")));
6431 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6434 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6435 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"showinfo");
6436 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", (($this->
getShowInfo()) ?
"1" :
"0")));
6437 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6440 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6441 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"mailnotification");
6443 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6446 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6447 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"mailnottype");
6449 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6452 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6453 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"exportsettings");
6455 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6458 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6459 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"forcejs");
6460 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", (($this->
getForceJS()) ?
"1" :
"0")));
6461 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6464 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6465 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"customstyle");
6466 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getCustomStyle());
6467 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6470 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6471 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"shuffle_questions");
6472 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"%d", $this->
getShuffleQuestions()));
6473 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6476 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6477 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"processing_time");
6479 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6482 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6483 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"enable_examview");
6485 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6488 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6489 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_examview_html");
6491 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6494 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6495 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_examview_pdf");
6497 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6500 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6501 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"enable_archiving");
6503 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6506 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6507 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"sign_submission");
6509 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6512 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6513 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"char_selector_availability");
6515 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6518 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6519 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"char_selector_definition");
6521 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6524 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6525 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"skill_service");
6527 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6530 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6531 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"result_tax_filters");
6533 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6536 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6537 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_grading_status");
6539 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6542 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6543 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"show_grading_mark");
6545 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6551 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6552 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"starting_time");
6553 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->starting_time, $matches);
6554 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6555 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6560 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6561 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"ending_time");
6562 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->ending_time, $matches);
6563 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
"P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
6564 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6569 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6570 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"activation_limited");
6572 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6575 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6576 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"activation_start_time");
6578 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6581 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6582 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"activation_end_time");
6584 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6587 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6588 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"activation_visibility");
6590 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6593 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6594 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"autosave");
6595 $a_xml_writer->xmlElement(
"fieldentry", NULL, (
int)$this->
getAutosave());
6596 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6599 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6600 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"autosave_ival");
6601 $a_xml_writer->xmlElement(
"fieldentry", NULL, (
int)$this->
getAutosaveIval());
6602 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6605 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6606 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"offer_question_hints");
6608 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6611 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6612 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"instant_feedback_specific");
6614 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6617 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6618 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"instant_feedback_answer_fixation");
6620 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6623 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6624 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"obligations_enabled");
6626 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6629 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6630 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"enable_processing_time");
6632 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6634 foreach ($this->mark_schema->mark_steps as $index => $mark)
6637 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6638 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"mark_step_$index");
6639 $a_xml_writer->xmlElement(
"fieldentry", NULL, sprintf(
6640 "<short>%s</short><official>%s</official><percentage>%.2f</percentage><passed>%d</passed>",
6641 $mark->getShortName(), $mark->getOfficialName(), $mark->getMinimumLevel(), $mark->getPassed()
6643 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6645 $a_xml_writer->xmlEndTag(
"qtimetadata");
6648 $a_xml_writer->xmlStartTag(
"objectives");
6650 $a_xml_writer->xmlEndTag(
"objectives");
6656 "solutionswitch" =>
"Yes" 6663 $a_xml_writer->xmlElement(
"assessmentcontrol", $attrs, NULL);
6668 $a_xml_writer->xmlStartTag(
"presentation_material");
6669 $a_xml_writer->xmlStartTag(
"flow_mat");
6671 $a_xml_writer->xmlEndTag(
"flow_mat");
6672 $a_xml_writer->xmlEndTag(
"presentation_material");
6678 $a_xml_writer->xmlElement(
"section", $attrs, NULL);
6679 $a_xml_writer->xmlEndTag(
"assessment");
6680 $a_xml_writer->xmlEndTag(
"questestinterop");
6682 $xml = $a_xml_writer->xmlDumpMem(FALSE);
6684 foreach ($this->questions as $question_id)
6687 $qti_question = $question->toXML(
false);
6688 $qti_question = preg_replace(
"/<questestinterop>/",
"", $qti_question);
6689 $qti_question = preg_replace(
"/<\/questestinterop>/",
"", $qti_question);
6690 if (strpos($xml,
"</section>") !==
false)
6692 $xml = str_replace(
"</section>",
"$qti_question</section>", $xml);
6696 $xml = str_replace(
"<section ident=\"1\"/>",
"<section ident=\"1\">\n$qti_question</section>", $xml);
6712 $this->mob_ids = array();
6713 $this->file_ids = array();
6716 $attrs[
"Type"] =
"Test";
6717 $a_xml_writer->xmlStartTag(
"ContentObject", $attrs);
6723 $expLog->write(date(
"[y-m-d H:i:s] ").
"Start Export Page Objects");
6724 $ilBench->start(
"ContentObjectExport",
"exportPageObjects");
6726 $ilBench->stop(
"ContentObjectExport",
"exportPageObjects");
6727 $expLog->write(date(
"[y-m-d H:i:s] ").
"Finished Export Page Objects");
6730 $expLog->write(date(
"[y-m-d H:i:s] ").
"Start Export Media Objects");
6731 $ilBench->start(
"ContentObjectExport",
"exportMediaObjects");
6733 $ilBench->stop(
"ContentObjectExport",
"exportMediaObjects");
6734 $expLog->write(date(
"[y-m-d H:i:s] ").
"Finished Export Media Objects");
6737 $expLog->write(date(
"[y-m-d H:i:s] ").
"Start Export File Items");
6738 $ilBench->start(
"ContentObjectExport",
"exportFileItems");
6740 $ilBench->stop(
"ContentObjectExport",
"exportFileItems");
6741 $expLog->write(date(
"[y-m-d H:i:s] ").
"Finished Export File Items");
6743 $a_xml_writer->xmlEndTag(
"ContentObject");
6754 include_once
"./Services/MetaData/classes/class.ilMD2XML.php";
6756 $md2xml->setExportMode(
true);
6757 $md2xml->startExport();
6758 $a_xml_writer->appendXML($md2xml->getXML());
6768 if ($a_tag ==
"Identifier" && $a_param ==
"Entry")
6770 include_once
"./Services/Utilities/classes/class.ilUtil.php";
6788 include_once
"./Modules/LearningModule/classes/class.ilLMPageObject.php";
6790 foreach ($this->questions as $question_id)
6792 $ilBench->start(
"ContentObjectExport",
"exportPageObject");
6793 $expLog->write(date(
"[y-m-d H:i:s] ").
"Page Object ".$question_id);
6796 $a_xml_writer->xmlStartTag(
"PageObject", $attrs);
6800 $ilBench->start(
"ContentObjectExport",
"exportPageObject_XML");
6801 include_once
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPage.php";
6803 $page_object->buildDom();
6804 $page_object->insertInstIntoIDs($a_inst);
6805 $mob_ids = $page_object->collectMediaObjects(
false);
6806 require_once
'Services/COPage/classes/class.ilPCFileList.php';
6808 $xml = $page_object->getXMLFromDom(
false,
false,
false,
"",
true);
6809 $xml = str_replace(
"&",
"&", $xml);
6810 $a_xml_writer->appendXML($xml);
6811 $page_object->freeDom();
6812 unset ($page_object);
6814 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_XML");
6817 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6819 foreach($mob_ids as $mob_id)
6821 $this->mob_ids[$mob_id] = $mob_id;
6823 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6826 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6828 foreach($file_ids as $file_id)
6830 $this->file_ids[$file_id] = $file_id;
6832 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6834 $a_xml_writer->xmlEndTag(
"PageObject");
6837 $ilBench->stop(
"ContentObjectExport",
"exportPageObject");
6851 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6853 foreach ($this->mob_ids as $mob_id)
6855 $expLog->write(date(
"[y-m-d H:i:s] ").
"Media Object ".$mob_id);
6859 $media_obj->exportXML($a_xml_writer, $a_inst);
6860 $media_obj->exportFiles($a_target_dir);
6872 include_once
"./Modules/File/classes/class.ilObjFile.php";
6874 foreach ($this->file_ids as $file_id)
6876 $expLog->write(date(
"[y-m-d H:i:s] ").
"File Item ".$file_id);
6877 $file_obj =
new ilObjFile($file_id,
false);
6878 $file_obj->export($a_target_dir);
6889 if (!is_array($this->import_mapping))
6895 return $this->import_mapping;
6912 return self::_getECTSGrade($passed_array, $reached_points, $max_points, $this->ects_grades[
"A"], $this->ects_grades[
"B"], $this->ects_grades[
"C"], $this->ects_grades[
"D"], $this->ects_grades[
"E"], $this->ects_fx);
6918 public static function _getECTSGrade($points_passed, $reached_points, $max_points, $a, $b, $c,
$d, $e, $fx)
6920 include_once
"./Modules/Test/classes/class.ilStatistics.php";
6923 $passed_statistics->setData($points_passed);
6924 $ects_percentiles = array
6926 "A" => $passed_statistics->quantile($a),
6927 "B" => $passed_statistics->quantile($b),
6928 "C" => $passed_statistics->quantile($c),
6929 "D" => $passed_statistics->quantile(
$d),
6930 "E" => $passed_statistics->quantile($e)
6932 if (count($points_passed) && ($reached_points >= $ects_percentiles[
"A"]))
6936 else if (count($points_passed) && ($reached_points >= $ects_percentiles[
"B"]))
6940 else if (count($points_passed) && ($reached_points >= $ects_percentiles[
"C"]))
6944 else if (count($points_passed) && ($reached_points >= $ects_percentiles[
"D"]))
6948 else if (count($points_passed) && ($reached_points >= $ects_percentiles[
"E"]))
6952 else if (strcmp($fx,
"") != 0)
6954 if ($max_points > 0)
6956 $percentage = ($reached_points / $max_points) * 100.0;
6957 if ($percentage < 0) $percentage = 0.0;
6963 if ($percentage >= $fx)
6983 return $this->mark_schema->checkMarks();
7011 global
$ilDB, $ilPluginAdmin, $tree;
7013 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
7033 if(preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getReportingDate(), $matches))
7035 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
7037 if($now < $epoch_time)
7075 $md_life =& $md->getLifecycle();
7078 if (strlen($a_author) == 0)
7081 $a_author = $ilUser->getFullname();
7084 $md_life =& $md->addLifecycle();
7086 $con =& $md_life->addContribute();
7087 $con->setRole(
"Author");
7089 $ent =& $con->addEntity();
7090 $ent->setEntity($a_author);
7102 parent::createMetaData();
7116 include_once
"./Services/MetaData/classes/class.ilMD.php";
7118 $md_life =& $md->getLifecycle();
7121 $ids =& $md_life->getContributeIds();
7122 foreach ($ids as
$id)
7124 $md_cont =& $md_life->getContribute($id);
7125 if (strcmp($md_cont->getRole(),
"Author") == 0)
7127 $entids =& $md_cont->getEntityIds();
7128 foreach ($entids as $entid)
7130 $md_ent =& $md_cont->getEntity($entid);
7131 array_push($author, $md_ent->getEntity());
7136 return join($author,
",");
7149 include_once
"./Services/MetaData/classes/class.ilMD.php";
7150 $md =&
new ilMD($obj_id, 0,
"tst");
7151 $md_life =& $md->getLifecycle();
7154 $ids =& $md_life->getContributeIds();
7155 foreach ($ids as
$id)
7157 $md_cont =& $md_life->getContribute($id);
7158 if (strcmp($md_cont->getRole(),
"Author") == 0)
7160 $entids =& $md_cont->getEntityIds();
7161 foreach ($entids as $entid)
7163 $md_ent =& $md_cont->getEntity($entid);
7164 array_push($author, $md_ent->getEntity());
7169 return join($author,
",");
7183 $result_array = array();
7193 $result_array[$obj_id] = $titles[
$ref_id];
7201 return $result_array;
7212 public function cloneObject($a_target_id,$a_copy_id = 0)
7220 $newObj = parent::cloneObject($a_target_id,$a_copy_id);
7221 $newObj->setTmpCopyWizardCopyId($a_copy_id);
7227 if(!$cp_options->isRootNode($this->getRefId()))
7229 $newObj->setOnline($this->
isOnline());
7254 $newObj->setKiosk($this->
getKiosk());
7305 $newObj->saveToDb();
7308 include_once
"./Services/Certificate/classes/class.ilCertificate.php";
7309 include_once
"./Modules/Test/classes/class.ilTestCertificateAdapter.php";
7312 $cert->cloneCertificate($newcert);
7314 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
7316 $testQuestionSetConfigFactory->getQuestionSetConfig()->cloneQuestionSetRelatedData($newObj);
7318 require_once
'Modules/Test/classes/class.ilTestSkillLevelThresholdList.php';
7320 $skillLevelThresholdList->setTestId($this->
getTestId());
7321 $skillLevelThresholdList->loadFromDb();
7322 $skillLevelThresholdList->cloneListForTest($newObj->getTestId());
7324 $newObj->saveToDb();
7325 $newObj->updateMetaData();
7327 include_once(
'./Services/Tracking/classes/class.ilLPObjSettings.php');
7329 $obj_settings->cloneSettings($newObj->getId());
7346 global $tree,
$ilDB, $ilPluginAdmin;
7349 $tree, $ilDB, $ilPluginAdmin, $this
7352 $questionSetConfig->loadFromDb();
7354 if( $questionSetConfig->isQuestionAmountConfigurationModePerPool() )
7356 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
7357 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilderWithAmountPerPool.php';
7358 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
7364 $sourcePoolDefinitionList->loadDefinitions();
7366 $num = $sourcePoolDefinitionList->getQuestionAmount();
7370 $num = $questionSetConfig->getQuestionAmountPerTest();
7375 $num = count($this->questions);
7393 if (strcmp($question_id,
"") != 0)
7395 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7398 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7413 $result = $ilDB->queryF(
"SELECT obj_fi FROM tst_tests WHERE test_id = %s",
7420 $object_id =
$row[
"obj_fi"];
7436 $result = $ilDB->queryF(
"SELECT tst_tests.obj_fi FROM tst_tests, tst_active WHERE tst_tests.test_id = tst_active.test_fi AND tst_active.active_id = %s",
7443 $object_id =
$row[
"obj_fi"];
7459 $result = $ilDB->queryF(
"SELECT test_id FROM tst_tests WHERE obj_fi = %s",
7466 $test_id =
$row[
"test_id"];
7484 if (($active_id) && ($question_id))
7488 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7491 $result = $ilDB->queryF(
"SELECT value1 FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
7492 array(
'integer',
'integer',
'integer'),
7493 array($active_id, $question_id,
$pass)
7518 $result = $ilDB->queryF(
"SELECT question_text FROM qpl_questions WHERE question_id = %s",
7541 $result_array = array();
7545 if (is_numeric($user_id))
7547 $result = $ilDB->queryF(
"SELECT tst_active.active_id, tst_active.tries, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7548 "tst_active.submitted test_finished, matriculation FROM usr_data, tst_invited_user " .
7549 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7550 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7552 array(
'text',
'text',
'text',
'integer',
'integer'),
7553 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId(), $user_id)
7558 $result = $ilDB->queryF(
"SELECT tst_active.active_id, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7559 "tst_active.submitted test_finished, matriculation FROM usr_data, tst_invited_user " .
7560 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7561 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7563 array(
'text',
'text',
'text',
'integer'),
7564 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7570 if (is_numeric($user_id))
7572 $result = $ilDB->queryF(
"SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7573 "tst_active.submitted test_finished, matriculation FROM usr_data, tst_invited_user " .
7574 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7575 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7577 array(
'integer',
'integer'),
7583 $result = $ilDB->queryF(
"SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7584 "tst_active.submitted test_finished, matriculation FROM usr_data, tst_invited_user " .
7585 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7586 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7593 $result_array = array();
7596 $result_array[
$row[
'usr_id']]=
$row;
7598 return $result_array;
7614 SELECT tst_active.active_id, 7616 tst_active.user_fi usr_id, 7620 tst_active.submitted test_finished, 7621 usr_data.matriculation, 7623 tst_active.lastindex 7626 ON tst_active.user_fi = usr_data.usr_id 7627 WHERE tst_active.test_fi = %s 7628 ORDER BY usr_data.lastname 7631 array(
'text',
'text',
'text',
'integer'),
7632 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7638 SELECT tst_active.active_id, 7640 tst_active.user_fi usr_id, 7644 tst_active.submitted test_finished, 7645 usr_data.matriculation, 7647 tst_active.lastindex 7650 ON tst_active.user_fi = usr_data.usr_id 7651 WHERE tst_active.test_fi = %s 7652 ORDER BY usr_data.lastname 7663 foreach (
$data as $index => $participant)
7665 if (strlen(trim($participant[
"firstname"].$participant[
"lastname"])) == 0)
7667 $data[$index][
"lastname"] = $this->lng->txt(
"deleted_user");
7677 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7679 if (count($scoring) == 0)
return array();
7682 $filtered_participants = array();
7683 foreach ($participants as $active_id => $participant)
7685 $qstType_IN_manScoreableQstTypes = $ilDB->in(
'qpl_questions.question_type_fi', $scoring,
false,
'integer');
7688 SELECT tst_test_result.manual 7690 FROM tst_test_result 7692 INNER JOIN qpl_questions 7693 ON tst_test_result.question_fi = qpl_questions.question_id 7695 WHERE tst_test_result.active_fi = %s 7696 AND $qstType_IN_manScoreableQstTypes 7700 $queryString, array(
"integer"), array($active_id)
7710 if ($participant->active) $filtered_participants[$active_id] = $participant;
7713 if (!$participant->active) $filtered_participants[$active_id] = $participant;
7716 $filtered_participants[$active_id] = $participant;
7731 $assessmentSetting =
new ilSetting(
"assessment");
7732 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7733 if ($manscoring_done) $filtered_participants[$active_id] = $participant;
7745 $assessmentSetting =
new ilSetting(
"assessment");
7746 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7747 if (!$manscoring_done) $filtered_participants[$active_id] = $participant;
7755 if (
$row[
"manual"]) $found++;
7757 if (($found > 0) && ($found < $count)) $filtered_participants[$active_id] = $participant;
7760 $filtered_participants[$active_id] = $participant;
7765 return $filtered_participants;
7779 if (!is_array($ids) || count($ids) ==0)
return array();
7783 $result = $ilDB->queryF(
"SELECT usr_id, %s login, %s lastname, %s firstname, client_ip clientip FROM usr_data WHERE " . $ilDB->in(
'usr_id', $ids,
false,
'integer') .
" ORDER BY login",
7784 array(
'text',
'text',
'text'),
7785 array(
"", $this->lng->txt(
"anonymous"),
"")
7790 $result = $ilDB->query(
"SELECT usr_id, login, lastname, firstname, client_ip clientip FROM usr_data WHERE " . $ilDB->in(
'usr_id', $ids,
false,
'integer') .
" ORDER BY login");
7793 $result_array = array();
7796 $result_array[
$row[
"usr_id"]]=
$row;
7798 return $result_array;
7803 if (!is_array($ids) || count($ids) ==0)
return array();
7815 if (!is_array($ids) || count($ids) ==0)
return array();
7817 foreach ($ids as $obj_id)
7833 include_once
"./Modules/Group/classes/class.ilObjGroup.php";
7835 $members = $group->getGroupMemberIds();
7836 include_once
'./Services/User/classes/class.ilObjUser.php';
7837 foreach ($members as $user_id)
7852 $members = $rbacreview->assignedUsers($role_id,
"usr_id");
7853 include_once
'./Services/User/classes/class.ilObjUser.php';
7854 foreach ($members as $user_id)
7872 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7873 array(
'integer',
'integer'),
7888 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7889 array(
'integer',
'integer'),
7892 $affectedRows = $ilDB->manipulateF(
"INSERT INTO tst_invited_user (test_fi, user_fi, clientip, tstamp) VALUES (%s, %s, %s, %s)",
7893 array(
'integer',
'integer',
'text',
'integer'),
7894 array($this->
getTestId(), $user_id, (strlen($client_ip)) ? $client_ip : NULL, time())
7903 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_invited_user SET clientip = %s, tstamp = %s WHERE test_fi=%s and user_fi=%s",
7904 array(
'text',
'integer',
'integer',
'integer'),
7905 array((strlen($client_ip)) ? $client_ip : NULL, time(), $this->
getTestId(), $user_id)
7917 if (is_numeric($question_fi))
7919 $result = $ilDB->queryF(
"SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s AND question_fi=%s",
7920 array(
'integer',
'integer'),
7921 array($active_id, $question_fi)
7926 $result = $ilDB->queryF(
"SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s",
7931 $result_array = array();
7934 $result_array[
$row[
"question_fi"]]=
$row;
7936 return $result_array;
7948 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_qst_solved WHERE active_fi = %s AND question_fi = %s",
7949 array(
'integer',
'integer'),
7950 array($active_id, $question_id)
7952 $affectedRows = $ilDB->manipulateF(
"INSERT INTO tst_qst_solved (solved, question_fi, active_fi) VALUES (%s, %s, %s)",
7953 array(
'integer',
'integer',
'integer'),
7954 array($value, $question_id, $active_id)
7965 $result = $ilDB->queryF(
"SELECT submitted FROM tst_active WHERE active_id=%s AND submitted=%s",
7966 array(
'integer',
'integer'),
7967 array($active_id, 1)
7969 return $result->numRows() == 1;
7980 if (!is_numeric($user_id))
7981 $user_id = $ilUser->getId();
7983 $result = $ilDB->queryF(
"SELECT submitted FROM tst_active WHERE test_fi=%s AND user_fi=%s AND submitted=%s",
7984 array(
'integer',
'integer',
'integer'),
7987 return $result->numRows() == 1;
8022 "user_id" => $this->lng->txt(
"user_id"),
8023 "matriculation" => $this->lng->txt(
"matriculation"),
8024 "lastname" => $this->lng->txt(
"lastname"),
8025 "firstname" => $this->lng->txt(
"firstname"),
8026 "login" =>$this->lng->txt(
"login"),
8027 "reached_points" => $this->lng->txt(
"tst_reached_points"),
8028 "max_points" => $this->lng->txt(
"tst_maximum_points"),
8029 "percent_value" => $this->lng->txt(
"tst_percent_solved"),
8030 "mark" => $this->lng->txt(
"tst_mark"),
8031 "ects" => $this->lng->txt(
"ects_grade")
8034 if (count($participants))
8040 foreach ($participants as $active_id => $user_rec)
8042 $mark = $ects_mark =
'';
8044 $reached_points = 0;
8046 foreach ($this->questions as $value)
8049 if (is_object($question))
8051 $max_points += $question->getMaximumPoints();
8052 $reached_points += $question->getReachedPoints($active_id);
8055 if ($max_points > 0)
8057 $percentvalue = $reached_points / $max_points;
8058 if ($percentvalue < 0) $percentvalue = 0.0;
8064 $mark_obj = $this->mark_schema->getMatchingMark($percentvalue * 100);
8068 $mark = $mark_obj->getOfficialName();
8071 $ects_mark = $this->
getECTSGrade($passed_array, $reached_points, $max_points);
8076 $user_rec[
'firstname'] =
"";
8077 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
8080 "user_id"=>$user_rec[
'usr_id'],
8081 "matriculation" => $user_rec[
'matriculation'],
8082 "lastname" => $user_rec[
'lastname'],
8083 "firstname" => $user_rec[
'firstname'],
8084 "login"=>$user_rec[
'login'],
8085 "reached_points" => $reached_points,
8086 "max_points" => $max_points,
8087 "percent_value" => $percentvalue,
8089 "ects" => $ects_mark
8109 $resultarray = array();
8110 foreach (
$row as $rowindex => $entry)
8117 if (strpos($entry,
"\"") !== FALSE)
8119 $entry = str_replace(
"\"",
"\"\"", $entry);
8127 $entry = str_replace(chr(13).chr(10), chr(10), $entry);
8131 $entry =
"\"" . $entry .
"\"";
8134 $resultarray[$rowindex] = $entry;
8136 return $resultarray;
8150 $result = $ilDB->queryF(
"SELECT tries FROM tst_active WHERE active_id = %s",
8157 return $row[
"tries"];
8177 $result = $ilDB->queryF(
"SELECT MAX(pass) maxpass FROM tst_pass_result WHERE active_fi = %s",
8184 $max =
$row[
"maxpass"];
8207 $result = $ilDB->queryF(
"SELECT * FROM tst_pass_result WHERE active_fi = %s",
8217 if(
$row[
"maxpoints"] > 0)
8219 $factor =
$row[
"points"] /
$row[
"maxpoints"];
8226 if($factor > $bestfactor)
8229 $bestfactor = $factor;
8232 if (is_array($bestrow))
8234 return $bestrow[
"pass"];
8257 $counted_pass = NULL;
8266 return $counted_pass;
8282 global $tree,
$ilDB,
$lng, $ilPluginAdmin;
8284 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
8286 $testSession = $testSessionFactory->getSession($active_id);
8288 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
8290 $testSequence = $testSequenceFactory->getSequenceByTestSession($testSession);
8292 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
8294 $dynamicQuestionSetConfig->loadFromDb();
8296 $testSequence->loadFromDb($dynamicQuestionSetConfig);
8299 return $testSequence->getTrackedQuestionCount();
8306 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
8308 foreach ($this->questions as $value)
8312 $workedthrough += 1;
8315 return $workedthrough;
8337 SELECT tst_pass_result.tstamp pass_res_tstamp, 8338 tst_test_result.tstamp quest_res_tstamp 8340 FROM tst_pass_result 8342 LEFT JOIN tst_test_result 8343 ON tst_test_result.active_fi = tst_pass_result.active_fi 8344 AND tst_test_result.pass = tst_pass_result.pass 8346 WHERE tst_pass_result.active_fi = %s 8347 AND tst_pass_result.pass = %s 8349 ORDER BY tst_test_result.tstamp DESC 8353 array(
'integer',
'integer'),
8354 array($active_id,
$pass)
8359 if(
$row[
'qres_tstamp'] )
8361 return $row[
'quest_res_tstamp'];
8364 return $row[
'pass_res_tstamp'];
8381 "executable" =>
true,
8382 "errormessage" =>
"" 8386 $result[
"executable"] =
false;
8392 $result[
"executable"] =
false;
8415 $testSession->increasePass();
8416 $testSession->setLastSequence(0);
8417 $testSession->saveToDb();
8421 $result[
"executable"] =
false;
8422 $result[
"errormessage"] = $this->lng->txt(
"detail_max_processing_time_reached");
8432 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8434 $testPassesSelector->setActiveId($active_id);
8435 $testPassesSelector->setLastFinishedPass($testSession->getLastFinishedPass());
8437 $closedPasses = $testPassesSelector->getClosedPasses();
8441 $result[
"executable"] =
false;
8442 $result[
"errormessage"] = $this->lng->txt(
"maximum_nr_of_tries_reached");
8464 case self::SCORE_REPORTING_IMMIDIATLY:
8465 case self::SCORE_REPORTING_FINISHED:
8469 case self::SCORE_REPORTING_DATE:
8476 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getReportingDate(), $matches))
8478 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
8480 if ($now < $epoch_time)
8494 $active_id = $testSession->getActiveId();
8499 $notimeleft = FALSE;
8528 if ($active_id < 1)
return FALSE;
8533 $result = $ilDB->queryF(
"SELECT tst_times.started FROM tst_times WHERE tst_times.active_fi = %s AND tst_times.pass = %s ORDER BY tst_times.started",
8534 array(
'integer',
'integer'),
8535 array($active_id,
$pass)
8540 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches))
8542 return mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
8590 questtypes.type_tag, 8592 tstquest.obligatory, 8593 origquest.obj_fi orig_obj_fi 8595 FROM qpl_questions questions 8597 INNER JOIN qpl_qst_type questtypes 8598 ON questtypes.question_type_id = questions.question_type_fi 8600 INNER JOIN tst_test_question tstquest 8601 ON tstquest.question_fi = questions.question_id 8603 LEFT JOIN qpl_questions origquest 8604 ON origquest.question_id = questions.original_id 8606 WHERE tstquest.test_fi = %s 8608 ORDER BY tstquest.sequence 8611 $query_result = $ilDB->queryF(
8615 $questions = array();
8617 while (
$row = $ilDB->fetchAssoc($query_result))
8621 $question[
'obligationPossible'] = self::isQuestionObligationPossible(
$row[
'question_id']);
8623 $questions[] = $question;
8632 public function getPotentialRandomTestQuestions()
8641 questtypes.type_tag, 8642 origquest.obj_fi orig_obj_fi 8644 FROM qpl_questions questions 8646 INNER JOIN qpl_qst_type questtypes 8647 ON questtypes.question_type_id = questions.question_type_fi 8649 INNER JOIN tst_rnd_cpy tstquest 8650 ON tstquest.qst_fi = questions.question_id 8652 LEFT JOIN qpl_questions origquest 8653 ON origquest.question_id = questions.original_id 8655 WHERE tstquest.tst_fi = %s 8658 $query_result = $ilDB->queryF(
8662 $questions = array();
8664 while (
$row = $ilDB->fetchAssoc($query_result))
8668 $question[
'obligationPossible'] = self::isQuestionObligationPossible(
$row[
'question_id']);
8670 $questions[] = $question;
8684 return ($this->shuffle_questions) ? 1 : 0;
8695 $this->shuffle_questions = ($a_shuffle) ? 1 : 0;
8712 return ($this->show_summary) ? $this->show_summary : 0;
8729 $this->show_summary = $a_value;
8740 if (($this->show_summary & 1) > 0)
8760 $this->show_summary = 1;
8764 $this->show_summary = 0;
8776 if (($this->show_summary & 2) > 0)
8796 $this->show_summary = $this->show_summary | 2;
8802 $this->show_summary = $this->show_summary ^ 2;
8815 if (($this->show_summary & 4) > 0)
8835 $this->show_summary = $this->show_summary | 4;
8841 $this->show_summary = $this->show_summary ^ 4;
8854 if (($this->show_summary & 8) > 0)
8874 $this->show_summary = $this->show_summary | 8;
8880 $this->show_summary = $this->show_summary ^ 8;
8893 return ($this->results_presentation) ? $this->results_presentation : 0;
8904 if (($this->results_presentation & 1) > 0)
8922 if (($this->results_presentation & 2) > 0)
8940 if (($this->results_presentation & 4) > 0)
8958 if (($this->results_presentation & 8) > 0)
8976 if (($this->results_presentation & 16) > 0)
8994 if (($this->results_presentation & 32) > 0)
9010 if (($this->results_presentation & 64) > 0)
9026 if(($this->results_presentation & 128) > 0)
9044 $this->results_presentation = $a_results_presentation;
9059 $this->results_presentation = $this->results_presentation | 1;
9065 $this->results_presentation = $this->results_presentation ^ 1;
9080 $this->results_presentation = $this->results_presentation | 2;
9086 $this->results_presentation = $this->results_presentation ^ 2;
9112 $this->results_presentation = $this->results_presentation | 4;
9118 $this->results_presentation = $this->results_presentation ^ 4;
9133 $this->results_presentation = $this->results_presentation | 8;
9139 $this->results_presentation = $this->results_presentation ^ 8;
9154 $this->results_presentation = $this->results_presentation | 16;
9160 $this->results_presentation = $this->results_presentation ^ 16;
9175 $this->results_presentation = $this->results_presentation | 32;
9181 $this->results_presentation = $this->results_presentation ^ 32;
9196 $this->results_presentation = $this->results_presentation | 64;
9202 $this->results_presentation = $this->results_presentation ^ 64;
9216 $this->results_presentation = $this->results_presentation | 128;
9222 $this->results_presentation = $this->results_presentation ^ 128;
9233 $result = $ilDB->queryF(
"SELECT user_fi FROM tst_active WHERE active_id = %s",
9240 return $row[
"user_fi"];
9266 return ($this->allowedUsers) ? $this->allowedUsers : 0;
9271 $this->allowedUsers = $a_allowed_users;
9276 return ($this->allowedUsersTimeGap) ? $this->allowedUsersTimeGap : 0;
9281 $this->allowedUsersTimeGap = $a_allowed_users_time_gap;
9290 if (($nr_of_users > 0) && ($time_gap > 0))
9293 $time_border = $now - $time_gap;
9294 $str_time_border = strftime(
"%Y%m%d%H%M%S", $time_border);
9296 SELECT DISTINCT tst_times.active_fi 9298 INNER JOIN tst_active 9299 ON tst_times.active_fi = tst_active.active_id 9301 tst_times.pass > tst_active.last_finished_pass OR tst_active.last_finished_pass IS NULL 9303 WHERE tst_times.tstamp > %s 9304 AND tst_active.test_fi = %s 9307 if (
$result->numRows() >= $nr_of_users)
9309 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
9328 $result = $ilDB->queryF(
"SELECT finished FROM tst_times WHERE active_fi = %s ORDER BY finished DESC",
9335 return $row[
"finished"];
9349 if (preg_match(
"/<[^>]*?>/", $a_text))
9369 for ($i = 0; $i < $a_material->getMaterialCount(); $i++)
9371 $material = $a_material->getMaterial($i);
9372 if (strcmp($material[
"type"],
"mattext") == 0)
9374 $result .= $material[
"material"]->getContent();
9376 if (strcmp($material[
"type"],
"matimage") == 0)
9378 $matimage = $material[
"material"];
9379 if (preg_match(
"/(il_([0-9]+)_mob_([0-9]+))/", $matimage->getLabel(), $matches))
9382 if (!is_array(
$_SESSION[
"import_mob_xhtml"]))
$_SESSION[
"import_mob_xhtml"] = array();
9383 array_push(
$_SESSION[
"import_mob_xhtml"], array(
"mob" => $matimage->getLabel(),
"uri" => $matimage->getUri()));
9388 $ilLog->write(print_r(
$_SESSION[
"import_mob_xhtml"],
true));
9402 include_once
"./Services/RTE/classes/class.ilRTE.php";
9403 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
9405 $a_xml_writer->xmlStartTag(
"material");
9407 "texttype" =>
"text/plain" 9409 if ($this->
isHTML($a_material))
9411 $attrs[
"texttype"] =
"text/xhtml";
9416 foreach (
$mobs as $mob)
9418 $moblabel =
"il_" . IL_INST_ID .
"_mob_" . $mob;
9419 if (strpos($a_material,
"mm_$mob") !== FALSE)
9425 "label" => $moblabel,
9426 "uri" =>
"objects/" .
"il_" . IL_INST_ID .
"_mob_" . $mob .
"/" . $mob_obj->getTitle()
9429 $a_xml_writer->xmlElement(
"matimage", $imgattrs, NULL);
9432 $a_xml_writer->xmlEndTag(
"material");
9443 include_once
"./Services/Utilities/classes/class.ilUtil.php";
9457 $affectedRows = $ilDB->manipulateF(
"UPDATE tst_tests SET certificate_visibility = %s, tstamp = %s WHERE test_id = %s",
9458 array(
'text',
'integer',
'integer'),
9459 array($a_value, time(), $this->
getTestId())
9471 return (strlen($this->certificate_visibility)) ? $this->certificate_visibility : 0;
9482 $this->certificate_visibility = $a_value;
9493 return ($this->anonymity) ? 1 : 0;
9507 $this->anonymity = 1;
9510 $this->anonymity = 0;
9523 return ($this->show_cancel) ? 1 : 0;
9537 $this->show_cancel = 1;
9540 $this->show_cancel = 0;
9553 return ($this->show_marker) ? 1 : 0;
9567 $this->show_marker = 1;
9570 $this->show_marker = 0;
9583 return ($this->fixed_participants) ? 1 : 0;
9597 $this->fixed_participants = 1;
9600 $this->fixed_participants = 0;
9616 $result = $ilDB->queryF(
"SELECT anonymity FROM tst_tests WHERE obj_fi = %s",
9622 return $row[
'anonymity'];
9638 SELECT tst_tests.question_set_type 9640 INNER JOIN tst_tests 9641 ON tst_active.test_fi = tst_tests.test_id 9642 WHERE tst_active.active_id = %s 9645 $res = $ilDB->queryF(
$query, array(
'integer'), array($active_id) );
9647 while(
$row = $ilDB->fetchAssoc(
$res))
9649 return $row[
'question_set_type'];
9665 throw new Exception(__METHOD__.
' is deprecated ... use ilObjTest::lookupQuestionSetTypeByActiveId() instead!');
9669 $result = $ilDB->queryF(
"SELECT tst_tests.random_test FROM tst_tests, tst_active WHERE tst_active.active_id = %s AND tst_active.test_fi = tst_tests.test_id",
9675 return $row[
'random_test'];
9694 return $this->lng->txt(
"anonymous") . $suffix;
9698 include_once
'./Services/User/classes/class.ilObjUser.php';
9700 if (strlen($uname[
"firstname"].$uname[
"lastname"]) == 0) $uname[
"firstname"] = $this->lng->txt(
"deleted_user");
9703 return trim($uname[
"lastname"] .
", " . $uname[
"firstname"]) . $suffix;
9707 return trim($uname[
"firstname"] .
" " . $uname[
"lastname"]) . $suffix;
9723 return $this->lng->txt(
"tst_start_test");
9725 $active_pass = $this->
_getPass($active_id);
9729 if ($active_pass == 0)
9731 return $this->lng->txt(
"tst_start_test");
9735 return $this->lng->txt(
"tst_start_new_test_pass");
9740 return $this->lng->txt(
"tst_resume_test");
9749 public function getAvailableDefaults()
9758 "SELECT * FROM tst_test_defaults WHERE user_fi = %s ORDER BY name ASC",
9760 array($ilUser->getId())
9762 $defaults = array();
9765 $defaults[
$row[
"test_defaults_id"]] =
$row;
9779 return self::_getTestDefaults($test_defaults_id);
9786 $result = $ilDB->queryF(
"SELECT * FROM tst_test_defaults WHERE test_defaults_id = %s",
9788 array($test_defaults_id)
9810 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_test_defaults WHERE test_defaults_id = %s",
9812 array($test_default_id)
9826 $testsettings = array(
9918 $next_id = $ilDB->nextId(
'tst_test_defaults');
9920 'tst_test_defaults',
9922 'test_defaults_id' => array(
'integer', $next_id),
9923 'name' => array(
'text', $a_name),
9924 'user_fi' => array(
'integer', $ilUser->getId()),
9925 'defaults' => array(
'clob', serialize($testsettings)),
9926 'marks' => array(
'clob', serialize($this->mark_schema)),
9927 'tstamp' => array(
'integer', time())
9941 $testsettings = unserialize($test_defaults[
"defaults"]);
9942 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
9943 $this->mark_schema = unserialize($test_defaults[
"marks"]);
9977 $this->
setKiosk($testsettings[
"Kiosk"]);
9981 $this->
setECTSFX($testsettings[
"ECTSFX"]);
9983 if( isset($testsettings[
"isRandomTest"]) )
9985 if( $testsettings[
"isRandomTest"] )
9994 elseif( isset($testsettings[
"questionSetType"]) )
10017 if( isset($testsettings[
'examid_in_kiosk']) )
10025 if( isset($testsettings[
'show_exam_id']) )
10080 if (extension_loaded(
"tidy"))
10084 "output-xml" =>
true,
10085 "numeric-entities" =>
true 10087 $tidy =
new tidy();
10088 $tidy->parseString($print_output, $config,
'utf8');
10089 $tidy->cleanRepair();
10090 $print_output = tidy_get_output($tidy);
10091 $print_output = preg_replace(
"/^.*?(<html)/",
"\\1", $print_output);
10095 $print_output = str_replace(
" ",
" ", $print_output);
10096 $print_output = str_replace(
"⊗",
"X", $print_output);
10098 $xsl = file_get_contents(
"./Modules/Test/xml/question2fo.xsl");
10101 $xsl = str_replace(
10102 'font-family="Helvetica, unifont"',
10103 'font-family="'.
$GLOBALS[
'ilSetting']->
get(
'rpc_pdf_font',
'Helvetica, unifont').
'"',
10107 $args = array(
'/_xml' => $print_output,
'/_xsl' => $xsl );
10110 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl", NULL, $args,
$params);
10124 $content = preg_replace(
"/href=\".*?\"/",
"", $content);
10125 $printbody =
new ilTemplate(
"tpl.il_as_tst_print_body.html", TRUE, TRUE,
"Modules/Test");
10127 $printbody->setVariable(
"ADM_CONTENT", $content);
10128 $printbody->setCurrentBlock(
"css_file");
10130 $printbody->parseCurrentBlock();
10131 $printbody->setCurrentBlock(
"css_file");
10133 $printbody->parseCurrentBlock();
10134 $printoutput = $printbody->get();
10135 $html = str_replace(
"href=\"./",
"href=\"" . ILIAS_HTTP_PATH .
"/", $printoutput);
10136 $html = preg_replace(
"/<div id=\"dontprint\">.*?<\\/div>/ims",
"",
$html);
10137 if (extension_loaded(
"tidy"))
10141 "output-xml" =>
true,
10142 "numeric-entities" =>
true 10144 $tidy =
new tidy();
10145 $tidy->parseString(
$html, $config,
'utf8');
10146 $tidy->cleanRepair();
10147 $html = tidy_get_output($tidy);
10148 $html = preg_replace(
"/^.*?(<html)/",
"\\1",
$html);
10152 $html = str_replace(
" ",
" ",
$html);
10153 $html = str_replace(
"⊗",
"X",
$html);
10155 $html = preg_replace(
"/src=\".\\//ims",
"src=\"" . ILIAS_HTTP_PATH .
"/",
$html);
10169 include_once
"./Services/Utilities/classes/class.ilUtil.php";
10171 $fp = fopen($fo_file,
"w"); fwrite($fp, $fo); fclose($fp);
10173 include_once
'./Services/WebServices/RPC/classes/class.ilRpcClientFactory.php';
10183 $ilLog->write(__METHOD__.
': '.$e->getMessage());
10188 $ilLog->write(__METHOD__.
': '.$e->getMessage());
10215 $result = $ilDB->queryF(
"SELECT feedback FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10216 array(
'integer',
'integer',
'integer'),
10217 array($active_id, $question_id,
$pass)
10222 include_once(
"./Services/RTE/classes/class.ilRTE.php");
10238 function saveManualFeedback($active_id, $question_id,
$pass, $feedback)
10242 $affectedRows = $ilDB->manipulateF(
"DELETE FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10243 array(
'integer',
'integer',
'integer'),
10244 array($active_id, $question_id,
$pass)
10247 if (strlen($feedback))
10249 $next_id = $ilDB->nextId(
'tst_manual_fb');
10251 $result = $ilDB->insert(
'tst_manual_fb', array(
10252 'manual_feedback_id' => array(
'integer', $next_id ),
10253 'active_fi' => array(
'integer', $active_id ),
10254 'question_fi' => array(
'integer', $question_id ),
10255 'pass' => array(
'integer',
$pass),
10257 'tstamp' => array(
'integer', time() ),
10260 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
10264 include_once
"./Modules/Test/classes/class.ilObjTestAccess.php";
10266 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
10273 $ilias->raiseError(
$result->getMessage());
10301 include_once
"./Modules/Test/classes/class.ilTestSequence.php";
10312 $this->test_id = $a_id;
10326 if (count($participants))
10328 foreach ($participants as $active_id => $user_rec)
10331 $reached_points = 0;
10333 foreach ($this->questions as $value)
10336 if (is_object($question))
10338 $max_points += $question->getMaximumPoints();
10339 $reached_points += $question->getReachedPoints($active_id);
10340 if ($max_points > 0)
10342 $percentvalue = $reached_points / $max_points;
10343 if ($percentvalue < 0) $percentvalue = 0.0;
10351 $user_rec[
'firstname'] =
"";
10352 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
10355 "user_id"=>$user_rec[
'usr_id'],
10356 "matriculation" => $user_rec[
'matriculation'],
10357 "lastname" => $user_rec[
'lastname'],
10358 "firstname" => $user_rec[
'firstname'],
10359 "login"=>$user_rec[
'login'],
10360 "question_id" => $question->getId(),
10361 "question_title" => $question->getTitle(),
10362 "reached_points" => $reached_points,
10363 "max_points" => $max_points
10380 $result = $ilDB->queryF(
"SELECT t.obj_fi obj_id FROM tst_test_question q, tst_tests t WHERE q.test_fi = t.test_id AND q.question_fi = %s",
10384 $rec = $ilDB->fetchAssoc(
$result);
10385 return $rec[
"obj_id"];
10396 global $ilPluginAdmin;
10397 if ($ilPluginAdmin->isActive(
IL_COMP_MODULE,
"TestQuestionPool",
"qst", $a_pname))
10411 $result = $ilDB->queryF(
"SELECT passed FROM tst_result_cache WHERE active_fi = %s",
10418 return $row[
'passed'];
10423 $result_array =& $this->
getTestResult($active_id, $counted_pass);
10424 return $result_array[
"test"][
"passed"];
10437 include_once
"./Services/Certificate/classes/class.ilCertificate.php";
10438 include_once
"./Modules/Test/classes/class.ilTestCertificateAdapter.php";
10440 if ($cert->isComplete())
10482 public function getParticipantsForTestAndQuestion($test_id, $question_id)
10488 SELECT tst_test_result.active_fi, tst_test_result.question_fi, tst_test_result.pass 10489 FROM tst_test_result 10490 INNER JOIN tst_active ON tst_active.active_id = tst_test_result.active_fi AND tst_active.test_fi = %s 10491 INNER JOIN qpl_questions ON qpl_questions.question_id = tst_test_result.question_fi 10492 LEFT JOIN usr_data ON usr_data.usr_id = tst_active.user_fi 10493 WHERE tst_test_result.question_fi = %s 10494 ORDER BY usr_data.lastname ASC, usr_data.firstname ASC 10498 array(
'integer',
'integer'),
10499 array($test_id, $question_id)
10501 $foundusers = array();
10505 if (!array_key_exists(
$row[
"active_fi"], $foundusers))
10507 $foundusers[
$row[
"active_fi"]] = array();
10509 array_push($foundusers[
$row[
"active_fi"]], array(
"pass" => $row[
"pass"],
"qid" => $row[
"question_fi"]));
10511 return $foundusers;
10522 $foundParticipants =&
$data->getParticipants();
10523 $results = array(
"overview" => array(),
"questions" => array());
10524 if (count($foundParticipants))
10526 $results[
"overview"][$this->lng->txt(
"tst_eval_total_persons")] = count($foundParticipants);
10528 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished")] = $total_finished;
10530 $diff_seconds = $average_time;
10531 $diff_hours = floor($diff_seconds/3600);
10532 $diff_seconds -= $diff_hours * 3600;
10533 $diff_minutes = floor($diff_seconds/60);
10534 $diff_seconds -= $diff_minutes * 60;
10535 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10537 $total_passed_reached = 0;
10538 $total_passed_max = 0;
10539 $total_passed_time = 0;
10540 foreach ($foundParticipants as $userdata)
10542 if ($userdata->getPassed())
10545 $total_passed_reached += $userdata->getReached();
10546 $total_passed_max += $userdata->getMaxpoints();
10547 $total_passed_time += $userdata->getTimeOfWork();
10550 $average_passed_reached = $total_passed ? $total_passed_reached / $total_passed : 0;
10551 $average_passed_max = $total_passed ? $total_passed_max / $total_passed : 0;
10552 $average_passed_time = $total_passed ? $total_passed_time / $total_passed : 0;
10553 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed")] = $total_passed;
10554 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed_average_points")] = sprintf(
"%2.2f", $average_passed_reached) .
" " . strtolower($this->lng->txt(
"of")) .
" " . sprintf(
"%2.2f", $average_passed_max);
10555 $average_time = $average_passed_time;
10556 $diff_seconds = $average_time;
10557 $diff_hours = floor($diff_seconds/3600);
10558 $diff_seconds -= $diff_hours * 3600;
10559 $diff_minutes = floor($diff_seconds/60);
10560 $diff_seconds -= $diff_minutes * 60;
10561 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10564 foreach (
$data->getQuestionTitles() as $question_id => $question_title)
10569 foreach ($foundParticipants as $userdata)
10571 for ($i = 0; $i <= $userdata->getLastPass(); $i++)
10573 if (is_object($userdata->getPass($i)))
10575 $question =& $userdata->getPass($i)->getAnsweredQuestionByQuestionId($question_id);
10576 if (is_array($question))
10579 $reached += $question[
"reached"];
10580 $max += $question[
"points"];
10585 $percent = $max ? $reached/$max * 100.0 : 0;
10587 $results[
"questions"][$question_id] = array(
10589 sprintf(
"%.2f", $answered ? $reached / $answered : 0) .
" " . strtolower($this->lng->txt(
"of")) .
" " . sprintf(
"%.2f", $answered ? $max / $answered : 0),
10590 sprintf(
"%.2f", $percent) .
"%",
10592 sprintf(
"%.2f", $answered ? $reached / $answered : 0),
10593 sprintf(
"%.2f", $answered ? $max / $answered : 0),
10605 include_once(
"./Modules/Test/classes/class.ilTestExport.php");
10607 return $test_exp->buildExportFile();
10625 $this->mailnotification = $a_notification;
10630 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10635 $mail->sendSimpleNotification($owner_id, $this->
getTitle(), $usr_data);
10645 include_once
"./Modules/Test/classes/class.ilObjTestGUI.php";
10646 include_once
"./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
10648 return $table_gui->getSelectedColumns();
10653 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10659 include_once
"./Modules/Test/classes/class.ilTestExport.php";
10661 $file = $exportObj->exportToExcel($deliver = FALSE,
'active_id', $active_id, $passedonly = FALSE);
10662 include_once
"./Services/Mail/classes/class.ilFileDataMail.php";
10664 $fd->copyAttachmentFile(
$file,
"result_" . $active_id .
".xls");
10665 $file_names[] =
"result_" . $active_id .
".xls";
10667 $mail->sendAdvancedNotification($owner_id, $this->
getTitle(), $usr_data, $file_names);
10669 if(count($file_names))
10671 $fd->unlinkFiles($file_names);
10682 $query =
"SELECT usr_id FROM usr_data";
10686 $activequery = sprintf(
"SELECT user_fi FROM tst_active WHERE test_fi = %s AND user_fi = %s",
10687 $ilDB->quote($this->getTestId()),
10688 $ilDB->quote(
$data[
'usr_id'])
10690 $activeresult = $ilDB->query($activequery);
10691 if ($activeresult->numRows() == 0)
10693 $user_id =
$data[
'usr_id'];
10694 if ($user_id != 13)
10696 include_once
"./Modules/Test/classes/class.ilTestSession.php";
10698 $testSession->setRefId($this->
getRefId());
10699 $testSession->setTestId($this->
getTestId());
10700 $testSession->setUserId($user_id);
10701 $testSession->saveToDb();
10703 $nr_of_passes = rand(1, $passes);
10704 $active_id = $testSession->getActiveId();
10707 include_once
"./Modules/Test/classes/class.ilTestSequence.php";
10709 $testSequence->loadFromDb();
10710 $testSequence->loadQuestions();
10711 if (!$testSequence->hasSequence())
10714 $testSequence->saveToDb();
10716 for ($seq = 1; $seq <= count($this->questions); $seq++)
10718 $question_id = $testSequence->getQuestionForSequence($seq);
10720 $assSettings =
new ilSetting(
'assessment');
10721 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
10723 $processLockerFactory->setQuestionId($objQuestion->getId());
10724 $processLockerFactory->setUserId($testSession->getUserId());
10725 include_once (
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
10727 $objQuestion->setProcessLocker($processLockerFactory->getLocker());
10728 $objQuestion->createRandomSolution($testSession->getActiveId(),
$pass);
10730 $testSession->increasePass();
10731 $testSession->setLastSequence(0);
10732 $testSession->setLastFinishedPass(
$pass);
10733 $testSession->setSubmitted(1);
10734 $testSession->setSubmittedTimestamp(date(
'Y-m-d H:i:s'));
10735 $testSession->saveToDb();
10738 if ($number == 0)
return;
10750 FROM tst_result_cache 10751 WHERE active_fi = %s 10755 $query, array(
'integer'), array($active_id)
10760 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
10766 FROM tst_result_cache 10767 WHERE active_fi = %s 10771 $query, array(
'integer'), array($active_id)
10783 if ($this->mailnottype == 1)
10797 $this->mailnottype = 1;
10801 $this->mailnottype = 0;
10807 if ($this->exportsettings)
10821 $this->exportsettings = $a_settings;
10825 $this->exportsettings = 0;
10831 if (($this->exportsettings & 1) > 0)
10845 $this->exportsettings = $this->exportsettings | 1;
10851 $this->exportsettings = $this->exportsettings ^ 1;
10857 return $this->enabled_view_mode;
10861 $this->enabled_view_mode = $mode;
10873 $new_array = array();
10876 $query =
'SELECT question_fi FROM tst_test_question WHERE test_fi = %s';
10877 $types = array(
'integer');
10880 $new_question_id += 1;
10884 $res = $ilDB->queryF(
$query, $types, $values);
10885 while(
$row = $ilDB->fetchAssoc(
$res)) {
10887 $qid =
$row[
'question_fi'];
10889 if ($qid == $new_question_id) {
10892 else if ($qid == $previous_question_id) {
10893 $new_array[$position++] = $qid;
10894 $new_array[$position++] = $new_question_id;
10898 $new_array[$position++] = $qid;
10902 $update_query =
'UPDATE tst_test_question SET sequence = %s WHERE test_fi = %s AND question_fi = %s';
10903 $update_types = array(
'integer',
'integer',
'integer');
10905 foreach($new_array as $position => $qid) {
10906 $ilDB->manipulateF(
10938 'pass_details' =>
'setShowPassDetails',
10939 'solution_details' =>
'setShowSolutionDetails',
10940 'solution_printview' =>
'setShowSolutionPrintview',
10941 'solution_feedback' =>
'setShowSolutionFeedback',
10942 'solution_answers_only' =>
'setShowSolutionAnswersOnly',
10943 'solution_signature' =>
'setShowSolutionSignature',
10944 'solution_suggested' =>
'setShowSolutionSuggested',
10946 foreach($setter as $key => $setter) {
10961 $this->poolUsage = (boolean)$usage;
10970 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
10972 $questionSetConfig = $qscFactory->getQuestionSetConfig();
10975 $questionSetConfig->reindexQuestionOrdering();
10988 foreach($orders as
$id => $position)
10993 isset($obligations[
$id]) && $obligations[
$id] ? 1 : 0
10997 UPDATE tst_test_question 11000 WHERE question_fi = %s 11003 $ilDB->manipulateF(
11004 $query, array(
'integer',
'integer',
'integer'), array($i, $obligatory, $id)
11014 if ($question_before) {
11015 $query =
'SELECT sequence, test_fi FROM tst_test_question WHERE question_fi = %s';
11016 $types = array(
'integer');
11017 $values = array($question_before);
11018 $rset = $ilDB->queryF(
$query, $types, $values);
11021 if (!$question_before || ($rset && !(
$row = $ilDB->fetchAssoc($rset)))) {
11028 $update =
'UPDATE tst_test_question SET sequence = sequence + 1 WHERE sequence > %s AND test_fi = %s';
11029 $types = array(
'integer',
'integer');
11030 $values = array(
$row[
'sequence'],
$row[
'test_fi']);
11031 $ilDB->manipulateF($update, $types, $values);
11033 $update =
'UPDATE tst_test_question SET sequence = %s WHERE question_fi = %s';
11034 $types = array(
'integer',
'integer');
11035 $values = array(
$row[
'sequence'] + 1, $question_to_move);
11036 $ilDB->manipulateF($update, $types, $values);
11047 $IN_questions = $ilDB->in(
'q1.question_id', array_keys($questions),
false,
'integer');
11050 SELECT count(q1.question_id) cnt 11052 FROM qpl_questions q1 11054 INNER JOIN qpl_questions q2 11055 ON q2.question_id = q1.original_id 11057 WHERE $IN_questions 11058 AND q1.obj_fi = q2.obj_fi 11061 $rset = $ilDB->query(
$query);
11063 $row = $ilDB->fetchAssoc($rset);
11065 return $row[
'cnt'] > 0;
11078 $result = $ilDB->queryF(
"SELECT test_fi,MAX(pass) AS pass FROM tst_active".
11079 " JOIN tst_pass_result ON (tst_pass_result.active_fi = tst_active.active_id)".
11080 " WHERE user_fi=%s".
11081 " GROUP BY test_fi",
11082 array(
'integer',
'integer'),
11083 array($a_user_id, 1)
11088 $obj_id = self::_getObjectIDFromTestID(
$row[
"test_fi"]);
11089 $all[$obj_id] = (bool)
$row[
"pass"];
11105 $this->online = (bool)$a_online;
11110 $this->print_best_solution_with_result = (bool) $status;
11140 $this->activation_visibility = (bool) $a_value;
11150 return (
bool)$this->activation_limited;
11155 $this->activation_limited = (bool)$a_value;
11167 $this->_highscore_enabled = (bool)$a_enabled;
11177 return (
bool) $this->_highscore_enabled;
11189 $this->_highscore_anon = (bool)$a_anon;
11203 return (
bool) $this->_highscore_anon;
11233 $this->_highscore_achieved_ts = (bool)$a_achieved_ts;
11243 return (
bool) $this->_highscore_achieved_ts;
11253 $this->_highscore_score = (bool)$a_score;
11263 return (
bool) $this->_highscore_score;
11273 $this->_highscore_percentage = (bool)$a_percentage;
11283 return (
bool) $this->_highscore_percentage;
11293 $this->_highscore_hints = (bool)$a_hints;
11303 return (
bool) $this->_highscore_hints;
11313 $this->_highscore_wtime = (bool)$a_wtime;
11323 return (
bool) $this->_highscore_wtime;
11333 $this->_highscore_own_table = (bool)$a_own_table;
11343 return (
bool) $this->_highscore_own_table;
11353 $this->_highscore_top_table = (bool)$a_top_table;
11363 return (
bool) $this->_highscore_top_table;
11374 $this->_highscore_top_num = (int)$a_top_num;
11387 $retval = $a_retval;
11388 if ( (
int) $this->_highscore_top_num != 0)
11390 $retval = $this->_highscore_top_num;
11404 return self::HIGHSCORE_SHOW_ALL_TABLES;
11408 return self::HIGHSCORE_SHOW_TOP_TABLE;
11413 return self::HIGHSCORE_SHOW_OWN_TABLE;
11425 case self::HIGHSCORE_SHOW_ALL_TABLES:
11430 case self::HIGHSCORE_SHOW_TOP_TABLE:
11435 case self::HIGHSCORE_SHOW_OWN_TABLE:
11446 switch ($specific_answer_feedback)
11449 $this->specific_answer_feedback = 1;
11452 $this->specific_answer_feedback = 0;
11459 switch ($this->specific_answer_feedback)
11496 require_once(
'Modules/TestQuestionPool/classes/class.assQuestion.php');
11504 $obligationPossible = call_user_func(array($classConcreteQuestion,
'isObligationPossible'), $questionId);
11506 return $obligationPossible;
11519 $rset = $ilDB->queryF(
'SELECT obligatory FROM tst_test_question WHERE question_fi = %s', array(
'integer'), array($question_id));
11521 if(
$row = $ilDB->fetchAssoc($rset) )
11523 return (
bool)
$row[
'obligatory'];
11545 $rset = $ilDB->queryF(
11546 'SELECT obligations_answered FROM tst_pass_result WHERE active_fi = %s AND pass = %s',
11547 array(
'integer',
'integer'),
11548 array($active_id,
$pass)
11551 if(
$row = $ilDB->fetchAssoc($rset) )
11553 return (
bool)
$row[
'obligations_answered'];
11556 return !self::hasObligations($test_id);
11571 $rset = $ilDB->queryF(
11572 'SELECT count(*) cnt FROM tst_test_question WHERE test_fi = %s AND obligatory = 1',
11573 array(
'integer'), array($test_id)
11576 $row = $ilDB->fetchAssoc($rset);
11578 return (
bool)
$row[
'cnt'] > 0;
11621 #region Examview / PDF Examview 11684 return (strlen($this->activation_starting_time)) ? $this->activation_starting_time : NULL;
11689 return (strlen($this->activation_ending_time)) ? $this->activation_ending_time : NULL;
11697 $result = $ilDB->query(
"SELECT tst_times.active_fi, tst_times.started FROM tst_times, tst_active WHERE tst_times.active_fi = tst_active.active_id ORDER BY tst_times.tstamp DESC");
11700 $times[
$row[
'active_fi']] = $row[
'started'];
11710 $result = $ilDB->queryF(
"SELECT tst_addtime.active_fi, tst_addtime.additionaltime FROM tst_addtime, tst_active WHERE tst_addtime.active_fi = tst_active.active_id AND tst_active.test_fi = %s",
11716 $times[
$row[
'active_fi']] = $row[
'additionaltime'];
11725 $result = $ilDB->queryF(
"SELECT additionaltime FROM tst_addtime WHERE active_fi = %s",
11732 return $row[
'additionaltime'];
11741 $participants = array();
11742 if ($active_id == 0)
11744 $result = $ilDB->queryF(
"SELECT active_id FROM tst_active WHERE test_fi = %s",
11750 array_push($participants,
$row[
'active_id']);
11755 array_push($participants, $active_id);
11757 foreach ($participants as $active_id)
11759 $result = $ilDB->queryF(
"SELECT active_fi FROM tst_addtime WHERE active_fi = %s",
11765 $ilDB->manipulateF(
"DELETE FROM tst_addtime WHERE active_fi = %s",
11771 $ilDB->manipulateF(
"UPDATE tst_active SET tries = %s, submitted = %s, submittimestamp = %s WHERE active_id = %s",
11772 array(
'integer',
'integer',
'timestamp',
'integer'),
11773 array(0, 0, NULL, $active_id)
11776 $ilDB->manipulateF(
"INSERT INTO tst_addtime (active_fi, additionaltime, tstamp) VALUES (%s, %s, %s)",
11777 array(
'integer',
'integer',
'integer'),
11778 array($active_id, $minutes, time())
11781 require_once
'Modules/Test/classes/class.ilObjAssessmentFolder.php';
11808 public function getMaxPassOfTest()
11816 SELECT MAX(tst_pass_result.pass) + 1 max_res 11817 FROM tst_pass_result 11818 INNER JOIN tst_active ON tst_active.active_id = tst_pass_result.active_fi 11819 WHERE test_fi = '.$ilDB->quote($this->
getTestId(),
'integer').
' 11823 return (
int)
$data[
'max_res'];
11836 $exam_id_query =
'SELECT exam_id FROM tst_pass_result WHERE active_fi = %s AND pass = %s';
11837 $exam_id_result = $ilDB->queryF( $exam_id_query, array(
'integer',
'integer' ), array( $active_id,
$pass ) );
11838 if ($ilDB->numRows( $exam_id_result ) == 1)
11840 $exam_id_row = $ilDB->fetchAssoc( $exam_id_result );
11842 if ($exam_id_row[
'exam_id'] != null)
11844 return $exam_id_row[
'exam_id'];
11862 $inst_id = $ilSetting->get(
'inst_id', null );
11864 if($test_obj_id === null)
11866 $obj_id = self::_getObjectIDFromActiveID($active_id);
11870 $obj_id = $test_obj_id;
11873 $examId =
'I' . $inst_id .
'_T' . $obj_id .
'_A' . $active_id .
'_P' .
$pass;
11925 $this->char_selector_availability = (int) $availability;
11941 $this->char_selector_definition = $definition;
11984 $query =
"SELECT question_set_type FROM tst_tests WHERE obj_fi = %s";
11986 $res = $ilDB->queryF(
$query, array(
'integer'), array($objId));
11990 while(
$row = $ilDB->fetchAssoc(
$res) )
12037 return self::lookupQuestionSetType($a_obj_id) == self::QUESTION_SET_TYPE_RANDOM;
12045 return $lng->
txt(
'tst_question_set_type_fixed');
12048 return $lng->
txt(
'tst_question_set_type_random');
12051 return $lng->
txt(
'tst_question_set_type_dynamic');
12084 require_once
'class.ilTestScoring.php';
12086 $scoring->setPreserveManualScores($preserve_manscoring);
12087 $scoring->recalculateSolutions();
12092 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
12094 $questionChangeListeners = array(
12098 return $questionChangeListeners;
12108 INNER JOIN tst_tests 12109 ON test_id = test_fi 12113 $res = $ilDB->queryF(
$query, array(
'integer'), array($userId));
12117 while(
$row = $ilDB->fetchAssoc(
$res) )
12119 $objIds[] = (int)
$row[
'obj_fi'];
12152 if( !self::isSkillManagementGloballyActivated() )
12164 if( self::$isSkillManagementGloballyActivated === null )
12166 include_once
'Services/Skill/classes/class.ilSkillManagementSettings.php';
12169 self::$isSkillManagementGloballyActivated = $skmgSet->isActivated();
12172 return self::$isSkillManagementGloballyActivated;
12230 $activeId = $testOBJ->getActiveIdOfUser($userId);
12232 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12235 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12238 $testSession = $testSessionFactory->getSession($activeId);
12239 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($activeId, $testSession->getPass());
12240 $testSequence->loadFromDb();
12243 if($a_force_new_run)
12245 if( $testSequence->hasSequence() )
12247 $testSession->increasePass();
12249 $testSession->setLastSequence(0);
12250 $testSession->saveToDb();
12264 $activeId = $testOBJ->getActiveIdOfUser($userId);
12266 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12269 $testSessionFactory->reset();
12271 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12274 $testSession = $testSessionFactory->getSession($activeId);
12275 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($activeId, $testSession->getPass());
12276 $testSequence->loadFromDb();
12278 return $testSequence->hasSequence();
setStartingTime($starting_time=NULL)
Sets the starting time in database timestamp format for the test.
setAllowedUsers($a_allowed_users)
static _getUserIdFromActiveId($active_id)
isShowGradingMarkEnabled()
setAnswerFeedback($answer_feedback=0)
Sets the generic feedback for the test Use setGenericAnswerFeedback instead.
saveCertificateVisibility($a_value)
Saves the visibility settings of the certificate.
static _lookupName($a_user_id)
lookup user name
getExportDirectory()
Get the location of the export directory for the test.
setHighscoreTopTable($a_top_table)
Sets if the top-rankings table should be shown.
setPassScoring($a_pass_scoring=SCORE_LAST_PASS)
Sets the pass scoring.
static getPluginObject($a_ctype, $a_cname, $a_slot_id, $a_pname)
Get plugin object.
setSkillServiceEnabled($skillServiceEnabled)
getListOfQuestionsDescription()
Returns TRUE if the list of questions should be presented with the question descriptions.
getScoreReporting()
Gets the score reporting of the ilObjTest object.
getCharSelectorDefinition()
getTimeExtensionsOfParticipants()
_getCountSystem($active_id)
Gets the count system for the calculation of points.
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms public
isHTML($a_text)
Checks if a given string contains HTML or not.
const SCORE_REPORTING_DISABLED
inviteRole($role_id)
Invites all users of a role to a test.
setRedirectionUrl($redirection_url=NULL)
setMailNotification($a_notification)
Set mail notification settings.
saveToDb($properties_only=FALSE)
Saves a ilObjTest object to a database.
isDynamicTest()
Returns the fact wether this test is a dynamic question set test or not.
static deliverData($a_data, $a_filename, $mime="application/octet-stream", $charset="")
deliver data for download via browser.
setEnableExamview($enable_examview)
isTestFinished($active_id)
returns if the active for user_id has been submitted
static getPoolQuestionChangeListener(ilDB $db, $poolObjId)
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
static _getOriginalId($question_id)
Returns the original id of a question.
createMetaData()
Create meta data entry.
getActivationVisibility()
getHighscoreOwnTable()
Gets if the own rankings table should be shown.
setPassDeletionAllowed($passDeletionAllowed)
setter for the test setting passDeletionAllowed
getECTSOutput()
{int|bool}
_getTitleOutput($active_id)
Returns the value of the title_output status.
setOnline($a_online=true)
getFixedParticipants()
Returns the fixed participants status.
setShowExamIdInTestPassEnabled($show_exam_id_in_test_pass_enabled)
setForceInstantFeedbackEnabled($forceInstantFeedbackEnabled)
deliverPDFfromFO($fo, $title=null)
Delivers a PDF file from a XSL-FO string.
getReportingDate()
Gets the reporting date of the ilObjTest object.
_lookupAnonymity($a_obj_id)
Returns the anonymity status of a test with a given object id.
static _includeClass($question_type, $gui=0)
Include the php class file for a given question type.
getCustomStyle()
Get the custom style.
getResultsPresentation()
Returns the combined results presentation value.
const DEFAULT_PROCESSING_TIME_MINUTES
static allObligationsAnswered($test_id, $active_id, $pass)
checks wether all questions marked as obligatory were answered within the test pass with given testId...
_lookupAuthor($obj_id)
Gets the authors name of the ilObjTest object.
logAction($logtext="", $question_id="")
Logs an action into the Test&Assessment log.
_lookupOwner($a_id)
lookup object owner
getProcessingTimeAsMinutes()
isPassDeletionAllowed()
getter for the test setting passDeletionAllowed
_buildName($is_anonymous, $user_id, $firstname, $lastname, $title)
Builds a user name for the output depending on test type and existence of the user.
removeTestResultsByUserIds($userIds)
setShowExamviewPdf($show_examview_pdf)
setShowPassDetails($a_details=1)
Sets if the pass details should be shown when a test is not finished.
getUnfilteredEvaluationData()
& createQuestionGUI($question_type, $question_id=-1)
Creates a question GUI instance of a given question type.
isShowExamIdInTestPassEnabled()
static prepareTextareaOutput($txt_output, $prepare_for_latex_output=FALSE, $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output where latex code may be in it If the text is HTML-free...
setQuestionOrderAndObligations($orders, $obligations)
setRedirectionMode($redirection_mode=0)
processPrintoutput2FO($print_output)
Convert a print output to XSL-FO.
setQuestionSetType($questionSetType)
setter for question set type
getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
setECTSOutput($a_ects_output)
{}
_getPassScoring($active_id)
Gets the pass scoring type.
getTestStyleLocation($mode="output")
get full style sheet file name (path inclusive) of current user
static _prepareCloneSelection($a_ref_ids, $new_type, $show_path=true)
Prepare copy wizard object selection.
_getTestIDFromObjectID($object_id)
Returns the ILIAS test id for a given object id.
cloneObject($a_target_id, $a_copy_id=0, $a_omit_tree=false)
Clone object permissions, put in tree ...
saveCompleteStatus(ilTestQuestionSetConfig $testQuestionSetConfig)
Checks if the test is complete and saves the status in the database.
_getImportDirectory()
Get the import directory location of the test.
$online
the object's online status
setReportingDate($reporting_date)
Sets the reporting date of the ilObjTest object.
setShowSolutionDetails($a_details=1)
Sets if the the solution details should be presented to the user or not.
canShowCertificate($testSession, $user_id, $active_id)
Checks whether the certificate button could be shown on the info page or not.
getMailNotification()
Get mail notification settings.
& evalStatistical($active_id)
Returns the statistical evaluation of the test for a specified user.
& getInvitedUsers($user_id="", $order="login, lastname, firstname")
Returns a list of all invited users in a test.
setCertificateVisibility($a_value)
Sets the visibility settings of the certificate.
getEnableProcessingTime()
Returns the state of the processing time (enabled/disabled)
getProcessingTimeAsArray()
Returns the processing time for the test.
const QUESTION_SET_TYPE_RANDOM
type setting value for random question set
setListOfQuestionsDescription($a_value=TRUE)
Sets the show_summary attribute to TRUE if the list of questions should be presented with the questio...
getListOfQuestionsStart()
Returns if the list of questions should be presented as the first page of the test.
static _lookupRandomTest($a_obj_id)
Returns the fact wether the test with passed obj id is a random questions test or not...
getTestParticipantsForManualScoring($filter=NULL)
& getParticipants()
Returns all persons who started the test.
Skill management settings.
getCompleteWorkingTimeOfParticipant($active_id)
Returns the complete working time in seconds for a test participant.
static getStyleSheetLocation($mode="output", $a_css_name="", $a_css_location="")
get full style sheet file name (path inclusive) of current user
This class handles all operations on files (attachments) in directory ilias_data/mail.
setResultFilterTaxIds($resultFilterTaxIds)
getCertificateVisibility()
Returns the visibility settings of the certificate.
loadFromDb()
Loads a ilObjTest object from a database.
setShuffleQuestions($a_shuffle)
Sets the status of the shuffle_questions variable.
setListOfQuestionsStart($a_value=TRUE)
Sets if the the list of questions as the start page of the test.
setFixedParticipants($a_value=1)
Sets the fixed participants status.
_getPass($active_id)
Retrieves the actual pass of a given user for a given test.
fromXML(ilQTIAssessment $assessment)
Receives parameters from a QTI parser and creates a valid ILIAS test object.
getPresentationMaterial()
{ilQTIPresentationMaterial|null}
getShowSolutionFeedback()
Returns if the feedback should be presented to the solution or not.
setListOfQuestions($a_value=TRUE)
Sets if the the list of questions should be presented to the user or not.
setTmpCopyWizardCopyId($tmpCopyWizardCopyId)
setCharSelectorDefinition($definition='')
Class ilObject Basic functions for all objects.
getShowKioskModeParticipant()
Returns the status of the kiosk mode participant.
static $isSkillManagementGloballyActivated
setHighscoreScore($a_score)
Sets if the actual score should be displayed.
insertQuestion(ilTestQuestionSetConfig $testQuestionSetConfig, $question_id, $linkOnly=false)
Insert a question in the list of questions.
getQuestionSetTypeTranslation(ilLanguage $lng, $questionSetType)
getHighscoreAchievedTS()
Returns if date and time of the scores achievement should be displayed.
getTestId()
Gets the database id of the additional test data.
setHighscoreWTime($a_wtime)
Sets if the workingtime of the scores should be shown.
& evalTotalPersonsArray($name_sort_order="asc")
Returns all persons who started the test.
_isComplete($obj_id)
Returns true, if a test is complete for use.
Class ilTestMailNotification.
static getItem($a_ref_id)
Get item data.
static _getObjectsByOperations($a_obj_type, $a_operation, $a_usr_id=0, $limit=0)
Get all objects of a specific type and check access This function is not recursive, instead it parses the serialized rbac_pa entries.
getListOfQuestionsSettings()
Returns the settings for the list of questions options in the test properties This could contain one ...
getShowInfo()
Gets whether the complete information page is shown or the required data only.
_getResultPass($active_id)
Retrieves the pass number that should be counted for a given user.
& getQuestionTitlesAndIndexes()
Returns the titles of the test questions in question sequence.
getMailNotificationType()
isNewRandomTest()
Checks wheather the test is a new random test (using tst_rnd_cpy) or an old one.
setShowSolutionAnswersOnly($a_full=TRUE)
Set to true, if the full solution (including the ILIAS content pages) should be shown in the solution...
setKioskMode($a_kiosk=FALSE)
Sets the kiosk mode for the test.
& _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
getJavaScriptOutput()
Returns if Javascript should be chosen for drag & drop actions for the active user.
const TIMINGS_DEACTIVATED
getECTSGrade($passed_array, $reached_points, $max_points)
{Returns the ECTS grade for a number of reached points.An array with the points of all users who pass...
_getMCScoring($active_id)
Gets the scoring type for multiple choice questions.
getShowSolutionAnswersOnly()
Returns if the full solution (including ILIAS content) should be presented to the solution or not...
setShowSolutionSignature($a_signature=FALSE)
Set to TRUE, if the signature field should be shown in the solution.
& createTestSequence($active_id, $pass, $shuffle)
setFinalStatement($a_statement="")
Sets the final statement text of the ilObjTest object.
& _evalResultsOverview($test_id)
Creates an associated array with the results of all participants of a test.
& getQuestionsOfTest($active_id)
Retrieves all the assigned questions for all test passes of a test participant.
setScoreCutting($a_score_cutting=SCORE_CUT_QUESTION)
Sets the type of score cutting.
sendAdvancedNotification($active_id)
setEndingTime($ending_time=NULL)
Sets the ending time in database timestamp format for the test.
getXMLZip()
Get zipped xml file for test.
_getWorkingTimeOfParticipantForPass($active_id, $pass)
Returns the complete working time in seconds for a test participant.
setResetProcessingTime($reset=0)
Sets wheather the processing time should be reset or not.
setCharSelectorAvailability($availability)
setShowMarker($a_value=1)
Sets the marker button status.
inviteUser($user_id, $client_ip="")
Invites a user to a test.
static _lookupTitle($a_id)
lookup object title
getAnonymity()
Returns the anonymity status of the test.
toXML()
Returns a QTI xml representation of the test.
isScoreReportingAvailable()
getQuestionCount()
Returns the number of questions in the test.
setEndingTimeEnabled($ending_time_enabled)
_getQuestionTitle($question_id)
Returns the question title of a question with a given id.
setActivationLimited($a_value)
$showGradingStatusEnabled
TableGUI class for evaluation of all users.
_lookupTestObjIdForQuestionId($a_q_id)
Get test Object ID for question ID.
setSpecificAnswerFeedback($specific_answer_feedback)
getShuffleQuestions()
Returns the status of the shuffle_questions variable.
prepareTextareaOutput($txt_output, $prepare_for_latex_output=FALSE, $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output in tests.
$offeringQuestionHintsEnabled
setTestId($a_id)
Sets the test ID.
_getQuestionCountAndPointsForPassOfParticipant($active_id, $pass)
isShowExamIdInTestResultsEnabled()
_getSolvedQuestions($active_id, $question_fi=null)
get solved questions
_getVisitTimeOfParticipant($test_id, $active_id)
Returns the first and last visit of a participant.
& getTestParticipants()
Returns a list of all participants in a test.
getCompleteWorkingTime($user_id)
Returns the complete working time in seconds a user worked on the test.
getShowSolutionDetails()
Returns if the solution details should be presented to the user or not.
getImagePathWeb()
Returns the web image path for web accessable images of a test The image path is under the web access...
_enabledAssessmentLogging()
check wether assessment logging is enabled or not
_getBestPass($active_id)
Retrieves the best pass of a given user for a given test.
startingTimeReached()
Returns true if the starting time of a test is reached A starting time is not available for self asse...
_cleanupMediaObjectUsage($a_text, $a_usage_type, $a_usage_id)
synchronises appearances of media objects in $a_text with media object usage table ...
questionMoveDown($question_id)
Moves a question down in order.
getOwner()
get object owner
getHighscoreWTime()
Gets if the column with the workingtime should be shown.
isSingleChoiceTest()
Returns TRUE if the test contains single choice results only.
getActiveIdOfUser($user_id="", $anonymous_id="")
Gets the active id of a given user.
setShowGradingStatusEnabled($showGradingStatusEnabled)
$participantDataExist
holds the fact wether participant data exists or not DO NOT USE TIS PROPERTY DRIRECTLY ALWAYS USE ilO...
static getASCIIFilename($a_filename)
convert utf8 to ascii filename
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
setShowKioskModeParticipant($a_participant=FALSE)
Set to true, if the participant's name should be shown in kiosk mode.
ilObject($a_id=0, $a_reference=true)
Constructor public.
& getAllQuestions($pass=NULL)
Returns all questions of a test in test order.
getShowSolutionListComparison()
setQuestionSetSolved($value, $question_id, $user_id)
sets question solved state to value for given user_id
Base Exception for all Exceptions relating to Modules/Test.
getHighscoreTopTable()
Gets, if the top-rankings table should be shown.
setMailNotificationType($a_type)
setTitle($a_title)
set object title
startWorkingTime($active_id, $pass)
Write the initial entry for the tests working time to the database.
setObligationsEnabled($obligationsEnabled=true)
sets obligations enabled/disabled
setHighscoreOwnTable($a_own_table)
Sets if the table with the own ranking should be shown.
setTitleOutput($title_output=0)
Sets the status of the title output.
disinviteUser($user_id)
Disinvites a user from a test.
deleteRequestsByActiveIds($activeIds)
Deletes all hint requests relating to a testactive included in given active ids.
_getQuestionType($question_id)
Returns the question type of a question with a given id.
setShowSolutionPrintview($a_printview=1)
Sets if the the solution printview should be presented to the user or not.
areObligationsEnabled()
returns the fact wether obligations are enabled or not
& getQuestionTitles()
Returns the titles of the test questions in question sequence.
& evalResultsOverview()
Creates an associated array with the results of all participants of a test.
getSequenceSettings()
SEQUENCE SETTING = POSTPONING ENABLED !!
& getCompleteEvaluationData($withStatistics=TRUE, $filterby="", $filtertext="")
isMaxProcessingTimeReached($starting_time, $active_id)
Returns whether the maximum processing time for a test is reached or not.
& _getCompleteWorkingTimeOfParticipants($test_id)
Returns the complete working time in seconds for all test participants.
canShowTestResults($testSession)
isRandomTest()
Returns the fact wether this test is a random questions test or not.
canViewResults()
Returns true, if the test results can be viewed.
setTestFinalBroken($testFinalBroken)
getHighscorePercentage()
Gets if the percentage column should be shown.
isFixedTest()
Returns the fact wether this test is a fixed question set test or not.
checkMarks()
{boolean|string True or an error string which can be used for display purposes}
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
updateWorkingTime($times_id)
Update the working time of a test when a question is answered.
notify($a_event, $a_ref_id, $a_parent_non_rbac_id, $a_node_id, $a_params=0)
notifys an object about an event occured Based on the event happend, each object may decide how it re...
$instantFeedbackAnswerFixationEnabled
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
setCustomStyle($a_customStyle=NULL)
Set the custom style.
setSignSubmission($sign_submission)
$char_selector_definition
getSpecificAnswerFeedback()
getImportMapping()
get array of (two) new created questions for import id
getAnsweredQuestionCount($active_id, $pass=NULL)
Retrieves the number of answered questions for a given user in a given test.
setProcessingTimeByMinutes($minutes)
addDefaults($a_name)
Adds the defaults of this test to the test defaults.
getCountSystem()
Gets the count system for the calculation of points.
const SCORE_REPORTING_IMMIDIATLY
getIntroduction()
Gets the introduction text of the ilObjTest object.
_getObjectIDFromActiveID($active_id)
Returns the ILIAS test object id for a given active id.
getMarkSchemaForeignId()
{int}
setNrOfTries($nr_of_tries=0)
Sets the nr of tries for the test.
setScoreReporting($score_reporting=0)
Sets the score reporting of the ilObjTest object.
__construct($a_id=0, $a_call_by_reference=true)
Constructor.
removeTestResults(ilTestParticipantData $participantData)
setAnswerFeedbackPoints($answer_feedback_points=0)
Sets the answer specific feedback of reached points for the test.
getHighscoreHints()
Gets, if the column with the number of requested hints should be shown.
setShowCancel($a_value=1)
Sets the cancel test button status.
getQuestiontext($question_id)
Returns the question text for a given question.
static _getInstance($a_copy_id)
Get instance of copy wizard options.
getShowKioskModeTitle()
Returns the status of the kiosk mode title.
buildName($user_id, $firstname, $lastname, $title)
Builds a user name for the output depending on test type and existence of the user.
& getTestDefaults($test_defaults_id)
Returns the test defaults for a given id.
setLimitUsersEnabled($limitUsersEnabled)
setAutosaveIval($autosave_ival)
setExportSettingsSingleChoiceShort($a_settings)
getVisitTimeOfParticipant($active_id)
Returns the first and last visit of a participant.
getListOfQuestions()
Returns if the list of questions should be presented to the user or not.
QTIMaterialToString($a_material)
Reads an QTI material tag an creates a text string.
isExecutable($testSession, $user_id, $allowPassIncrease=FALSE)
Checks if the test is executable by the given user.
setProcessingTime($processing_time="00:00:00")
Sets the processing time for the test.
$forceInstantFeedbackEnabled
_getSolutionMaxPass($question_id, $active_id)
Returns the maximum pass a users question solution.
setCountSystem($a_count_system=COUNT_PARTIAL_SOLUTIONS)
Sets the count system for the calculation of points.
createRandomSolutions($number)
getAllTestResults($participants, $prepareForCSV=true)
returns all test results for all participants
getResetProcessingTime()
Returns wheather the processing time should be reset or not.
setScoringFeedbackOptionsByArray($options)
if(!is_array($argv)) $options
getHighscoreAnon()
Gets if the highscores should be anonymized per setting.
setExportSettings($a_settings)
removeQuestion($question_id)
Removes a question from the test object.
getId()
get object id public
setHighscoreTopNum($a_top_num)
Sets the number of entries which are to be shown in the top-rankings table.
setActivationVisibility($a_value)
hasQuestionsWithoutQuestionpool()
evalTotalPersons()
Returns the number of persons who started the test.
hasSingleChoiceQuestions()
Returns TRUE if the test contains single choice results.
const ILIAS_ABSOLUTE_PATH
getStartingTimeOfUser($active_id, $pass=null)
Returns the unix timestamp of the time a user started a test.
getShowMarker()
Returns wheather the marker button is shown or not.
sendSimpleNotification($active_id)
getShowSolutionPrintview()
Returns if the solution printview should be presented to the user or not.
const SCORE_ZERO_POINTS_WHEN_UNANSWERED
getAnswerFeedback()
Returns 1 if generic answer feedback is activated.
deliverPDFfromHTML($content, $title=NULL)
Delivers a PDF file from XHTML.
_createImportDirectory()
creates data directory for import files (data_dir/tst_data/tst_<id>/import, depending on data directo...
hasNrOfTriesRestriction()
returns if the numbers of tries have to be checked
getTitleOutput()
Returns the value of the title_output status.
addExtraTime($active_id, $minutes)
const COUNT_PARTIAL_SOLUTIONS
getAuthor()
Gets the authors name of the ilObjTest object.
static _lookupDescription($a_id)
lookup object description
_addLog($user_id, $object_id, $logtext, $question_id="", $original_id="", $test_only=FALSE, $test_ref_id=NULL)
Add an assessment log entry.
getUsePreviousAnswers()
Returns if the previous answers should be shown for a learner.
getShowPassDetails()
Returns if the pass details should be shown when a test is not finished.
static getManualFeedback($active_id, $question_id, $pass)
Retrieves the manual feedback for a question in a test.
evalTotalFinished()
Returns the number of total finished tests.
isTestFinishedToViewResults($active_id, $currentpass)
Returns true if an active user completed a test pass and did not start a new pass.
getShowFinalStatement()
Returns whether the final statement should be shown or not.
addQTIMaterial(&$a_xml_writer, $a_material)
Creates a QTI material tag from a plain text or xhtml text.
setTemplate($template_id)
questionMoveUp($question_id)
Moves a question up in order.
& processCSVRow($row, $quoteAll=FALSE, $separator=";")
Processes an array as a CSV row and converts the array values to correct CSV values.
static _lookupObjId($a_id)
special template class to simplify handling of ITX/PEAR
setShowInfo($a_info=1)
Set whether the complete information page is shown or the required data only.
static collectFileItems($a_page, $a_domdoc)
Get all file items that are used within the page.
getEvaluationAdditionalFields()
Gets additional user fields that should be shown in the user evaluation.
& _getAvailableTests($use_object_id=FALSE)
Returns the available tests for the active user.
getShowSolutionSuggested()
isSkillServiceToBeConsidered()
_setImportDirectory($a_import_dir=null)
set import directory
exportXMLMetaData(&$a_xml_writer)
export content objects meta data to xml (see ilias_co.dtd)
setInstantFeedbackSolution($instant_feedback=0)
Sets the instant feedback for the solution.
canShowSolutionPrintview($user_id=NULL)
Calculates if a user may see the solution printview of his/her test results.
static formatDate(ilDateTime $date)
Format a date public.
setAllowedUsersTimeGap($a_allowed_users_time_gap)
getTitle()
get object title public
applyDefaults($test_defaults)
Applies given test defaults to this test.
randomSelectQuestions($nr_of_questions, $questionpool, $use_obj_id=0, $qpls="", $pass=NULL)
Returns a random selection of questions.
lookupExamId($active_id, $pass)
getDescription()
get object description
getProcessingTime()
Returns the processing time for the test.
isOfferingQuestionHintsEnabled()
returns the fact wether offering hints is enabled or not
removeTestActives($activeIds)
exportXMLMediaObjects(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
export media objects to xml (see ilias_co.dtd)
hasRandomQuestionsForPass($active_id, $pass)
Checkes wheather a random test has already created questions for a given pass or not.
redirection script todo: (a better solution should control the processing via a xml file) ...
cloneMetaData($target_obj)
Copy meta data.
xmlHeader()
Writes xml header public.
loadQuestions($active_id="", $pass=NULL)
Load the test question id's from the database.
isBestSolutionPrintedWithResult()
& getExistingQuestions($pass=NULL)
Get the id's of the questions which are already part of the test.
$activation_starting_time
static isSkillManagementGloballyActivated()
getAnswerFeedbackPoints()
Returns 1 if answer specific feedback as reached points is activated.
createExportDirectory()
creates data directory for export files (data_dir/tst_data/tst_<id>/export, depending on data directo...
getStartTestLabel($active_id)
Returns the "Start the Test" label for the Info page.
static ensureParticipantsLastActivePassFinished($testObjId, $userId, $a_force_new_run=FALSE)
setECTSGrades(array $a_ects_grades)
{}
userLookupFullName($user_id, $overwrite_anonymity=FALSE, $sorted_order=FALSE, $suffix="")
Returns the full name of a test user according to the anonymity status.
removeTestResultsFromSoapLpAdministration($userIds)
getMarkSchema()
{ASS_MarkSchema}
getAggregatedResultsData()
Returns the aggregated test results.
getQuestionTitle($title)
Returns the title of a test question and checks if the title output is allowed.
& getAvailableQuestionpools($use_object_id=false, $equal_points=false, $could_be_offline=false, $show_path=FALSE, $with_questioncount=FALSE, $permission="read")
Returns the available question pools for the active user.
getStartingTime()
Returns the starting time of the test.
getStartingTimeOfParticipants()
setAnonymity($a_value=0)
Sets the anonymity status of the test.
static getPoolQuestionChangeListeners(ilDB $db, $poolObjId)
_getMaxPass($active_id)
Retrieves the maximum pass of a given user for a given test in which the user answered at least one q...
getShowSolutionSignature()
Returns if the signature field should be shown in the test results.
getAllRTEContent()
Returns the content of all RTE enabled text areas in the test.
static removeTrailingPathSeparators($path)
_getParticipantData($active_id)
Retrieves a participant name from active id.
static isQuestionObligationPossible($questionId)
checks wether the obligation for question with given id is possible or not
static _lookupFinishedUserTests($a_user_id)
Gather all finished tests for user.
pcArrayShuffle($array)
Shuffles the values of a given array.
getType()
get object type public
_getUsePreviousAnswers($active_id, $user_active_user_setting=false)
Returns if the previous results should be hidden for a learner.
getInstantFeedbackSolution()
Returns 1 if the correct solution will be shown after answering a question.
& getQuestionTypeTranslations()
_getLogLanguage()
retrieve the log language for assessment logging
getFinalStatement()
Gets the final statement.
setKiosk($kiosk=0)
Sets the kiosk mode for the test.
isHighscoreAnon()
Gets if the highscores should be displayed anonymized.
inviteGroup($group_id)
Invites all users of a group to a test.
setUsePreviousAnswers($use_previous_answers=1)
Sets the status of the visibility of previous learner answers.
setTimingType($a_type)
Set timing type.
_getScoreCutting($active_id)
Determines if the score of a question should be cut at 0 points or the score of the whole test...
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
setResultsPresentation($a_results_presentation=3)
Sets the combined results presentation value.
const SCORE_REPORTING_FINISHED
setShowSolutionFeedback($a_feedback=TRUE)
Sets if the the feedback should be presented to the user in the solution or not.
isInstantFeedbackAnswerFixationEnabled()
$char_selector_availability
static _getECTSGrade($points_passed, $reached_points, $max_points, $a, $b, $c, $d, $e, $fx)
{Returns the ECTS grade for a number of reached points.The points reached in the test The maximum num...
const TEST_FIXED_SEQUENCE
Test constants.
getPassword()
Returns the password for test access.
getNrOfTries()
Returns the nr of tries for the test.
duplicateQuestionForTest($question_id)
Takes a question and creates a copy of the question for use in the test.
setForceJS($a_js=1)
Set whether JavaScript should be forced for tests.
setPostponingEnabled($postponingEnabled)
isScoreReportingEnabled()
static factory($a_package)
Create an XML_RPC2 client instance.
static hasObligations($test_id)
returns the fact wether the test with given test id contains questions markes as obligatory or not ...
setHighscoreHints($a_hints)
Sets if the number of requested hints should be shown.
isForceInstantFeedbackEnabled()
setEnableProcessingTime($enable=0)
Sets the processing time enabled or disabled.
static ilTempnam($a_temp_path=null)
Create a temporary file in an ILIAS writable directory.
_getObjectIDFromTestID($test_id)
Returns the ILIAS test object id for a given test id.
& getTotalPointsPassedArray()
Returns an array with the total points of all users who passed the test This array could be used for ...
static _getSuggestedSolutionOutput($question_id)
Returns the output of the suggested solution.
getQuestionDataset($question_id)
Returns the dataset for a given question id.
_getLastAccess($active_id)
evalTotalStartedAverageTime()
Returns the average processing time for all started tests.
getResultsForActiveId($active_id)
setResultsPresentationOptionsByArray($options)
setEnabledViewMode($mode)
getQuestionSetType()
getter for question set type
const SCORE_REPORTING_DATE
setHighscoreAchievedTS($a_achieved_ts)
Sets if the date and time of the scores achievement should be displayed.
getGenericAnswerFeedback()
Returns 1 if generic answer feedback is to be shown.
setEnableArchiving($enable_archiving)
getEstimatedWorkingTime()
Returns the estimated working time for the test calculated from the working time of the contained que...
isSingleChoiceTestWithoutShuffle()
Returns TRUE if the test contains single choice results and no shuffle only.
isQuestionSetConfigured()
$show_exam_id_in_test_pass_enabled
getEndingTime()
Returns the ending time of the test.
setListOfQuestionsEnd($a_value=TRUE)
Sets if the the list of questions as the end page of the test.
setPasswordEnabled($passwordEnabled)
setShowExamviewHtml($show_examview_html)
getActivationStartingTime()
getAvailableQuestions($arrFilter, $completeonly=0)
Calculates the available questions for a test.
& getUserData($ids)
Returns a data of all users specified by id list.
static getDataDir()
get data directory (outside webspace)
getScoreCutting()
Determines if the score of a question should be cut at 0 points or the score of the whole test...
setShowSolutionSuggested($a_solution=FALSE)
Set to TRUE, if the suggested solution should be shown in the solution.
getCharSelectorAvailability()
getCustomStyles()
Return the available custom styles.
const HIGHSCORE_SHOW_TOP_TABLE
cleanupMediaobjectUsage()
Cleans up the media objects for all text fields in a test which are using an RTE field.
_lookupRandomTestFromActiveId($active_id)
Returns the random status of a test with a given object id.
deleteTest()
Deletes the test and all related objects, files and database entries.
setShowSolutionListComparison($a_comparison=FALSE)
Set to TRUE, if the list of answers should be shown prior to finish the test.
setOfferingQuestionHintsEnabled($offeringQuestionHintsEnabled)
sets offering question hints enabled/disabled
checkMaximumAllowedUsers()
moveQuestions($move_questions, $target_index, $insert_mode)
Move questions to another position.
exportPagesXML(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
export pages of test to xml (see ilias_co.dtd)
recalculateScores($preserve_manscoring=false)
recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
& evalTotalParticipantsArray($name_sort_order="asc")
Returns all participants who started the test.
$print_best_solution_with_result
setPrintBestSolutionWithResult($status)
getKioskMode()
Returns the kiosk mode.
const HIGHSCORE_SHOW_OWN_TABLE
setMCScoring($a_mc_scoring=SCORE_ZERO_POINTS_WHEN_UNANSWERED)
Sets the multiple choice scoring.
getExportSettingsSingleChoiceShort()
deleteDefaults($test_default_id)
Deletes the defaults for a test.
update()
update object data
endingTimeReached()
Returns true if the ending time of a test is reached An ending time is not available for self assessm...
getActivationEndingTime()
const QUESTION_SET_TYPE_FIXED
type setting value for fixed question set
isActiveTestSubmitted($user_id=null)
returns if the active for user_id has been submitted
setHighscoreAnon($a_anon)
Sets if the highscores should be anonymized.
modifyExportIdentifier($a_tag, $a_param, $a_value)
Returns the installation id for a given identifier.
setShowKioskModeTitle($a_title=FALSE)
Set to true, if the full test title should be shown in kiosk mode.
saveAuthorToMetadata($a_author="")
Saves an authors name into the lifecycle metadata if no lifecycle metadata exists This will only be c...
setActivationStartingTime($starting_time=NULL)
getRefId()
get reference id public
getQuestionType($question_id)
Returns the question type of a question with a given id.
static buildExamId($active_id, $pass, $test_obj_id=null)
static insertInstIntoID($a_value)
inserts installation id into ILIAS id
setGenericAnswerFeedback($generic_answer_feedback=0)
Sets if the generic feedback is to be shown in the test.
removeTestResultsByActiveIds($activeIds)
setShowExamIdInTestResultsEnabled($show_exam_id_in_test_results_enabled)
getSecondsUntilEndingTime()
Returns the seconds left from the actual time until the ending time.
deleteMetaData()
delete meta data entry
& getCompleteWorkingTimeOfParticipants()
Returns the complete working time in seconds for all test participants.
& _getAvailableQuestionpools($use_object_id=FALSE, $equal_points=FALSE, $could_be_offline=FALSE, $showPath=FALSE, $with_questioncount=FALSE, $permission="read", $usr_id="")
Returns the available question pools for the active user.
static getGuiClassNameByQuestionType($questionType)
canEditEctsGrades()
{boolean}
getProcessingTimeInSeconds($active_id="")
Returns the processing time for the test in seconds.
setDescription($a_desc)
set object description
getShowCancel()
Returns wheather the cancel test button is shown or not.
setIntroduction($introduction="")
Sets the introduction text of the ilObjTest object.
getNrOfResultsForPass($active_id, $pass)
Calculates the number of user results for a specific test pass.
setClientIP($user_id, $client_ip)
getTextAnswer($active_id, $question_id, $pass=NULL)
Returns the text answer of a given user for a given question.
isShowGradingStatusEnabled()
A class defining mark schemas for assessment test objects.
getHighscoreScore()
Gets if the score column should be shown.
static getTestObjIdsWithActiveForUserId($userId)
getListOfQuestionsEnd()
Returns if the list of questions should be presented as the last page of the test.
isPluginActive($a_pname)
Checks wheather or not a question plugin with a given name is active.
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
txt($a_topic, $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
setHighscoreEnabled($a_enabled)
Sets if the highscore feature should be enabled.
create($a_upload=false)
create test object
& getWorkedQuestions($active_id, $pass=NULL)
Gets the id's of all questions a user already worked through.
static isParticipantsLastPassActive($testRefId, $userId)
& evalResultsOverviewOfParticipant($active_id)
Creates an associated array with the results for a given participant of a test.
saveQuestionsToDb()
Saves the test questions to the database.
getMCScoring()
Gets the scoring type for multiple choice questions.
setShowGradingMarkEnabled($showGradingMarkEnabled)
getHighscoreEnabled()
Gets the setting which determines if the highscore feature is enabled.
setAuthor($author="")
Sets the authors name of the ilObjTest object.
getKiosk()
Returns the kiosk mode.
moveQuestionAfterOLD($previous_question_id, $new_question_id)
setInstantFeedbackAnswerFixationEnabled($instantFeedbackAnswerFixationEnabled)
moveQuestionAfter($question_to_move, $question_before)
getPassFinishDate($active_id, $pass)
Retrieves the number of answered questions for a given user in a given test.
setHighscorePercentage($a_percentage)
Sets if the percentages of the scores pass should be shown.
setIntroductionEnabled($introductionEnabled)
static lookupQuestionSetType($objId)
lookup-er for question set type
static lookupQuestionSetTypeByActiveId($active_id)
returns the question set type of test relating to passed active id
_updateTestResultCache($active_id, ilAssQuestionProcessLocker $processLocker=null)
Move this to a proper place.
const QUESTION_SET_TYPE_DYNAMIC
type setting value for dynamic question set (continues testing mode)
static _isWorkedThrough($active_id, $question_id, $pass=NULL)
Returns true if the question was worked through in the given pass Worked through means that the user ...
_getActiveIdOfUser($user_id="", $test_id="")
Gets the active id of the tst_active table for the active user.
static getInstance($a_obj_id)
getDetailedTestResults($participants)
returns all test results for all participants
const HIGHSCORE_SHOW_ALL_TABLES
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
isNrOfTriesReached($tries)
returns if number of tries are reached
removeQuestions($removeQuestionIds)
exportXMLPageObjects(&$a_xml_writer, $a_inst, &$expLog)
export page objects to xml (see ilias_co.dtd)
& getQuestionsOfPass($active_id, $pass)
Retrieves all the assigned questions for a test participant in a given test pass. ...
getForceJS()
Gets whether JavaScript should be forced for tests.
Class ilObjectActivation.
isComplete(ilTestQuestionSetConfig $testQuestionSetConfig)
Returns true, if a test is complete for use and can be set online.
setActivationEndingTime($ending_time=NULL)
static getFeedbackClassNameByQuestionType($questionType)
setShowFinalStatement($show=0)
Sets whether the final statement should be shown or not.
read($a_force_db=false)
read object data from db into object
Test certificate adapter.
setSequenceSettings($sequence_settings=0)
SEQUENCE SETTING = POSTPONING ENABLED !!
reindexFixedQuestionOrdering()
setPassword($a_password=NULL)
Sets the password for test access.
setListOfQuestionsSettings($a_value=0)
Sets the settings for the list of questions options in the test properties This could contain one of ...
_getManualScoring()
Retrieve the manual scoring settings.
static _getTestDefaults($test_defaults_id)
& getTestResult($active_id, $pass=NULL, $ordered_sequence=FALSE, $considerHiddenQuestions=true, $considerOptionalQuestions=true)
Calculates the results of a test for a given user and returns an array with all test results...
setStartingTimeEnabled($starting_time_enabled)
getHighscoreTopNum($a_retval=10)
Gets the number of entries which are to be shown in the top-rankings table.
_lookupClientIP($a_user_id)
Lookup client ip.
isError($data, $code=null)
Tell whether a value is a PEAR error.
$show_exam_id_in_test_results_enabled
getImagePath()
Returns the image path for web accessable images of a test The image path is under the CLIENT_WEB_DIR...
getPassScoring()
Gets the pass scoring type.