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';
8 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssQuestionType.php';
596 public function __construct($a_id = 0, $a_call_by_reference =
true)
603 $lng->loadLanguageModule(
"assessment");
605 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
607 $this->mark_schema->createSimpleSchema(
608 $lng->txt(
"failed_short"),
609 $lng->txt(
"failed_official"),
612 $lng->txt(
"passed_short"),
613 $lng->txt(
"passed_official"),
619 $this->author =
$ilUser->fullname;
620 $this->introductionEnabled =
false;
621 $this->introduction =
"";
622 $this->questions = array();
624 $this->score_reporting = self::SCORE_REPORTING_FINISHED;
625 $this->instant_verification = 0;
626 $this->answer_feedback_points = 0;
627 $this->reporting_date =
"";
628 $this->nr_of_tries = 0;
630 $this->use_previous_answers = 1;
631 $this->title_output = 0;
632 $this->starting_time =
"";
633 $this->ending_time =
"";
634 $this->processing_time =
"";
635 $this->enable_processing_time =
"0";
636 $this->reset_processing_time = 0;
637 $this->ects_output =
false;
638 $this->ects_fx = null;
639 $this->shuffle_questions =
false;
640 $this->mailnottype = 0;
641 $this->exportsettings = 0;
642 $this->show_summary = 8;
647 $this->answer_feedback = 0;
648 $this->password =
"";
649 $this->certificate_visibility = 0;
650 $this->allowedUsers =
"";
651 $this->_showfinalstatement =
false;
652 $this->_finalstatement =
"";
653 $this->_showinfo =
true;
654 $this->_forcejs =
true;
655 $this->_customStyle =
"";
656 $this->allowedUsersTimeGap =
"";
657 $this->anonymity = 0;
658 $this->show_cancel = 0;
659 $this->show_marker = 0;
660 $this->fixed_participants = 0;
665 $this->testSession =
false;
666 $this->testSequence =
false;
667 $this->mailnotification = 0;
668 $this->poolUsage = 1;
670 $this->ects_grades = array(
678 $this->autosave =
false;
679 $this->autosave_ival = 30000;
681 $this->enable_examview =
false;
682 $this->show_examview_html =
false;
683 $this->show_examview_pdf =
false;
684 $this->enable_archiving =
false;
686 $this->express_mode =
false;
687 $this->template_id =
'';
688 $this->redirection_mode = 0;
689 $this->redirection_url = null;
690 $this->show_exam_id_in_test_pass_enabled =
false;
691 $this->show_exam_id_in_test_results_enabled =
false;
692 $this->sign_submission =
false;
693 $this->char_selector_availability = 0;
694 $this->char_selector_definition = null;
696 $this->showGradingStatusEnabled =
true;
697 $this->showGradingMarkEnabled =
true;
699 $this->followupQuestionAnswerFixationEnabled =
false;
700 $this->instantFeedbackAnswerFixationEnabled =
false;
702 $this->testFinalBroken =
false;
704 $this->tmpCopyWizardCopyId = null;
706 parent::__construct($a_id, $a_call_by_reference);
716 require_once
'Services/Utilities/classes/class.ilUtil.php';
786 public function delete()
789 if (!parent::delete()) {
799 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssQuestionSkillAssignmentImportFails.php';
801 $qsaImportFails->deleteRegisteredImportFails();
802 require_once
'Modules/Test/classes/class.ilTestSkillLevelThresholdImportFails.php';
804 $sltImportFails->deleteRegisteredImportFails();
817 $tree = $DIC[
'tree'];
818 $ilDB = $DIC[
'ilDB'];
819 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
822 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
824 $participantData->load($this->
getTestId());
827 $affectedRows =
$ilDB->manipulateF(
828 "DELETE FROM tst_mark WHERE test_fi = %s",
833 $affectedRows =
$ilDB->manipulateF(
834 "DELETE FROM tst_tests WHERE test_id = %s",
839 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
841 $testQuestionSetConfigFactory->getQuestionSetConfig()->removeQuestionSetRelatedData();
844 include_once
"./Services/Utilities/classes/class.ilUtil.php";
846 $directory = $tst_data_dir .
"/tst_" . $this->
getId();
847 if (is_dir($directory)) {
848 include_once
"./Services/Utilities/classes/class.ilUtil.php";
851 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
857 foreach (
$mobs as $mob) {
873 include_once
"./Services/Utilities/classes/class.ilUtil.php";
876 if (!is_writable($tst_data_dir)) {
877 $this->
ilias->raiseError(
"Test Data Directory (" . $tst_data_dir
878 .
") not writeable.", $this->
ilias->error_obj->MESSAGE);
882 $tst_dir = $tst_data_dir .
"/tst_" . $this->
getId();
884 if (!@is_dir($tst_dir)) {
885 $this->
ilias->raiseError(
"Creation of Test Directory failed.", $this->
ilias->error_obj->MESSAGE);
888 $export_dir = $tst_dir .
"/export";
890 if (!@is_dir($export_dir)) {
891 $this->
ilias->raiseError(
"Creation of Export Directory failed.", $this->
ilias->error_obj->MESSAGE);
902 include_once
"./Services/Utilities/classes/class.ilUtil.php";
913 public function getExportFiles($dir)
916 if (!@is_dir($dir) || !is_writeable($dir)) {
925 if ($file->isDir()) {
929 $files[] = $file->getBasename();
942 if (strlen($a_import_dir)) {
943 $_SESSION[
"tst_import_dir"] = $a_import_dir;
957 if (strlen(
$_SESSION[
"tst_import_dir"])) {
976 $ilias = $DIC[
'ilias'];
977 include_once
"./Services/Utilities/classes/class.ilUtil.php";
981 if (!is_writable($tst_data_dir)) {
982 $ilias->raiseError(
"Test Data Directory (" . $tst_data_dir
983 .
") not writeable.", $ilias->error_obj->FATAL);
987 $tst_dir = $tst_data_dir .
"/tst_import";
989 if (!@is_dir($tst_dir)) {
990 $ilias->raiseError(
"Creation of test import directory failed.", $ilias->error_obj->FATAL);
1008 $ilDB = $DIC[
'ilDB'];
1011 "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",
1017 if (strcmp(
$row[
'foundtypes'],
'assSingleChoice') == 0) {
1033 $ilDB = $DIC[
'ilDB'];
1036 "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",
1040 if (
$result->numRows() == 1) {
1042 if (strcmp(
$row[
'foundtypes'],
'assSingleChoice') == 0) {
1060 $ilDB = $DIC[
'ilDB'];
1068 SELECT DISTINCT(qpl_qst_sc.shuffle) foundshuffles 1074 WHERE tst_test_result.question_fi = qpl_questions.question_id 1075 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id 1076 AND tst_test_result.active_fi = tst_active.active_id 1077 AND qpl_questions.question_id = qpl_qst_sc.question_fi 1078 AND tst_active.test_fi = %s 1079 AND qpl_qst_type.type_tag = %s 1081 array(
'integer',
'text'),
1082 array($this->
getTestId(),
'assSingleChoice')
1084 if (
$result->numRows() == 1) {
1086 return (
$row[
'foundshuffles'] == 0);
1099 if (!count($this->mark_schema->mark_steps)) {
1119 $tree = $DIC[
'tree'];
1120 $ilDB = $DIC[
'ilDB'];
1121 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
1124 $test->loadFromDb();
1126 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1129 return $test->isComplete($testQuestionSetConfigFactory->getQuestionSetConfig());
1141 $ilDB = $DIC[
'ilDB'];
1145 if (!preg_match(
'/\d+/', $this->
getECTSFX())) {
1152 SET ects_output = %s, ects_a = %s, ects_b = %s, ects_c = %s, ects_d = %s, ects_e = %s, ects_fx = %s 1153 WHERE test_id = %s",
1154 array(
'text',
'float',
'float',
'float',
'float',
'float',
'float',
'integer'),
1157 $grades[
'A'], $grades[
'B'], $grades[
'C'], $grades[
'D'], $grades[
'E'],
1172 $ilDB = $DIC[
'ilDB'];
1175 if ($this->
isComplete($testQuestionSetConfig)) {
1180 "UPDATE tst_tests SET complete = %s WHERE test_id = %s",
1181 array(
'text',
'integer'),
1182 array($complete, $this->test_id)
1207 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1208 $completecontent =
"";
1210 $completecontent .= $content;
1227 $tree = $DIC[
'tree'];
1228 $ilDB = $DIC[
'ilDB'];
1229 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
1236 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1238 $testQuestionSetConfig = $testQuestionSetConfigFactory->getQuestionSetConfig();
1240 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1241 if ($this->test_id == -1) {
1243 $next_id =
$ilDB->nextId(
'tst_tests');
1245 $ilDB->insert(
'tst_tests', array(
1246 'test_id' => array(
'integer', $next_id),
1247 'obj_fi' => array(
'integer', $this->
getId()),
1248 'author' => array(
'text', $this->
getAuthor()),
1252 'showinfo' => array(
'integer', $this->
getShowInfo()),
1253 'forcejs' => array(
'integer', $this->
getForceJS()),
1265 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1266 'kiosk' => array(
'integer', $this->
getKiosk()),
1277 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1279 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : null),
1280 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : null),
1281 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : null),
1282 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : null),
1283 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : null),
1284 'ects_fx' => array(
'float', $this->
getECTSFX()),
1293 'password' => array(
'text', $this->
getPassword()),
1301 'created' => array(
'integer', time()),
1302 'tstamp' => array(
'integer', time()),
1304 'template_id' => array(
'integer', $this->
getTemplate()),
1305 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1320 'autosave' => array(
'integer', (
int) $this->
getAutosave()),
1343 'pass_waiting' => array(
'text', (
string) $this->
getPassWaiting())
1346 $this->test_id = $next_id;
1356 "SELECT * FROM tst_tests WHERE test_id = %s",
1358 array($this->test_id)
1360 if (
$result->numRows() == 1) {
1368 'author' => array(
'text', $this->
getAuthor()),
1372 'showinfo' => array(
'integer', $this->
getShowInfo()),
1373 'forcejs' => array(
'integer', $this->
getForceJS()),
1385 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1386 'kiosk' => array(
'integer', $this->
getKiosk()),
1397 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1399 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : null),
1400 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : null),
1401 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : null),
1402 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : null),
1403 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : null),
1404 'ects_fx' => array(
'float', $this->
getECTSFX()),
1413 'password' => array(
'text', $this->
getPassword()),
1421 'tstamp' => array(
'integer', time()),
1423 'template_id' => array(
'integer', $this->
getTemplate()),
1424 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1439 'autosave' => array(
'integer', (
int) $this->
getAutosave()),
1462 'pass_waiting' => array(
'text', (
string) $this->
getPassWaiting())
1465 'test_id' => array(
'integer', (
int) $this->
getTestId())
1469 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1471 $logresult =
$ilDB->queryF(
1472 "SELECT * FROM tst_tests WHERE test_id = %s",
1477 if ($logresult->numRows() == 1) {
1478 $newrow =
$ilDB->fetchAssoc($logresult);
1480 $changed_fields = array();
1481 foreach ($oldrow as
$key => $value) {
1482 if (strcmp($oldrow[
$key], $newrow[$key]) != 0) {
1483 array_push($changed_fields,
"$key: " . $oldrow[$key] .
" => " . $newrow[$key]);
1486 $changes = join(
", ", $changed_fields);
1487 if (count($changed_fields) > 0) {
1495 $aresult =
$ilDB->queryF(
1496 "SELECT active_id FROM tst_active WHERE test_fi = %s AND tries >= %s AND submitted = %s",
1497 array(
'integer',
'integer',
'integer'),
1500 while (
$row =
$ilDB->fetchAssoc($aresult)) {
1502 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1503 array(
'integer',
'timestamp',
'integer'),
1504 array(1, date(
'Y-m-d H:i:s'),
$row[
"active_id"])
1509 $aresult =
$ilDB->queryF(
1510 "SELECT active_id FROM tst_active WHERE test_fi = %s AND tries < %s AND submitted = %s",
1511 array(
'integer',
'integer',
'integer'),
1514 while (
$row =
$ilDB->fetchAssoc($aresult)) {
1516 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1517 array(
'integer',
'timestamp',
'integer'),
1518 array(0, null,
$row[
"active_id"])
1523 $aresult =
$ilDB->queryF(
1524 "SELECT active_id FROM tst_active WHERE test_fi = %s AND submitted = %s",
1525 array(
'integer',
'integer'),
1528 while (
$row =
$ilDB->fetchAssoc($aresult)) {
1530 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1531 array(
'integer',
'timestamp',
'integer'),
1532 array(0, null,
$row[
"active_id"])
1540 include_once
'Services/News/classes/class.ilNewsItem.php';
1545 $newsItem->setContext($this->
getId(),
'tst');
1547 $newsItem->setTitle(
'new_test_online');
1548 $newsItem->setContentIsLangVar(
true);
1549 $newsItem->setContent(
'');
1550 $newsItem->setUserId(
$ilUser->getId());
1552 $newsItem->create();
1559 $newsItem->setTitle(
'new_test_online');
1560 $newsItem->setContentIsLangVar(
true);
1561 $newsItem->setContent(
'');
1562 $newsItem->update();
1567 if ($this->ref_id) {
1568 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
1581 $item->update($this->ref_id);
1584 if (!$properties_only) {
1589 $this->mark_schema->saveToDb($this->test_id);
1602 $ilDB = $DIC[
'ilDB'];
1604 $oldquestions = array();
1605 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
1608 "SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1614 array_push($oldquestions,
$row[
"question_fi"]);
1620 $currentQuestionsObligationsQuery =
'SELECT question_fi, obligatory FROM tst_test_question WHERE test_fi = %s';
1621 $rset =
$ilDB->queryF($currentQuestionsObligationsQuery, array(
'integer'), array($this->
getTestId()));
1622 while (
$row =
$ilDB->fetchAssoc($rset)) {
1623 $obligatoryQuestionState[
$row[
'question_fi']] = $row[
'obligatory'];
1626 $affectedRows =
$ilDB->manipulateF(
1627 "DELETE FROM tst_test_question WHERE test_fi = %s",
1632 foreach ($this->questions as
$key => $value) {
1634 if (!isset($obligatoryQuestionState[$value]) || is_null($obligatoryQuestionState[$value])) {
1635 $obligatoryQuestionState[$value] = 0;
1639 $next_id =
$ilDB->nextId(
'tst_test_question');
1640 $ilDB->insert(
'tst_test_question', array(
1641 'test_question_id' => array(
'integer', $next_id),
1642 'test_fi' => array(
'integer', $this->
getTestId()),
1643 'question_fi' => array(
'integer', $value),
1644 'sequence' => array(
'integer',
$key),
1645 'obligatory' => array(
'integer', $obligatoryQuestionState[$value]),
1646 'tstamp' => array(
'integer', time())
1649 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1652 "SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1656 $newquestions = array();
1659 array_push($newquestions,
$row[
"question_fi"]);
1662 foreach ($oldquestions as
$index => $question_id) {
1663 if (strcmp($newquestions[
$index], $question_id) != 0) {
1664 $pos = array_search($question_id, $newquestions);
1665 if ($pos ===
false) {
1672 foreach ($newquestions as
$index => $question_id) {
1673 if (array_search($question_id, $oldquestions) ===
false) {
1688 $ilDB = $DIC[
'ilDB'];
1690 'SELECT copy_id FROM tst_rnd_cpy WHERE tst_fi = %s',
1694 return $result->numRows() > 0;
1712 $rbacsystem = $DIC[
'rbacsystem'];
1713 $ilDB = $DIC[
'ilDB'];
1716 if (($questionpool != 0) && (!$use_obj_id)) {
1722 "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",
1726 $original_ids = array();
1727 $paramtypes = array();
1728 $paramvalues = array();
1730 array_push($original_ids,
$row[
'original_id']);
1735 if (($questionpool == 0) && (!is_array($qpls))) {
1736 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
1738 if (count($available_pools)) {
1739 $available =
" AND " .
$ilDB->in(
'obj_fi', $available_pools,
false,
'integer');
1745 $constraint_qpls =
"";
1746 $result_array = array();
1747 if ($questionpool == 0) {
1748 if (is_array($qpls)) {
1749 if (count($qpls) > 0) {
1750 $constraint_qpls =
" AND " .
$ilDB->in(
'obj_fi', $qpls,
false,
'integer');
1755 $original_clause =
"";
1756 if (count($original_ids)) {
1757 $original_clause =
" AND " .
$ilDB->in(
'question_id', $original_ids,
true,
'integer');
1760 if ($questionpool == 0) {
1762 "SELECT question_id FROM qpl_questions WHERE original_id IS NULL $available $constraint_qpls AND owner > %s AND complete = %s $original_clause",
1763 array(
'integer',
'text'),
1768 "SELECT question_id FROM qpl_questions WHERE original_id IS NULL AND obj_fi = %s AND owner > %s AND complete = %s $original_clause",
1769 array(
'integer',
'integer',
'text'),
1770 array($questionpool, 0,
"1")
1773 $found_ids = array();
1775 array_push($found_ids,
$row[
'question_id']);
1777 $nr_of_questions = ($nr_of_questions > count($found_ids)) ? count($found_ids) : $nr_of_questions;
1778 if ($nr_of_questions == 0) {
1781 $rand_keys = array_rand($found_ids, $nr_of_questions);
1783 if (is_array($rand_keys)) {
1784 foreach ($rand_keys as
$key) {
1788 $result[$found_ids[$rand_keys]] = $found_ids[$rand_keys];
1803 $ilDB = $DIC[
'ilDB'];
1806 "SELECT test_result_id FROM tst_test_result WHERE active_fi = %s AND pass = %s",
1807 array(
'integer',
'integer'),
1808 array($active_id,
$pass)
1826 $ilDB = $DIC[
'ilDB'];
1828 "SELECT test_random_question_id FROM tst_test_rnd_qst WHERE active_fi = %s AND pass = %s",
1829 array(
'integer',
'integer'),
1830 array($active_id,
$pass)
1832 return (
$result->numRows() > 0) ?
true :
false;
1841 $ilDB = $DIC[
'ilDB'];
1844 "SELECT * FROM tst_tests WHERE obj_fi = %s",
1846 array($this->
getId())
1848 if (
$result->numRows() == 1) {
1855 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1892 "A" =>
$data->ects_a,
1893 "B" =>
$data->ects_b,
1894 "C" =>
$data->ects_c,
1895 "D" =>
$data->ects_d,
1896 "E" =>
$data->ects_e
1900 $this->mark_schema->flush();
1901 $this->mark_schema->loadFromDb($this->
getTestId());
1959 if ($this->ref_id) {
1960 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
1962 switch ($activation[
"timing_type"]) {
1987 $ilDB = $DIC[
'ilDB'];
1989 $this->questions = array();
1991 if (strcmp($active_id,
"") == 0) {
1994 if (is_null(
$pass)) {
1995 $pass = self::_getPass($active_id);
1998 "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",
1999 array(
'integer',
'integer'),
2000 array($active_id,
$pass)
2006 if (
$result->numRows() == 0) {
2008 "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",
2015 "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",
2017 array($this->test_id)
2022 $this->questions[
$index++] =
$data[
"question_fi"];
2050 return (strlen($this->introduction)) ? $this->introduction : null;
2075 $this->_finalstatement = $a_statement;
2087 $this->_showinfo = ($a_info) ? 1 : 0;
2099 $this->_forcejs = ($a_js) ? 1 : 0;
2111 $this->_customStyle = $a_customStyle;
2123 return (strlen($this->_customStyle)) ? $this->_customStyle : null;
2136 $css_path = str_replace(
"ta.css",
"customstyles", $css_path) .
"/";
2137 $customstyles = array();
2138 if (is_dir($css_path)) {
2140 include_once
"./Services/Utilities/classes/class.ilFileUtils.php";
2144 if (strpos($filename,
".css")) {
2145 array_push($customstyles, $filename);
2150 return $customstyles;
2165 if (file_exists($custom)) {
2167 $custom = str_replace(
"ta.css",
"customstyles/" . $this->
getCustomStyle(), $custom);
2186 $this->_showfinalstatement = ($show) ? 1 : 0;
2197 return (strlen($this->_finalstatement)) ? $this->_finalstatement : null;
2209 return ($this->_showinfo) ? 1 : 0;
2221 return ($this->_forcejs) ? 1 : 0;
2233 return ($this->_showfinalstatement) ? 1 : 0;
2253 return ($this->ects_output) ? 1 : 0;
2261 $this->ects_output = $a_ects_output ? 1 : 0;
2269 return (strlen($this->ects_fx)) ? $this->ects_fx : null;
2277 $this->ects_fx = $a_ects_fx;
2293 $this->ects_grades = $a_ects_grades;
2303 return ($this->sequence_settings) ? $this->sequence_settings : 0;
2353 switch ($instant_feedback) {
2355 $this->instant_verification = 1;
2358 $this->instant_verification = 0;
2374 $this->answer_feedback = 1;
2377 $this->answer_feedback = 0;
2389 switch ($generic_answer_feedback) {
2391 $this->answer_feedback = 1;
2394 $this->answer_feedback = 0;
2410 $this->answer_feedback_points = 1;
2413 $this->answer_feedback_points = 0;
2425 $this->reporting_date =
'';
2447 return ($this->score_reporting) ? $this->score_reporting : 0;
2453 case self::SCORE_REPORTING_FINISHED:
2454 case self::SCORE_REPORTING_IMMIDIATLY:
2455 case self::SCORE_REPORTING_DATE:
2456 case self::SCORE_REPORTING_AFTER_PASSED:
2460 case self::SCORE_REPORTING_DISABLED:
2476 return ($this->instant_verification) ? $this->instant_verification : 0;
2489 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2500 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2512 return ($this->answer_feedback_points) ? $this->answer_feedback_points : 0;
2524 return ($this->count_system) ? $this->count_system : 0;
2537 $ilDB = $DIC[
'ilDB'];
2539 "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",
2545 return $row[
"count_system"];
2559 return ($this->mc_scoring) ? $this->mc_scoring : 0;
2571 return ($this->score_cutting) ? $this->score_cutting : 0;
2583 return ($this->pass_scoring) ? $this->pass_scoring : 0;
2596 $ilDB = $DIC[
'ilDB'];
2598 "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",
2604 return $row[
"pass_scoring"];
2619 $ilDB = $DIC[
'ilDB'];
2621 "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",
2627 return $row[
"mc_scoring"];
2642 $ilDB = $DIC[
'ilDB'];
2644 "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",
2650 return $row[
"score_cutting"];
2664 return (strlen($this->reporting_date)) ? $this->reporting_date : null;
2676 return ($this->nr_of_tries) ? $this->nr_of_tries : 0;
2688 return ($this->_kiosk) ? $this->_kiosk : 0;
2701 $this->_kiosk = $kiosk;
2713 if (($this->_kiosk & 1) > 0) {
2730 $this->_kiosk = $this->_kiosk | 1;
2733 $this->_kiosk = $this->_kiosk ^ 1;
2747 if (($this->_kiosk & 2) > 0) {
2763 $this->_kiosk = $this->_kiosk | 2;
2766 $this->_kiosk = $this->_kiosk ^ 2;
2780 if (($this->_kiosk & 4) > 0) {
2795 if ($a_participant) {
2796 $this->_kiosk = $this->_kiosk | 4;
2799 $this->_kiosk = $this->_kiosk ^ 4;
2813 return ($this->use_previous_answers) ? $this->use_previous_answers : 0;
2825 return ($this->title_output) ? $this->title_output : 0;
2839 $ilDB = $DIC[
'ilDB'];
2842 "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",
2848 return $row[
"title_output"];
2857 return self::_getUsePreviousAnswers($activeId,
true);
2873 $ilDB = $DIC[
'ilDB'];
2879 "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",
2889 if ($user_active_user_setting) {
2890 $res =
$ilUser->getPref(
"tst_use_previous_answers");
2891 if (
$res !==
false) {
2908 return (strlen($this->processing_time)) ? $this->processing_time : null;
2919 if (strlen($this->processing_time)) {
2920 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches)) {
2921 if ((
int) $matches[1] + (
int) $matches[2] + (
int) $matches[3] == 0) {
2925 'hh' => $matches[1],
2926 'mm' => $matches[2],
2927 'ss' => $matches[3],
2937 if (strlen($this->processing_time)) {
2938 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches)) {
2939 return ($matches[1] * 60) + $matches[2];
2943 return self::DEFAULT_PROCESSING_TIME_MINUTES;
2955 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $this->
getProcessingTime(), $matches)) {
2957 return ($matches[1] * 3600) + ($matches[2] * 60) + $matches[3] + $extratime;
2975 return $ending - $now;
2990 return ($this->enable_processing_time) ? $this->enable_processing_time : 0;
3002 return ($this->reset_processing_time) ? $this->reset_processing_time : 0;
3030 return ($this->starting_time != 0) ? $this->starting_time : 0;
3070 return ($this->ending_time != 0) ? $this->ending_time : 0;
3107 $this->use_previous_answers = 1;
3109 $this->use_previous_answers = 0;
3141 $this->title_output = 1;
3144 $this->title_output = 2;
3147 $this->title_output = 0;
3166 $this->processing_time = sprintf(
"%02d:%02d:00", floor($minutes / 60), $minutes % 60);
3179 $this->enable_processing_time =
"1";
3181 $this->enable_processing_time =
"0";
3195 $this->reset_processing_time = 1;
3197 $this->reset_processing_time = 0;
3210 $this->count_system = $a_count_system;
3238 return (strlen($this->password)) ? $this->password : null;
3250 $this->password = $a_password;
3262 $this->score_cutting = $a_score_cutting;
3274 $this->mc_scoring = $a_mc_scoring;
3286 switch ($a_pass_scoring) {
3334 $DIC[
'ilPluginAdmin'],
3338 foreach ($activeIds as $activeId) {
3342 foreach ($passSelector->getExistingPasses() as
$pass) {
3343 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($activeId,
$pass);
3346 $testSequence->removeQuestion($questionId, $reindexedSequencePositionMap);
3357 foreach ($removeQuestionIds as $value) {
3374 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3378 $question->delete($question_id);
3394 $ilDB = $DIC[
'ilDB'];
3397 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3399 $participantData->setUserIdsFilter($userIds);
3400 $participantData->load($this->
getTestId());
3413 require_once
'Services/Object/classes/class.ilObjectLP.php';
3415 $testLP->setTestObject($this);
3416 $testLP->resetLPDataForUserIds($participantData->
getUserIds(),
false);
3427 $ilDB = $DIC[
'ilDB'];
3430 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3432 $participantData->setUserIdsFilter($userIds);
3433 $participantData->load($this->
getTestId());
3435 $IN_userIds =
$ilDB->in(
'usr_id', $participantData->getUserIds(),
false,
'integer');
3437 "DELETE FROM usr_pref WHERE $IN_userIds AND keyword = %s",
3439 array(
"tst_password_" . $this->
getTestId())
3442 if (count($participantData->getActiveIds())) {
3450 $ilDB = $DIC[
'ilDB'];
3452 $IN_activeIds =
$ilDB->in(
'active_fi', $activeIds,
false,
'integer');
3454 $ilDB->manipulate(
"DELETE FROM tst_solutions WHERE $IN_activeIds");
3455 $ilDB->manipulate(
"DELETE FROM tst_qst_solved WHERE $IN_activeIds");
3456 $ilDB->manipulate(
"DELETE FROM tst_test_result WHERE $IN_activeIds");
3457 $ilDB->manipulate(
"DELETE FROM tst_pass_result WHERE $IN_activeIds");
3458 $ilDB->manipulate(
"DELETE FROM tst_result_cache WHERE $IN_activeIds");
3459 $ilDB->manipulate(
"DELETE FROM tst_sequence WHERE $IN_activeIds");
3460 $ilDB->manipulate(
"DELETE FROM tst_times WHERE $IN_activeIds");
3463 $ilDB->manipulate(
"DELETE FROM tst_test_rnd_qst WHERE $IN_activeIds");
3465 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_tracking WHERE $IN_activeIds");
3466 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_answstatus WHERE $IN_activeIds");
3467 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_postponed WHERE $IN_activeIds");
3468 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_checked WHERE $IN_activeIds");
3471 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3473 foreach ($activeIds as $active_id) {
3475 if (@is_dir(CLIENT_WEB_DIR .
"/assessment/tst_" . $this->
getTestId() .
"/$active_id")) {
3484 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
3491 $ilDB = $DIC[
'ilDB'];
3493 $IN_activeIds =
$ilDB->in(
'active_id', $activeIds,
false,
'integer');
3494 $ilDB->manipulate(
"DELETE FROM tst_active WHERE $IN_activeIds");
3507 $ilDB = $DIC[
'ilDB'];
3511 "SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3512 array(
'integer',
'integer'),
3516 if (
$data->sequence > 1) {
3519 "SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3520 array(
'integer',
'integer'),
3525 $affectedRows =
$ilDB->manipulateF(
3526 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3527 array(
'integer',
'integer'),
3528 array(
$data->sequence, $data_previous->test_question_id)
3531 $affectedRows =
$ilDB->manipulateF(
3532 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3533 array(
'integer',
'integer'),
3534 array(
$data->sequence - 1,
$data->test_question_id)
3536 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3554 $ilDB = $DIC[
'ilDB'];
3558 "SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3559 array(
'integer',
'integer'),
3564 "SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3565 array(
'integer',
'integer'),
3568 if (
$result->numRows() == 1) {
3572 $affectedRows =
$ilDB->manipulateF(
3573 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3574 array(
'integer',
'integer'),
3575 array(
$data->sequence, $data_next->test_question_id)
3578 $affectedRows =
$ilDB->manipulateF(
3579 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3580 array(
'integer',
'integer'),
3581 array(
$data->sequence + 1,
$data->test_question_id)
3583 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3603 $duplicate_id = $question->duplicate(
true, null, null, null, $this->
getId());
3605 return $duplicate_id;
3619 $ilDB = $DIC[
'ilDB'];
3620 #var_dump($question_id); 3622 $duplicate_id = $question_id;
3629 "SELECT MAX(sequence) seq FROM tst_test_question WHERE test_fi=%s",
3635 if (
$result->numRows() == 1) {
3637 $sequence =
$data->seq + 1;
3640 $next_id =
$ilDB->nextId(
'tst_test_question');
3641 $affectedRows =
$ilDB->manipulateF(
3642 "INSERT INTO tst_test_question (test_question_id, test_fi, question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
3643 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
3644 array($next_id, $this->
getTestId(), $duplicate_id, $sequence, time())
3646 if ($affectedRows == 1) {
3647 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3653 $affectedRows =
$ilDB->manipulateF(
3654 "DELETE FROM tst_active WHERE test_fi = %s",
3660 return $duplicate_id;
3675 $ilDB = $DIC[
'ilDB'];
3677 "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",
3682 array_push($titles,
$row[
"title"]);
3700 $ilDB = $DIC[
'ilDB'];
3702 "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",
3707 $titles[
$row[
'question_id']] = $row[
"title"];
3729 } elseif (isset($nr)) {
3730 return $this->lng->txt(
"ass_question") .
' ' . $nr;
3732 return $this->lng->txt(
"ass_question");
3751 $ilDB = $DIC[
'ilDB'];
3754 "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",
3772 $ilDB = $DIC[
'ilDB'];
3774 $existing_questions = array();
3777 if (is_null(
$pass)) {
3781 "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",
3782 array(
'integer',
'integer'),
3783 array($active_id,
$pass)
3787 "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",
3793 if (
$data->original_id === null) {
3797 array_push($existing_questions,
$data->original_id);
3799 return $existing_questions;
3812 $ilDB = $DIC[
'ilDB'];
3814 if ($question_id < 1) {
3818 "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",
3822 if (
$result->numRows() == 1) {
3824 return $data->type_tag;
3839 $ilDB = $DIC[
'ilDB'];
3841 $next_id =
$ilDB->nextId(
'tst_times');
3842 $affectedRows =
$ilDB->manipulateF(
3843 "INSERT INTO tst_times (times_id, active_fi, started, finished, pass, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
3844 array(
'integer',
'integer',
'timestamp',
'timestamp',
'integer',
'integer'),
3845 array($next_id, $active_id, strftime(
"%Y-%m-%d %H:%M:%S"), strftime(
"%Y-%m-%d %H:%M:%S"),
$pass, time())
3859 $ilDB = $DIC[
'ilDB'];
3861 $affectedRows =
$ilDB->manipulateF(
3862 "UPDATE tst_times SET finished = %s, tstamp = %s WHERE times_id = %s",
3863 array(
'timestamp',
'integer',
'integer'),
3864 array(strftime(
"%Y-%m-%d %H:%M:%S"), time(), $times_id)
3878 $ilDB = $DIC[
'ilDB'];
3880 if (is_null(
$pass)) {
3882 "SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3883 array(
'integer',
'integer'),
3884 array($active_id, 0)
3888 "SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3889 array(
'integer',
'integer'),
3890 array($active_id,
$pass)
3893 $result_array = array();
3895 array_push($result_array,
$row[
"question_fi"]);
3897 return $result_array;
3911 return ((($currentpass > 0) && ($num == 0)) || $this->
isTestFinished($active_id)) ? true :
false;
3924 $ilDB = $DIC[
'ilDB'];
3926 $result_array = array();
3930 if (count($this->questions) == 0) {
3931 return $result_array;
3933 if (is_null(
$pass)) {
3934 $pass = self::_getPass($active_id);
3937 "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'),
3938 array(
'integer',
'integer'),
3939 array($active_id,
$pass)
3942 if (count($this->questions) == 0) {
3943 return $result_array;
3945 $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'));
3948 $result_array[
$row[
"question_id"]] =
$row;
3950 return $result_array;
3964 $ilDB = $DIC[
'ilDB'];
3972 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
3973 array(
'integer',
'integer',
'text'),
3976 } elseif (strlen($anonymous_id)) {
3978 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
3979 array(
'integer',
'integer',
'text'),
3980 array($user_id, $this->test_id, $anonymous_id)
3983 if (
$GLOBALS[
'DIC'][
'ilUser']->
getId() == ANONYMOUS_USER_ID) {
3987 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
3988 array(
'integer',
'integer'),
3989 array($user_id, $this->test_id)
3994 return $row[
"active_id"];
4011 $ilDB = $DIC[
'ilDB'];
4021 "SELECT tst_active.active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
4022 array(
'integer',
'integer'),
4027 return $row[
"active_id"];
4041 $keys = array_keys($array);
4057 public function &
getTestResult($active_id,
$pass = null, $ordered_sequence =
false, $considerHiddenQuestions =
true, $considerOptionalQuestions =
true)
4060 $tree = $DIC[
'tree'];
4061 $ilDB = $DIC[
'ilDB'];
4063 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
4067 if (is_null(
$pass)) {
4071 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
4073 $testSession = $testSessionFactory->getSession($active_id);
4075 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4077 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id,
$pass);
4080 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4082 $dynamicQuestionSetConfig->loadFromDb();
4089 $testSequence->setConsiderHiddenQuestionsEnabled($considerHiddenQuestions);
4090 $testSequence->setConsiderOptionalQuestionsEnabled($considerOptionalQuestions);
4095 if ($ordered_sequence) {
4102 $arrResults = array();
4105 SELECT tst_test_result.question_fi, 4106 tst_test_result.points reached, 4107 tst_test_result.hint_count requested_hints, 4108 tst_test_result.hint_points hint_points, 4109 tst_test_result.answered answered 4111 FROM tst_test_result 4113 LEFT JOIN tst_solutions 4114 ON tst_solutions.active_fi = tst_test_result.active_fi 4115 AND tst_solutions.question_fi = tst_test_result.question_fi 4117 WHERE tst_test_result.active_fi = %s 4118 AND tst_test_result.pass = %s 4121 $solutionresult =
$ilDB->queryF(
4123 array(
'integer',
'integer'),
4124 array($active_id,
$pass)
4127 while (
$row =
$ilDB->fetchAssoc($solutionresult)) {
4128 $arrResults[
$row[
'question_fi'] ] =
$row;
4131 $numWorkedThrough = count($arrResults);
4133 require_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
4135 $IN_question_ids =
$ilDB->in(
'qpl_questions.question_id', $sequence,
false,
'integer');
4138 SELECT qpl_questions.*, 4139 qpl_qst_type.type_tag, 4140 qpl_sol_sug.question_fi has_sug_sol 4145 LEFT JOIN qpl_sol_sug 4146 ON qpl_sol_sug.question_fi = qpl_questions.question_id 4148 WHERE qpl_qst_type.question_type_id = qpl_questions.question_type_fi 4149 AND $IN_question_ids 4154 $unordered = array();
4158 $obligationsAnswered =
true;
4162 $row[
'points'] ? $arrResults[
$row[
'question_id'] ][
'reached'] /
$row[
'points'] : 0
4165 if ($percentvalue < 0) {
4166 $percentvalue = 0.0;
4172 "max" => round(
$row[
'points'], 2),
4173 "reached" => round($arrResults[
$row[
'question_id']][
'reached'], 2),
4174 'requested_hints' => $arrResults[$row[
'question_id']][
'requested_hints'],
4175 'hint_points' => $arrResults[$row[
'question_id']][
'hint_points'],
4176 "percent" => sprintf(
"%2.2f ", ($percentvalue) * 100) .
"%",
4178 "type" => $row[
"type_tag"],
4179 "qid" => $row[
'question_id'],
4180 "original_id" => $row[
"original_id"],
4181 "workedthrough" => isset($arrResults[$row[
'question_id']]) ? 1 : 0,
4182 'answered' => $arrResults[$row[
'question_id']][
'answered']
4185 if (!$arrResults[ $row[
'question_id'] ][
'answered']) {
4186 $obligationsAnswered =
false;
4189 $unordered[ $row[
'question_id'] ] =
$data;
4194 $numQuestionsTotal = count($unordered);
4198 $pass_requested_hints = 0;
4199 $pass_hint_points = 0;
4204 foreach ($sequence as $qid) {
4207 $pass_max += round($unordered[$qid][
'max'], 2);
4208 $pass_reached += round($unordered[$qid][
'reached'], 2);
4209 $pass_requested_hints += $unordered[$qid][
'requested_hints'];
4210 $pass_hint_points += $unordered[$qid][
'hint_points'];
4214 $unordered[$qid][
'nr'] =
$key;
4215 array_push($found, $unordered[$qid]);
4224 if (
$results[
'reached_points'] < 0) {
4228 if ($pass_reached < 0) {
4233 $found[
'pass'][
'total_max_points'] = $pass_max;
4234 $found[
'pass'][
'total_reached_points'] = $pass_reached;
4235 $found[
'pass'][
'total_requested_hints'] = $pass_requested_hints;
4236 $found[
'pass'][
'total_hint_points'] = $pass_hint_points;
4237 $found[
'pass'][
'percent'] = ($pass_max > 0) ? $pass_reached / $pass_max : 0;
4238 $found[
'pass'][
'obligationsAnswered'] = $obligationsAnswered;
4239 $found[
'pass'][
'num_workedthrough'] = $numWorkedThrough;
4240 $found[
'pass'][
'num_questions_total'] = $numQuestionsTotal;
4242 $found[
"test"][
"total_max_points"] =
$results[
'max_points'];
4243 $found[
"test"][
"total_reached_points"] =
$results[
'reached_points'];
4244 $found[
"test"][
"total_requested_hints"] =
$results[
'hint_count'];
4245 $found[
"test"][
"total_hint_points"] =
$results[
'hint_points'];
4246 $found[
"test"][
"result_pass"] =
$results[
'pass'];
4247 $found[
'test'][
'result_tstamp'] =
$results[
'tstamp'];
4248 $found[
'test'][
'obligations_answered'] =
$results[
'obligations_answered'];
4250 if ((!$total_reached_points)
or (!$total_max_points)) {
4253 $percentage = ($total_reached_points / $total_max_points) * 100.0;
4255 if ($percentage < 0) {
4260 $found[
"test"][
"passed"] =
$results[
'passed'];
4274 $ilDB = $DIC[
'ilDB'];
4277 "SELECT COUNT(active_id) total FROM tst_active WHERE test_fi = %s",
4282 return $row[
"total"];
4294 $ilDB = $DIC[
'ilDB'];
4297 "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",
4298 array(
'integer',
'integer'),
4303 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4304 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4305 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4306 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4307 $time += ($epoch_2 - $epoch_1);
4333 $ilDB = $DIC[
'ilDB'];
4336 "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",
4343 if (!array_key_exists(
$row[
"active_fi"], $times)) {
4344 $times[
$row[
"active_fi"]] = 0;
4346 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4347 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4348 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4349 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4350 $times[
$row[
"active_fi"]] += ($epoch_2 - $epoch_1);
4364 $ilDB = $DIC[
'ilDB'];
4367 "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",
4368 array(
'integer',
'integer'),
4373 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4374 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4375 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4376 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4377 $time += ($epoch_2 - $epoch_1);
4391 $ilDB = $DIC[
'ilDB'];
4394 "SELECT * FROM tst_times WHERE active_fi = %s AND pass = %s ORDER BY started",
4395 array(
'integer',
'integer'),
4396 array($active_id,
$pass)
4400 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4401 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4402 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4403 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4404 $time += ($epoch_2 - $epoch_1);
4432 $ilDB = $DIC[
'ilDB'];
4435 "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",
4436 array(
'integer',
'integer'),
4442 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches);
4443 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4444 if ($firstvisit == 0 || $epoch_1 < $firstvisit) {
4445 $firstvisit = $epoch_1;
4447 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"finished"], $matches);
4448 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4449 if ($epoch_2 > $lastvisit) {
4450 $lastvisit = $epoch_2;
4453 return array(
"firstvisit" => $firstvisit,
"lastvisit" => $lastvisit);
4465 $ilDB = $DIC[
'ilDB'];
4470 "SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.active_id = %s AND tst_active.active_id = tst_times.active_fi",
4478 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->started, $matches);
4479 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4480 if (!$first_visit) {
4481 $first_visit = $epoch_1;
4483 if ($epoch_1 < $first_visit) {
4484 $first_visit = $epoch_1;
4486 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->finished, $matches);
4487 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4489 $last_visit = $epoch_2;
4491 if ($epoch_2 > $last_visit) {
4492 $last_visit = $epoch_2;
4494 $times[
$row->active_fi] += ($epoch_2 - $epoch_1);
4497 foreach ($times as
$key => $value) {
4498 $max_time += $value;
4500 if ((!$test_result[
"test"][
"total_reached_points"])
or (!$test_result[
"test"][
"total_max_points"])) {
4503 $percentage = ($test_result[
"test"][
"total_reached_points"] / $test_result[
"test"][
"total_max_points"]) * 100.0;
4504 if ($percentage < 0) {
4508 $mark_obj = $this->mark_schema->getMatchingMark($percentage);
4509 $first_date = getdate($first_visit);
4510 $last_date = getdate($last_visit);
4511 $qworkedthrough = 0;
4512 foreach ($test_result as
$key => $value) {
4513 if (preg_match(
"/\d+/",
$key)) {
4514 $qworkedthrough += $value[
"workedthrough"];
4517 if (!$qworkedthrough) {
4520 $atimeofwork = $max_time / $qworkedthrough;
4523 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4529 $result_mark = $mark_obj->getShortName();
4531 if ($mark_obj->getPassed() && $obligationsAnswered) {
4537 $percent_worked_through = 0;
4538 if (count($this->questions)) {
4539 $percent_worked_through = $qworkedthrough / count($this->questions);
4541 $result_array = array(
4542 "qworkedthrough" => $qworkedthrough,
4543 "qmax" => count($this->questions),
4544 "pworkedthrough" => $percent_worked_through,
4545 "timeofwork" => $max_time,
4546 "atimeofwork" => $atimeofwork,
4547 "firstvisit" => $first_date,
4548 "lastvisit" => $last_date,
4549 "resultspoints" => $test_result[
"test"][
"total_reached_points"],
4550 "maxpoints" => $test_result[
"test"][
"total_max_points"],
4551 "resultsmarks" => $result_mark,
4552 "passed" => $passed,
4553 "distancemedian" =>
"0" 4555 foreach ($test_result as
$key => $value) {
4556 if (preg_match(
"/\d+/",
$key)) {
4557 $result_array[
$key] = $value;
4560 return $result_array;
4572 $totalpoints_array = array();
4574 foreach ($all_users as $active_id => $user_name) {
4576 $reached = $test_result[
"test"][
"total_reached_points"];
4577 $total = $test_result[
"test"][
"total_max_points"];
4579 $mark = $this->mark_schema->getMatchingMark($percentage * 100.0);
4581 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4584 if ($mark->getPassed() && $obligationsAnswered) {
4585 array_push($totalpoints_array, $test_result[
"test"][
"total_reached_points"]);
4589 return $totalpoints_array;
4600 $ilDB = $DIC[
'ilDB'];
4602 "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",
4606 $persons_array = array();
4608 $name = $this->lng->txt(
"anonymous");
4609 $fullname = $this->lng->txt(
"anonymous");
4612 if (strlen(
$row[
"firstname"] .
$row[
"lastname"] .
$row[
"title"]) == 0) {
4613 $name = $this->lng->txt(
"deleted_user");
4614 $fullname = $this->lng->txt(
"deleted_user");
4615 $login = $this->lng->txt(
"unknown");
4618 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4619 $name = $this->lng->txt(
"anonymous");
4620 $fullname = $this->lng->txt(
"anonymous");
4622 $name = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4623 $fullname = trim($row[
"title"] .
" " . $row[
"firstname"] .
" " . $row[
"lastname"]);
4627 $persons_array[
$row[
"active_id"]] = array(
4629 "fullname" => $fullname,
4633 return $persons_array;
4645 $ilDB = $DIC[
'ilDB'];
4647 "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),
4651 $persons_array = array();
4658 $persons_array[
$row[
"active_id"]] = $this->lng->txt(
"anonymous");
4660 if (strlen(
$row[
"firstname"] .
$row[
"lastname"] .
$row[
"title"]) == 0) {
4661 $persons_array[$row[
"active_id"]] = $this->lng->txt(
"deleted_user");
4663 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4664 $persons_array[$row[
"active_id"]] = $row[
"lastname"];
4666 $persons_array[$row[
"active_id"]] = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4671 return $persons_array;
4683 $ilDB = $DIC[
'ilDB'];
4685 "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),
4689 $persons_array = array();
4692 $persons_array[
$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"anonymous"));
4694 if (strlen(
$row[
"firstname"] .
$row[
"lastname"] .
$row[
"title"]) == 0) {
4695 $persons_array[$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"deleted_user"));
4697 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4698 $persons_array[$row[
"active_id"]] = array(
"name" => $row[
"lastname"]);
4700 $persons_array[$row[
"active_id"]] = array(
"name" => trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]),
"login" => $row[
"login"]);
4705 return $persons_array;
4717 $ilDB = $DIC[
'ilDB'];
4721 "SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4722 "tst_test_rnd_qst.pass, qpl_questions.points " .
4723 "FROM tst_test_rnd_qst, qpl_questions " .
4724 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4725 "AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence",
4731 "SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4732 "qpl_questions.points " .
4733 "FROM tst_test_question, tst_active, qpl_questions " .
4734 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4735 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4743 array_push($qtest,
$row);
4758 $ilDB = $DIC[
'ilDB'];
4762 "SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4763 "qpl_questions.points " .
4764 "FROM tst_test_rnd_qst, qpl_questions " .
4765 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4766 "AND tst_test_rnd_qst.active_fi = %s AND tst_test_rnd_qst.pass = %s " .
4767 "ORDER BY tst_test_rnd_qst.sequence",
4768 array(
'integer',
'integer'),
4769 array($active_id,
$pass)
4773 "SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4774 "qpl_questions.points " .
4775 "FROM tst_test_question, tst_active, qpl_questions " .
4776 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4777 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4785 array_push($qpass,
$row);
4817 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
4818 require_once
'Modules/Test/classes/class.ilTestParticipantAccessFilter.php';
4830 public function getUnfilteredEvaluationData()
4835 $ilDB = $DIC->database();
4837 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
4838 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
4839 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
4844 SELECT tst_test_result.*, 4845 qpl_questions.original_id, 4846 qpl_questions.title questiontitle, 4847 qpl_questions.points maxpoints 4849 FROM tst_test_result, qpl_questions, tst_active 4851 WHERE tst_active.active_id = tst_test_result.active_fi 4852 AND qpl_questions.question_id = tst_test_result.question_fi 4853 AND tst_active.test_fi = %s 4855 ORDER BY tst_active.active_id ASC, tst_test_result.pass ASC, tst_test_result.tstamp DESC 4870 $participantObject =
$data->getParticipant(
$row[
"active_fi"]);
4876 $passObject = $participantObject->getPass(
$row[
"pass"]);
4882 $passObject->addAnsweredQuestion(
4883 $row[
"question_fi"],
4892 foreach (array_keys(
$data->getParticipants()) as $active_id) {
4894 for ($testpass = 0; $testpass <=
$data->getParticipant($active_id)->getLastPass(); $testpass++) {
4898 SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, qpl_questions.original_id, 4899 tst_test_rnd_qst.pass, qpl_questions.points, qpl_questions.title 4900 FROM tst_test_rnd_qst, qpl_questions 4901 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id 4902 AND tst_test_rnd_qst.pass = %s 4903 AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence 4908 array(
'integer',
'integer'),
4909 array($testpass, $active_id)
4914 $tpass = array_key_exists(
"pass",
$row) ?
$row[
"pass"] : 0;
4916 $data->getParticipant($active_id)->addQuestion(
4917 $row[
"original_id"],
4918 $row[
"question_fi"],
4924 $data->addQuestionTitle(
$row[
"question_fi"],
$row[
"title"]);
4929 $lastPass =
$data->getParticipant($active_id)->getLastPass();
4930 for ($testpass = 0; $testpass <= $lastPass; $testpass++) {
4931 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4933 $DIC->repositoryTree(),
4935 $DIC[
'ilPluginAdmin'],
4940 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4941 $testSequenceFactory =
new ilTestSequenceFactory($DIC->database(), $DIC->language(), $DIC[
'ilPluginAdmin'], $this);
4942 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id, $testpass);
4944 $testSequence->loadFromDb($dynamicQuestionSetConfig);
4947 $sequence = (array) $testSequence->getUserSequenceQuestions();
4949 $questionsIdsToRequest = array_diff(array_values($sequence), array_values($questionData));
4950 if (count($questionsIdsToRequest) > 0) {
4951 $questionIdsCondition =
' ' . $DIC->database()->in(
'question_id', array_values($questionsIdsToRequest),
false,
'integer') .
' ';
4953 $res = $DIC->database()->queryF(
4957 WHERE {$questionIdsCondition}",
4961 while (
$row = $DIC->database()->fetchAssoc(
$res)) {
4962 $questionData[
$row[
'question_id']] =
$row;
4963 $data->addQuestionTitle($row[
'question_id'], $row[
'title']);
4967 foreach ($sequence as $questionId) {
4968 if (!isset($questionData[$questionId])) {
4972 $row = $questionData[$questionId];
4974 $data->getParticipant(
4977 $row[
'original_id'],
4978 $row[
'question_id'],
4987 SELECT tst_test_question.sequence, tst_test_question.question_fi, 4988 qpl_questions.points, qpl_questions.title, qpl_questions.original_id 4989 FROM tst_test_question, tst_active, qpl_questions 4990 WHERE tst_test_question.question_fi = qpl_questions.question_id 4991 AND tst_active.active_id = %s 4992 AND tst_active.test_fi = tst_test_question.test_fi 4993 ORDER BY tst_test_question.sequence 5003 $questionsbysequence = array();
5006 $questionsbysequence[
$row[
"sequence"]] =
$row;
5009 $seqresult =
$ilDB->queryF(
5010 "SELECT * FROM tst_sequence WHERE active_fi = %s",
5015 while ($seqrow =
$ilDB->fetchAssoc($seqresult)) {
5016 $questionsequence = unserialize($seqrow[
"sequence"]);
5018 foreach ($questionsequence as $sidx => $seq) {
5019 $data->getParticipant($active_id)->addQuestion(
5020 $questionsbysequence[$seq][
"original_id"],
5021 $questionsbysequence[$seq][
"question_fi"],
5022 $questionsbysequence[$seq][
"points"],
5027 $data->addQuestionTitle(
5028 $questionsbysequence[$seq][
"question_fi"],
5029 $questionsbysequence[$seq][
"title"]
5041 foreach (array_keys(
$data->getParticipants()) as $active_id) {
5042 $tstUserData =
$data->getParticipant($active_id);
5044 $percentage = $tstUserData->getReachedPointsInPercent();
5046 $obligationsAnswered = $tstUserData->areObligationsAnswered();
5048 $mark = $this->mark_schema->getMatchingMark($percentage);
5050 if (is_object($mark)) {
5051 $tstUserData->setMark($mark->getShortName());
5052 $tstUserData->setMarkOfficial($mark->getOfficialName());
5054 $tstUserData->setPassed(
5055 $mark->getPassed() && $tstUserData->areObligationsAnswered()
5062 $tstUserData->getReached(),
5063 $tstUserData->getMaxPoints()
5066 $tstUserData->setECTSMark($ects_mark);
5071 $tstUserData->setFirstVisit($visitingTime[
"firstvisit"]);
5072 $tstUserData->setLastVisit($visitingTime[
"lastvisit"]);
5081 $ilDB = $DIC[
'ilDB'];
5090 SELECT COUNT(qpl_questions.question_id) qcount, 5091 SUM(qpl_questions.points) qsum 5093 INNER JOIN tst_tests 5094 ON tst_tests.test_id = tst_active.test_fi 5095 INNER JOIN tst_dyn_quest_set_cfg 5096 ON tst_dyn_quest_set_cfg.test_fi = tst_tests.test_id 5097 INNER JOIN qpl_questions 5098 ON qpl_questions.obj_fi = tst_dyn_quest_set_cfg.source_qpl_fi 5099 AND qpl_questions.original_id IS NULL 5100 AND qpl_questions.complete = %s 5101 WHERE tst_active.active_id = %s 5103 array(
'integer',
'integer'),
5104 array(1, $active_id)
5113 SELECT tst_test_rnd_qst.pass, 5114 COUNT(tst_test_rnd_qst.question_fi) qcount, 5115 SUM(qpl_questions.points) qsum 5117 FROM tst_test_rnd_qst, 5120 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id 5121 AND tst_test_rnd_qst.active_fi = %s 5124 GROUP BY tst_test_rnd_qst.active_fi, 5125 tst_test_rnd_qst.pass 5127 array(
'integer',
'integer'),
5128 array($active_id,
$pass)
5137 SELECT COUNT(tst_test_question.question_fi) qcount, 5138 SUM(qpl_questions.points) qsum 5140 FROM tst_test_question, 5144 WHERE tst_test_question.question_fi = qpl_questions.question_id 5145 AND tst_test_question.test_fi = tst_active.test_fi 5146 AND tst_active.active_id = %s 5148 GROUP BY tst_test_question.test_fi 5158 throw new ilTestException(
"not supported question set type: $questionSetType");
5163 if (is_array(
$row)) {
5164 return array(
"count" =>
$row[
"qcount"],
"points" =>
$row[
"qsum"]);
5167 return array(
"count" => 0,
"points" => 0);
5172 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
5173 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
5174 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
5175 $data = $this->getUnfilteredEvaluationData();
5176 if ($withStatistics) {
5177 $data->calculateStatistics();
5179 $data->setFilter($filterby, $filtertext);
5203 $ilDB = $DIC[
'ilDB'];
5206 "SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5207 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5208 "qpl_questions.points maxpoints " .
5209 "FROM tst_test_result, qpl_questions, tst_active " .
5210 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5211 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5212 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5213 "AND tst_active.test_fi = %s " .
5214 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5218 $overview = array();
5220 if (!array_key_exists(
$row[
"active_fi"], $overview)) {
5221 $overview[
$row[
"active_fi"]] = array();
5222 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5223 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5224 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5225 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5226 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5227 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5228 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5230 if (!array_key_exists(
$row[
"pass"], $overview[
$row[
"active_fi"]])) {
5231 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5232 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5233 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5235 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5236 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5251 $ilDB = $DIC[
'ilDB'];
5254 "SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5255 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5256 "qpl_questions.points maxpoints " .
5257 "FROM tst_test_result, qpl_questions, tst_active " .
5258 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5259 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5260 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5261 "AND tst_active.test_fi = %s AND tst_active.active_id = %s" .
5262 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5263 array(
'integer',
'integer'),
5266 $overview = array();
5268 if (!array_key_exists(
$row[
"active_fi"], $overview)) {
5269 $overview[
$row[
"active_fi"]] = array();
5270 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5271 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5272 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5273 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5274 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5275 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5276 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5278 if (!array_key_exists(
$row[
"pass"], $overview[
$row[
"active_fi"]])) {
5279 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5280 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5281 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5283 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5284 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5303 if (strlen($firstname . $lastname .
$title) == 0) {
5304 $name = $this->lng->txt(
"deleted_user");
5306 if ($user_id == ANONYMOUS_USER_ID) {
5309 $name = trim($lastname .
", " . $firstname .
" " . $title);
5312 $name = $this->lng->txt(
"anonymous");
5335 if (strlen($firstname . $lastname .
$title) == 0) {
5338 if ($user_id == ANONYMOUS_USER_ID) {
5341 $name = trim($lastname .
", " . $firstname .
" " . $title);
5343 if ($is_anonymous) {
5360 $query =
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi";
5362 if (is_array($activeIdsFilter) && count($activeIdsFilter)) {
5363 $query .=
" AND " . $DIC->database()->in(
'active_id', $activeIdsFilter,
false,
'integer');
5368 while (
$row = $DIC->database()->fetchObject(
$result)) {
5369 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->started, $matches);
5370 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5371 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row->finished, $matches);
5372 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5373 $times[
$row->active_fi] += ($epoch_2 - $epoch_1);
5377 foreach ($times as
$key => $value) {
5378 $max_time += $value;
5382 $average_time = round($max_time / $counter);
5386 return $average_time;
5395 public function &
getAvailableQuestionpools($use_object_id =
false, $equal_points =
false, $could_be_offline =
false, $show_path =
false, $with_questioncount =
false, $permission =
"read")
5397 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5409 $time_in_seconds = 0;
5410 foreach ($this->questions as $question_id) {
5412 $est_time = $question->getEstimatedWorkingTime();
5413 $time_in_seconds += $est_time[
"h"] * 3600 + $est_time[
"m"] * 60 + $est_time[
"s"];
5415 $hours = (int) ($time_in_seconds / 3600) ;
5416 $time_in_seconds = $time_in_seconds - ($hours * 3600);
5417 $minutes = (int) ($time_in_seconds / 60);
5418 $time_in_seconds = $time_in_seconds - ($minutes * 60);
5419 $result = array(
"hh" => $hours,
"mm" => $minutes,
"ss" => $time_in_seconds);
5431 return CLIENT_WEB_DIR .
"/assessment/" . $this->
getId() .
"/images/";
5442 include_once
"./Services/Utilities/classes/class.ilUtil.php";
5457 if ((!$question_type)
and ($question_id > 0)) {
5461 if (!strlen($question_type)) {
5465 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5469 $question =
new $question_type_gui();
5471 if ($question_id > 0) {
5472 $question->object->loadFromDb($question_id);
5476 $ilDB = $DIC[
'ilDB'];
5481 $question->object->feedbackOBJ =
new $feedbackObjectClassname($question->object,
$ilCtrl,
$ilDB,
$lng);
5483 $assSettings =
new ilSetting(
'assessment');
5484 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
5486 $processLockerFactory->setQuestionId($question->object->getId());
5487 $processLockerFactory->setUserId(
$ilUser->getId());
5488 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
5490 $question->object->setProcessLocker($processLockerFactory->getLocker());
5507 if (strcmp($question_id,
"") != 0) {
5508 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5523 $this->questions = array_values($this->questions);
5524 $array_pos = array_search($target_index, $this->questions);
5525 if ($insert_mode == 0) {
5526 $part1 = array_slice($this->questions, 0, $array_pos);
5527 $part2 = array_slice($this->questions, $array_pos);
5528 } elseif ($insert_mode == 1) {
5529 $part1 = array_slice($this->questions, 0, $array_pos + 1);
5530 $part2 = array_slice($this->questions, $array_pos + 1);
5532 foreach ($move_questions as $question_id) {
5533 if (!(array_search($question_id, $part1) ===
false)) {
5534 unset($part1[array_search($question_id, $part1)]);
5536 if (!(array_search($question_id, $part2) ===
false)) {
5537 unset($part2[array_search($question_id, $part2)]);
5540 $part1 = array_values($part1);
5541 $part2 = array_values($part2);
5542 $new_array = array_values(array_merge($part1, $move_questions, $part2));
5543 $this->questions = array();
5545 foreach ($new_array as $question_id) {
5546 $this->questions[$counter] = $question_id;
5597 $pluginAdmin = $DIC[
'ilPluginAdmin'];
5600 $ilDB = $DIC[
'ilDB'];
5602 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5605 if (count($available_pools)) {
5606 $available =
" AND " .
$ilDB->in(
'qpl_questions.obj_fi', $available_pools,
false,
'integer');
5610 if ($completeonly) {
5611 $available .=
" AND qpl_questions.complete = " .
$ilDB->quote(
"1",
'text');
5615 if (is_array($arrFilter)) {
5616 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
5617 $where .=
" AND " .
$ilDB->like(
'qpl_questions.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
5619 if (array_key_exists(
'description', $arrFilter) && strlen($arrFilter[
'description'])) {
5620 $where .=
" AND " .
$ilDB->like(
'qpl_questions.description',
'text',
"%%" . $arrFilter[
'description'] .
"%%");
5622 if (array_key_exists(
'author', $arrFilter) && strlen($arrFilter[
'author'])) {
5623 $where .=
" AND " .
$ilDB->like(
'qpl_questions.author',
'text',
"%%" . $arrFilter[
'author'] .
"%%");
5625 if (array_key_exists(
'type', $arrFilter) && strlen($arrFilter[
'type'])) {
5626 $where .=
" AND qpl_qst_type.type_tag = " .
$ilDB->quote($arrFilter[
'type'],
'text');
5628 if (array_key_exists(
'qpl', $arrFilter) && strlen($arrFilter[
'qpl'])) {
5629 $where .=
" AND " .
$ilDB->like(
'object_data.title',
'text',
"%%" . $arrFilter[
'qpl'] .
"%%");
5634 $original_clause =
" qpl_questions.original_id IS NULL";
5635 if (count($original_ids)) {
5636 $original_clause =
" qpl_questions.original_id IS NULL AND " .
$ilDB->in(
'qpl_questions.question_id', $original_ids,
true,
'integer');
5639 $query_result =
$ilDB->query(
" 5640 SELECT qpl_questions.*, qpl_questions.tstamp, 5641 qpl_qst_type.type_tag, qpl_qst_type.plugin, qpl_qst_type.plugin_name, 5642 object_data.title parent_title 5643 FROM qpl_questions, qpl_qst_type, object_data 5644 WHERE $original_clause $available 5645 AND object_data.obj_id = qpl_questions.obj_fi 5646 AND qpl_questions.tstamp > 0 5647 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id 5651 $types = $this->getQuestionTypeTranslations();
5652 if ($query_result->numRows()) {
5653 while (
$row =
$ilDB->fetchAssoc($query_result)) {
5656 if (!
$row[
'plugin']) {
5663 if (!$pluginAdmin->isActive(
IL_COMP_MODULE,
'TestQuestionPool',
'qst',
$row[
'plugin_name'])) {
5668 $row[
'ttype' ] = $pl->getQuestionTypeTranslation();
5688 foreach ($assessment->objectives as $objectives) {
5689 foreach ($objectives->materials as $material) {
5704 foreach ($assessment->assessmentcontrol as $assessmentcontrol) {
5705 switch ($assessmentcontrol->getSolutionswitch()) {
5720 foreach ($assessment->qtimetadata as
$metadata) {
5721 switch ($metadata[
"label"]) {
5724 $type = $metadata[
"entry"];
5744 case "sequence_settings":
5747 case "solution_details":
5750 case "print_bs_with_res":
5759 case "pass_waiting":
5763 $this->
setKiosk($metadata[
"entry"]);
5765 case "showfinalstatement":
5778 case "highscore_enabled":
5782 case "highscore_anon":
5786 case "highscore_achieved_ts":
5790 case "highscore_score":
5794 case "highscore_percentage":
5798 case "highscore_hints":
5802 case "highscore_wtime":
5806 case "highscore_own_table":
5810 case "highscore_top_table":
5814 case "highscore_top_num":
5818 case "hide_previous_results":
5819 if ($metadata[
"entry"] == 0) {
5825 case "use_previous_answers":
5828 case "answer_feedback":
5831 case "hide_title_points":
5834 case "title_output":
5837 case "question_set_type":
5841 if ($metadata[
"entry"]) {
5847 case "results_presentation":
5850 case "reset_processing_time":
5853 case "instant_verification":
5856 case "follow_qst_answer_fixation":
5859 case "instant_feedback_answer_fixation":
5862 case "force_instant_feedback":
5865 case "answer_feedback_points":
5880 case "fixed_participants":
5883 case "score_reporting":
5886 case "shuffle_questions":
5889 case "count_system":
5895 case "mailnotification":
5901 case "exportsettings":
5904 case "score_cutting":
5911 case "allowedUsers":
5915 case "allowedUsersTimeGap":
5918 case "pass_scoring":
5921 case 'pass_deletion_allowed':
5924 case "show_summary":
5927 case "reporting_date":
5928 $iso8601period = $metadata[
"entry"];
5929 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5930 $this->
setReportingDate(sprintf(
"%02d%02d%02d%02d%02d%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
5933 case 'enable_processing_time':
5936 case "processing_time":
5939 case "starting_time":
5940 $iso8601period = $metadata[
"entry"];
5941 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5942 $date_time =
new ilDateTime(sprintf(
"%02d-%02d-%02d %02d:%02d:%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]),
IL_CAL_DATETIME);
5948 $iso8601period = $metadata[
"entry"];
5949 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5950 $date_time =
new ilDateTime(sprintf(
"%02d-%02d-%02d %02d:%02d:%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]),
IL_CAL_DATETIME);
5955 case "enable_examview":
5958 case 'show_examview_html':
5961 case 'show_examview_pdf':
5964 case 'redirection_mode':
5967 case 'redirection_url':
5970 case 'examid_in_kiosk':
5971 case 'examid_in_test_pass':
5974 case 'show_exam_id':
5975 case 'examid_in_test_res':
5978 case 'enable_archiving':
5981 case 'sign_submission':
5984 case 'char_selector_availability':
5987 case 'char_selector_definition':
5990 case 'skill_service':
5993 case 'result_tax_filters':
5994 $this->
setResultFilterTaxIds(strlen($metadata[
'entry']) ? unserialize($metadata[
'entry']) : array());
5996 case 'show_grading_status':
5999 case 'show_grading_mark':
6002 case 'activation_limited':
6005 case 'activation_start_time':
6008 case 'activation_end_time':
6011 case 'activation_visibility':
6017 case 'autosave_ival':
6020 case 'offer_question_hints':
6023 case 'instant_feedback_specific':
6026 case 'obligations_enabled':
6030 if (preg_match(
"/mark_step_\d+/", $metadata[
"label"])) {
6031 $xmlmark = $metadata[
"entry"];
6032 preg_match(
"/<short>(.*?)<\/short>/", $xmlmark, $matches);
6033 $mark_short = $matches[1];
6034 preg_match(
"/<official>(.*?)<\/official>/", $xmlmark, $matches);
6035 $mark_official = $matches[1];
6036 preg_match(
"/<percentage>(.*?)<\/percentage>/", $xmlmark, $matches);
6037 $mark_percentage = $matches[1];
6038 preg_match(
"/<passed>(.*?)<\/passed>/", $xmlmark, $matches);
6039 $mark_passed = $matches[1];
6040 $this->mark_schema->addMarkStep($mark_short, $mark_official, $mark_percentage, $mark_passed);
6044 if (is_array(
$_SESSION[
"import_mob_xhtml"])) {
6045 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6046 include_once
"./Services/RTE/classes/class.ilRTE.php";
6047 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
6048 foreach (
$_SESSION[
"import_mob_xhtml"] as $mob) {
6050 if (file_exists($importfile)) {
6058 $ilLog->write(
"Error: Could not open XHTML mob file for test introduction during test import. File $importfile does not exist!");
6072 include_once(
"./Services/Xml/classes/class.ilXmlWriter.php");
6076 $a_xml_writer->xmlSetDtdDef(
"<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">");
6077 $a_xml_writer->xmlStartTag(
"questestinterop");
6080 "ident" =>
"il_" . IL_INST_ID .
"_tst_" . $this->
getTestId(),
6083 $a_xml_writer->xmlStartTag(
"assessment", $attrs);
6085 $a_xml_writer->xmlElement(
"qticomment", null, $this->
getDescription());
6088 if ($this->enable_processing_time) {
6089 preg_match(
"/(\d+):(\d+):(\d+)/", $this->processing_time, $matches);
6090 $a_xml_writer->xmlElement(
"duration", null, sprintf(
"P0Y0M0DT%dH%dM%dS", $matches[1], $matches[2], $matches[3]));
6094 $a_xml_writer->xmlStartTag(
"qtimetadata");
6095 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6096 $a_xml_writer->xmlElement(
"fieldlabel", null,
"ILIAS_VERSION");
6097 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
ilias->getSetting(
"ilias_version"));
6098 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6101 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6102 $a_xml_writer->xmlElement(
"fieldlabel", null,
"anonymity");
6103 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getAnonymity()));
6104 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6106 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6107 $a_xml_writer->xmlElement(
"fieldlabel", null,
"use_pool");
6108 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPoolUsage() ? 1 : 0);
6109 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6112 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6113 $a_xml_writer->xmlElement(
"fieldlabel", null,
"question_set_type");
6115 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6118 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6119 $a_xml_writer->xmlElement(
"fieldlabel", null,
"sequence_settings");
6121 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6124 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6125 $a_xml_writer->xmlElement(
"fieldlabel", null,
"author");
6126 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getAuthor());
6127 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6130 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6131 $a_xml_writer->xmlElement(
"fieldlabel", null,
"reset_processing_time");
6133 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6136 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6137 $a_xml_writer->xmlElement(
"fieldlabel", null,
"count_system");
6138 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getCountSystem());
6139 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6142 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6143 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mc_scoring");
6144 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getMCScoring());
6145 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6148 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6149 $a_xml_writer->xmlElement(
"fieldlabel", null,
"score_cutting");
6150 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getScoreCutting());
6151 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6154 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6155 $a_xml_writer->xmlElement(
"fieldlabel", null,
"password");
6156 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassword());
6157 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6160 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6161 $a_xml_writer->xmlElement(
"fieldlabel", null,
"allowedUsers");
6162 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getAllowedUsers());
6163 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6166 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6167 $a_xml_writer->xmlElement(
"fieldlabel", null,
"allowedUsersTimeGap");
6169 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6172 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6173 $a_xml_writer->xmlElement(
"fieldlabel", null,
"pass_scoring");
6174 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassScoring());
6175 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6177 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6178 $a_xml_writer->xmlElement(
'fieldlabel', null,
'pass_deletion_allowed');
6180 $a_xml_writer->xmlEndTag(
'qtimetadatafield');
6184 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6185 $a_xml_writer->xmlElement(
"fieldlabel", null,
"reporting_date");
6186 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->reporting_date, $matches);
6187 $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]));
6188 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6191 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6192 $a_xml_writer->xmlElement(
"fieldlabel", null,
"nr_of_tries");
6193 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getNrOfTries()));
6194 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6197 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6198 $a_xml_writer->xmlElement(
"fieldlabel", null,
"pass_waiting");
6199 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassWaiting());
6200 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6203 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6204 $a_xml_writer->xmlElement(
"fieldlabel", null,
"kiosk");
6205 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getKiosk()));
6206 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6210 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6211 $a_xml_writer->xmlElement(
"fieldlabel", null,
"redirection_mode");
6213 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6216 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6217 $a_xml_writer->xmlElement(
"fieldlabel", null,
"redirection_url");
6219 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6222 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6223 $a_xml_writer->xmlElement(
"fieldlabel", null,
"use_previous_answers");
6225 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6228 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6229 $a_xml_writer->xmlElement(
"fieldlabel", null,
"title_output");
6230 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getTitleOutput()));
6231 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6234 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6235 $a_xml_writer->xmlElement(
"fieldlabel", null,
"results_presentation");
6237 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6240 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6241 $a_xml_writer->xmlElement(
"fieldlabel", null,
"examid_in_test_pass");
6243 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6246 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6247 $a_xml_writer->xmlElement(
"fieldlabel", null,
"examid_in_test_res");
6249 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6252 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6253 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_summary");
6255 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6258 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6259 $a_xml_writer->xmlElement(
"fieldlabel", null,
"score_reporting");
6260 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getScoreReporting()));
6261 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6263 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6264 $a_xml_writer->xmlElement(
"fieldlabel", null,
"solution_details");
6266 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6267 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6268 $a_xml_writer->xmlElement(
"fieldlabel", null,
"print_bs_with_res");
6270 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6273 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6274 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_verification");
6276 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6279 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6280 $a_xml_writer->xmlElement(
"fieldlabel", null,
"answer_feedback");
6281 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getAnswerFeedback()));
6282 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6285 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6286 $a_xml_writer->xmlElement(
"fieldlabel", null,
"answer_feedback_points");
6288 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6291 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6292 $a_xml_writer->xmlElement(
"fieldlabel", null,
"follow_qst_answer_fixation");
6294 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6297 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6298 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_answer_fixation");
6300 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6303 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6304 $a_xml_writer->xmlElement(
"fieldlabel", null,
"force_instant_feedback");
6306 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6310 $highscore_metadata = array(
6322 foreach ($highscore_metadata as $label =>
$data) {
6323 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6324 $a_xml_writer->xmlElement(
"fieldlabel", null, $label);
6325 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d",
$data[
'value']));
6326 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6330 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6331 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_cancel");
6332 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShowCancel()));
6333 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6336 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6337 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_marker");
6338 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShowMarker()));
6339 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6342 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6343 $a_xml_writer->xmlElement(
"fieldlabel", null,
"fixed_participants");
6345 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6348 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6349 $a_xml_writer->xmlElement(
"fieldlabel", null,
"showfinalstatement");
6350 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getShowFinalStatement()) ?
"1" :
"0")));
6351 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6354 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6355 $a_xml_writer->xmlElement(
"fieldlabel", null,
"showinfo");
6356 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getShowInfo()) ?
"1" :
"0")));
6357 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6360 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6361 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mailnotification");
6363 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6366 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6367 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mailnottype");
6369 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6372 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6373 $a_xml_writer->xmlElement(
"fieldlabel", null,
"exportsettings");
6374 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getExportSettings());
6375 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6378 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6379 $a_xml_writer->xmlElement(
"fieldlabel", null,
"forcejs");
6380 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getForceJS()) ?
"1" :
"0")));
6381 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6384 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6385 $a_xml_writer->xmlElement(
"fieldlabel", null,
"customstyle");
6386 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getCustomStyle());
6387 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6390 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6391 $a_xml_writer->xmlElement(
"fieldlabel", null,
"shuffle_questions");
6392 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShuffleQuestions()));
6393 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6396 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6397 $a_xml_writer->xmlElement(
"fieldlabel", null,
"processing_time");
6399 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6402 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6403 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_examview");
6404 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getEnableExamview());
6405 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6408 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6409 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_examview_html");
6411 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6414 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6415 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_examview_pdf");
6417 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6420 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6421 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_archiving");
6423 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6426 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6427 $a_xml_writer->xmlElement(
"fieldlabel", null,
"sign_submission");
6428 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getSignSubmission());
6429 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6432 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6433 $a_xml_writer->xmlElement(
"fieldlabel", null,
"char_selector_availability");
6435 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6438 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6439 $a_xml_writer->xmlElement(
"fieldlabel", null,
"char_selector_definition");
6441 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6444 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6445 $a_xml_writer->xmlElement(
"fieldlabel", null,
"skill_service");
6447 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6450 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6451 $a_xml_writer->xmlElement(
"fieldlabel", null,
"result_tax_filters");
6453 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6456 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6457 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_grading_status");
6459 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6462 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6463 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_grading_mark");
6465 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6470 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6471 $a_xml_writer->xmlElement(
"fieldlabel", null,
"starting_time");
6473 $a_xml_writer->xmlElement(
"fieldentry", null, $backward_compatibility_format);
6474 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6478 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6479 $a_xml_writer->xmlElement(
"fieldlabel", null,
"ending_time");
6481 $a_xml_writer->xmlElement(
"fieldentry", null, $backward_compatibility_format);
6482 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6487 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6488 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_limited");
6490 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6493 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6494 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_start_time");
6496 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6499 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6500 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_end_time");
6502 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6505 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6506 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_visibility");
6508 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6511 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6512 $a_xml_writer->xmlElement(
"fieldlabel", null,
"autosave");
6513 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getAutosave());
6514 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6517 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6518 $a_xml_writer->xmlElement(
"fieldlabel", null,
"autosave_ival");
6519 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getAutosaveIval());
6520 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6523 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6524 $a_xml_writer->xmlElement(
"fieldlabel", null,
"offer_question_hints");
6526 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6529 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6530 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_specific");
6532 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6535 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6536 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_answer_fixation");
6538 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6541 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6542 $a_xml_writer->xmlElement(
"fieldlabel", null,
"obligations_enabled");
6544 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6547 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6548 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_processing_time");
6550 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6552 foreach ($this->mark_schema->mark_steps as
$index => $mark) {
6554 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6555 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mark_step_$index");
6556 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
6557 "<short>%s</short><official>%s</official><percentage>%.2f</percentage><passed>%d</passed>",
6558 $mark->getShortName(),
6559 $mark->getOfficialName(),
6560 $mark->getMinimumLevel(),
6563 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6565 $a_xml_writer->xmlEndTag(
"qtimetadata");
6568 $a_xml_writer->xmlStartTag(
"objectives");
6570 $a_xml_writer->xmlEndTag(
"objectives");
6575 "solutionswitch" =>
"Yes" 6580 $a_xml_writer->xmlElement(
"assessmentcontrol", $attrs, null);
6584 $a_xml_writer->xmlStartTag(
"presentation_material");
6585 $a_xml_writer->xmlStartTag(
"flow_mat");
6587 $a_xml_writer->xmlEndTag(
"flow_mat");
6588 $a_xml_writer->xmlEndTag(
"presentation_material");
6594 $a_xml_writer->xmlElement(
"section", $attrs, null);
6595 $a_xml_writer->xmlEndTag(
"assessment");
6596 $a_xml_writer->xmlEndTag(
"questestinterop");
6598 $xml = $a_xml_writer->xmlDumpMem(
false);
6610 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $date_time, $matches);
6611 $iso8601_period = sprintf(
"P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]);
6612 return $iso8601_period;
6626 $this->mob_ids = array();
6627 $this->file_ids = array();
6633 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export Page Objects");
6634 $ilBench->start(
"ContentObjectExport",
"exportPageObjects");
6636 $ilBench->stop(
"ContentObjectExport",
"exportPageObjects");
6637 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export Page Objects");
6640 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export Media Objects");
6641 $ilBench->start(
"ContentObjectExport",
"exportMediaObjects");
6643 $ilBench->stop(
"ContentObjectExport",
"exportMediaObjects");
6644 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export Media Objects");
6647 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export File Items");
6648 $ilBench->start(
"ContentObjectExport",
"exportFileItems");
6650 $ilBench->stop(
"ContentObjectExport",
"exportFileItems");
6651 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export File Items");
6662 include_once
"./Services/MetaData/classes/class.ilMD2XML.php";
6664 $md2xml->setExportMode(
true);
6665 $md2xml->startExport();
6666 $a_xml_writer->appendXML($md2xml->getXML());
6676 if ($a_tag ==
"Identifier" && $a_param ==
"Entry") {
6677 include_once
"./Services/Utilities/classes/class.ilUtil.php";
6696 include_once
"./Modules/LearningModule/classes/class.ilLMPageObject.php";
6698 foreach ($this->questions as $question_id) {
6699 $ilBench->start(
"ContentObjectExport",
"exportPageObject");
6700 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Page Object " . $question_id);
6703 $a_xml_writer->xmlStartTag(
"PageObject", $attrs);
6707 $ilBench->start(
"ContentObjectExport",
"exportPageObject_XML");
6708 include_once
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPage.php";
6710 $page_object->buildDom();
6711 $page_object->insertInstIntoIDs($a_inst);
6712 $mob_ids = $page_object->collectMediaObjects(
false);
6713 require_once
'Services/COPage/classes/class.ilPCFileList.php';
6715 $xml = $page_object->getXMLFromDom(
false,
false,
false,
"",
true);
6716 $xml = str_replace(
"&",
"&", $xml);
6717 $a_xml_writer->appendXML($xml);
6718 $page_object->freeDom();
6719 unset($page_object);
6721 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_XML");
6724 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6726 foreach ($mob_ids as $mob_id) {
6727 $this->mob_ids[$mob_id] = $mob_id;
6729 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6732 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6734 foreach ($file_ids as $file_id) {
6735 $this->file_ids[$file_id] = $file_id;
6737 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6739 $a_xml_writer->xmlEndTag(
"PageObject");
6742 $ilBench->stop(
"ContentObjectExport",
"exportPageObject");
6754 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6756 foreach ($this->mob_ids as $mob_id) {
6757 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Media Object " . $mob_id);
6760 $media_obj->exportXML($a_xml_writer, $a_inst);
6761 $media_obj->exportFiles($a_target_dir);
6773 include_once
"./Modules/File/classes/class.ilObjFile.php";
6775 foreach ($this->file_ids as $file_id) {
6776 $expLog->write(date(
"[y-m-d H:i:s] ") .
"File Item " . $file_id);
6777 $file_obj =
new ilObjFile($file_id,
false);
6778 $file_obj->export($a_target_dir);
6789 if (!is_array($this->import_mapping)) {
6792 return $this->import_mapping;
6817 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);
6823 public static function _getECTSGrade($points_passed, $reached_points, $max_points, $a, $b,
$c,
$d, $e, $fx)
6825 include_once
"./Modules/Test/classes/class.ilStatistics.php";
6828 $passed_statistics->setData($points_passed);
6829 $ects_percentiles = array(
6830 "A" => $passed_statistics->quantile($a),
6831 "B" => $passed_statistics->quantile($b),
6832 "C" => $passed_statistics->quantile(
$c),
6833 "D" => $passed_statistics->quantile(
$d),
6834 "E" => $passed_statistics->quantile($e)
6836 if (count($points_passed) && ($reached_points >= $ects_percentiles[
"A"])) {
6838 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"B"])) {
6840 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"C"])) {
6842 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"D"])) {
6844 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"E"])) {
6846 } elseif (strcmp($fx,
"") != 0) {
6847 if ($max_points > 0) {
6848 $percentage = ($reached_points / $max_points) * 100.0;
6849 if ($percentage < 0) {
6855 if ($percentage >= $fx) {
6870 return $this->mark_schema->checkMarks();
6899 $ilDB = $DIC[
'ilDB'];
6900 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
6901 $tree = $DIC[
'tree'];
6903 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
6920 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getReportingDate(), $matches)) {
6921 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
6923 if ($now < $epoch_time) {
6958 $md_life = &$md->getLifecycle();
6960 if (strlen($a_author) == 0) {
6963 $a_author =
$ilUser->getFullname();
6966 $md_life = &$md->addLifecycle();
6968 $con = &$md_life->addContribute();
6969 $con->setRole(
"Author");
6971 $ent = &$con->addEntity();
6972 $ent->setEntity($a_author);
6984 parent::createMetaData();
6998 include_once
"./Services/MetaData/classes/class.ilMD.php";
7000 $md_life = &$md->getLifecycle();
7002 $ids = &$md_life->getContributeIds();
7003 foreach ($ids as
$id) {
7004 $md_cont = &$md_life->getContribute($id);
7005 if (strcmp($md_cont->getRole(),
"Author") == 0) {
7006 $entids = &$md_cont->getEntityIds();
7007 foreach ($entids as $entid) {
7008 $md_ent = &$md_cont->getEntity($entid);
7009 array_push(
$author, $md_ent->getEntity());
7027 include_once
"./Services/MetaData/classes/class.ilMD.php";
7028 $md =
new ilMD($obj_id, 0,
"tst");
7029 $md_life = &$md->getLifecycle();
7031 $ids = &$md_life->getContributeIds();
7032 foreach ($ids as
$id) {
7033 $md_cont = &$md_life->getContribute($id);
7034 if (strcmp($md_cont->getRole(),
"Author") == 0) {
7035 $entids = &$md_cont->getEntityIds();
7036 foreach ($entids as $entid) {
7037 $md_ent = &$md_cont->getEntity($entid);
7038 array_push(
$author, $md_ent->getEntity());
7056 $ilDB = $DIC[
'ilDB'];
7058 $result_array = array();
7070 if ($use_object_id) {
7072 $result_array[$obj_id] = $titles[
$ref_id];
7078 return $result_array;
7089 public function cloneObject($a_target_id, $a_copy_id = 0, $a_omit_tree =
false)
7093 $certificateLogger = $DIC->logger()->cert();
7094 $tree = $DIC[
'tree'];
7095 $ilDB = $DIC->database();
7096 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
7102 $newObj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree);
7103 $newObj->setTmpCopyWizardCopyId($a_copy_id);
7109 if (!$cp_options->isRootNode($this->getRefId())) {
7135 $newObj->setKiosk($this->
getKiosk());
7190 $newObj->saveToDb();
7199 $templateRepository,
7200 $DIC->filesystem()->web(),
7205 $cloneAction->cloneCertificate($this, $newObj);
7208 $testQuestionSetConfigFactory->getQuestionSetConfig()->cloneQuestionSetRelatedData($newObj);
7210 require_once
'Modules/Test/classes/class.ilTestSkillLevelThresholdList.php';
7212 $skillLevelThresholdList->setTestId($this->
getTestId());
7213 $skillLevelThresholdList->loadFromDb();
7214 $skillLevelThresholdList->cloneListForTest($newObj->getTestId());
7216 $newObj->saveToDb();
7217 $newObj->updateMetaData();
7219 include_once(
'./Services/Tracking/classes/class.ilLPObjSettings.php');
7221 $obj_settings->cloneSettings($newObj->getId());
7238 $tree = $DIC[
'tree'];
7239 $ilDB = $DIC[
'ilDB'];
7240 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
7249 $questionSetConfig->loadFromDb();
7251 if ($questionSetConfig->isQuestionAmountConfigurationModePerPool()) {
7252 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
7253 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilderWithAmountPerPool.php';
7254 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
7262 $sourcePoolDefinitionList->loadDefinitions();
7264 $num = $sourcePoolDefinitionList->getQuestionAmount();
7266 $num = $questionSetConfig->getQuestionAmountPerTest();
7269 $num = count($this->questions);
7288 if (strcmp($question_id,
"") != 0) {
7289 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7292 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7306 $ilDB = $DIC[
'ilDB'];
7309 "SELECT obj_fi FROM tst_tests WHERE test_id = %s",
7315 $object_id =
$row[
"obj_fi"];
7330 $ilDB = $DIC[
'ilDB'];
7333 "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",
7339 $object_id =
$row[
"obj_fi"];
7354 $ilDB = $DIC[
'ilDB'];
7357 "SELECT test_id FROM tst_tests WHERE obj_fi = %s",
7379 $ilDB = $DIC[
'ilDB'];
7382 if (($active_id) && ($question_id)) {
7383 if (is_null(
$pass)) {
7384 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7388 "SELECT value1 FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
7389 array(
'integer',
'integer',
'integer'),
7390 array($active_id, $question_id,
$pass)
7392 if (
$result->numRows() == 1) {
7410 $ilDB = $DIC[
'ilDB'];
7415 "SELECT question_text FROM qpl_questions WHERE question_id = %s",
7419 if (
$result->numRows() == 1) {
7432 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
7436 return $participantList;
7444 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
7448 return $participantList;
7460 $ilDB = $DIC[
'ilDB'];
7462 $result_array = array();
7465 if (is_numeric($user_id)) {
7467 "SELECT tst_active.active_id, tst_active.tries, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7468 "tst_active.submitted test_finished, matriculation, COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes FROM usr_data, tst_invited_user " .
7469 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7470 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7472 array(
'text',
'text',
'text',
'integer',
'integer'),
7473 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId(), $user_id)
7477 "SELECT tst_active.active_id, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7478 "tst_active.submitted test_finished, matriculation, COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes FROM usr_data, tst_invited_user " .
7479 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7480 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7482 array(
'text',
'text',
'text',
'integer'),
7483 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7487 if (is_numeric($user_id)) {
7489 "SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7490 "tst_active.submitted test_finished, matriculation, COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes FROM usr_data, tst_invited_user " .
7491 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7492 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7494 array(
'integer',
'integer'),
7499 "SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7500 "tst_active.submitted test_finished, matriculation, COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes FROM usr_data, tst_invited_user " .
7501 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7502 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7509 $result_array = array();
7511 $result_array[
$row[
'usr_id']] =
$row;
7513 return $result_array;
7525 $ilDB = $DIC[
'ilDB'];
7529 SELECT tst_active.active_id, 7531 tst_active.user_fi usr_id, 7535 tst_active.submitted test_finished, 7536 usr_data.matriculation, 7538 tst_active.lastindex, 7539 COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes 7542 ON tst_active.user_fi = usr_data.usr_id 7543 WHERE tst_active.test_fi = %s 7544 ORDER BY usr_data.lastname 7548 array(
'text',
'text',
'text',
'integer'),
7549 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7553 SELECT tst_active.active_id, 7555 tst_active.user_fi usr_id, 7559 tst_active.submitted test_finished, 7560 usr_data.matriculation, 7562 tst_active.lastindex, 7563 COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes 7566 ON tst_active.user_fi = usr_data.usr_id 7567 WHERE tst_active.test_fi = %s 7568 ORDER BY usr_data.lastname 7581 if (strlen(trim($participant[
"firstname"] . $participant[
"lastname"])) == 0) {
7582 $data[
$index][
"lastname"] = $this->lng->txt(
"deleted_user");
7591 $ilDB = $DIC[
'ilDB'];
7593 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7595 if (count($scoring) == 0) {
7600 $filtered_participants = array();
7601 foreach ($participants as $active_id => $participant) {
7602 $qstType_IN_manScoreableQstTypes =
$ilDB->in(
'qpl_questions.question_type_fi', $scoring,
false,
'integer');
7605 SELECT tst_test_result.manual 7607 FROM tst_test_result 7609 INNER JOIN qpl_questions 7610 ON tst_test_result.question_fi = qpl_questions.question_id 7612 WHERE tst_test_result.active_fi = %s 7613 AND $qstType_IN_manScoreableQstTypes 7627 if ($participant->active) {
7628 $filtered_participants[$active_id] = $participant;
7632 if (!$participant->active) {
7633 $filtered_participants[$active_id] = $participant;
7637 $filtered_participants[$active_id] = $participant;
7652 $assessmentSetting =
new ilSetting(
"assessment");
7653 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7654 if ($manscoring_done) {
7655 $filtered_participants[$active_id] = $participant;
7668 $assessmentSetting =
new ilSetting(
"assessment");
7669 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7670 if (!$manscoring_done) {
7671 $filtered_participants[$active_id] = $participant;
7679 if (
$row[
"manual"]) {
7683 if (($found > 0) && ($found < $count)) {
7684 $filtered_participants[$active_id] = $participant;
7688 $filtered_participants[$active_id] = $participant;
7693 return $filtered_participants;
7706 $ilDB = $DIC[
'ilDB'];
7708 if (!is_array($ids) || count($ids) == 0) {
7714 "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",
7715 array(
'text',
'text',
'text'),
7716 array(
"", $this->lng->txt(
"anonymous"),
"")
7719 $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");
7722 $result_array = array();
7724 $result_array[
$row[
"usr_id"]] =
$row;
7726 return $result_array;
7731 if (!is_array($ids) || count($ids) == 0) {
7744 if (!is_array($ids) || count($ids) == 0) {
7748 foreach ($ids as $obj_id) {
7763 include_once
"./Modules/Group/classes/class.ilObjGroup.php";
7765 $members = $group->getGroupMemberIds();
7766 include_once
'./Services/User/classes/class.ilObjUser.php';
7767 foreach ($members as $user_id) {
7783 include_once
'./Services/User/classes/class.ilObjUser.php';
7784 foreach ($members as $user_id) {
7800 $ilDB = $DIC[
'ilDB'];
7802 $affectedRows =
$ilDB->manipulateF(
7803 "DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7804 array(
'integer',
'integer'),
7818 $ilDB = $DIC[
'ilDB'];
7820 $affectedRows =
$ilDB->manipulateF(
7821 "DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7822 array(
'integer',
'integer'),
7825 $affectedRows =
$ilDB->manipulateF(
7826 "INSERT INTO tst_invited_user (test_fi, user_fi, clientip, tstamp) VALUES (%s, %s, %s, %s)",
7827 array(
'integer',
'integer',
'text',
'integer'),
7828 array($this->
getTestId(), $user_id, (strlen($client_ip)) ? $client_ip : null, time())
7836 $ilDB = $DIC[
'ilDB'];
7838 $affectedRows =
$ilDB->manipulateF(
7839 "UPDATE tst_invited_user SET clientip = %s, tstamp = %s WHERE test_fi=%s and user_fi=%s",
7840 array(
'text',
'integer',
'integer',
'integer'),
7841 array((strlen($client_ip)) ? $client_ip : null, time(), $this->
getTestId(), $user_id)
7853 $ilDB = $DIC[
'ilDB'];
7854 if (is_numeric($question_fi)) {
7856 "SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s AND question_fi=%s",
7857 array(
'integer',
'integer'),
7858 array($active_id, $question_fi)
7862 "SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s",
7867 $result_array = array();
7869 $result_array[
$row[
"question_fi"]] =
$row;
7871 return $result_array;
7881 $ilDB = $DIC[
'ilDB'];
7884 $affectedRows =
$ilDB->manipulateF(
7885 "DELETE FROM tst_qst_solved WHERE active_fi = %s AND question_fi = %s",
7886 array(
'integer',
'integer'),
7887 array($active_id, $question_id)
7889 $affectedRows =
$ilDB->manipulateF(
7890 "INSERT INTO tst_qst_solved (solved, question_fi, active_fi) VALUES (%s, %s, %s)",
7891 array(
'integer',
'integer',
'integer'),
7892 array($value, $question_id, $active_id)
7902 $ilDB = $DIC[
'ilDB'];
7905 "SELECT submitted FROM tst_active WHERE active_id=%s AND submitted=%s",
7906 array(
'integer',
'integer'),
7907 array($active_id, 1)
7909 return $result->numRows() == 1;
7919 $ilDB = $DIC[
'ilDB'];
7921 if (!is_numeric($user_id)) {
7926 "SELECT submitted FROM tst_active WHERE test_fi=%s AND user_fi=%s AND submitted=%s",
7927 array(
'integer',
'integer',
'integer'),
7930 return $result->numRows() == 1;
7965 "user_id" => $this->lng->txt(
"user_id"),
7966 "matriculation" => $this->lng->txt(
"matriculation"),
7967 "lastname" => $this->lng->txt(
"lastname"),
7968 "firstname" => $this->lng->txt(
"firstname"),
7969 "login" => $this->lng->txt(
"login"),
7970 "reached_points" => $this->lng->txt(
"tst_reached_points"),
7971 "max_points" => $this->lng->txt(
"tst_maximum_points"),
7972 "percent_value" => $this->lng->txt(
"tst_percent_solved"),
7973 "mark" => $this->lng->txt(
"tst_mark"),
7974 "ects" => $this->lng->txt(
"ects_grade")
7977 if (count($participants)) {
7981 foreach ($participants as $active_id => $user_rec) {
7982 $mark = $ects_mark =
'';
7984 $reached_points = 0;
7986 foreach ($this->questions as $value) {
7988 if (is_object($question)) {
7989 $max_points += $question->getMaximumPoints();
7990 $reached_points += $question->getReachedPoints($active_id);
7993 if ($max_points > 0) {
7994 $percentvalue = $reached_points / $max_points;
7995 if ($percentvalue < 0) {
7996 $percentvalue = 0.0;
8001 $mark_obj = $this->mark_schema->getMatchingMark($percentvalue * 100);
8004 $mark = $mark_obj->getOfficialName();
8006 $ects_mark = $this->
getECTSGrade($passed_array, $reached_points, $max_points);
8010 $user_rec[
'firstname'] =
"";
8011 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
8014 "user_id" => $user_rec[
'usr_id'],
8015 "matriculation" => $user_rec[
'matriculation'],
8016 "lastname" => $user_rec[
'lastname'],
8017 "firstname" => $user_rec[
'firstname'],
8018 "login" => $user_rec[
'login'],
8019 "reached_points" => $reached_points,
8020 "max_points" => $max_points,
8021 "percent_value" => $percentvalue,
8023 "ects" => $ects_mark
8043 $resultarray = array();
8044 foreach (
$row as $rowindex => $entry) {
8049 if (strpos($entry,
"\"") !==
false) {
8050 $entry = str_replace(
"\"",
"\"\"", $entry);
8053 if (strpos($entry, $separator) !==
false) {
8057 $entry = str_replace(chr(13) . chr(10), chr(10), $entry);
8060 $entry =
"\"" . $entry .
"\"";
8063 $resultarray[$rowindex] = $entry;
8065 return $resultarray;
8079 $ilDB = $DIC[
'ilDB'];
8081 "SELECT tries FROM tst_active WHERE active_id = %s",
8087 return $row[
"tries"];
8105 $ilDB = $DIC[
'ilDB'];
8107 "SELECT MAX(pass) maxpass FROM tst_pass_result WHERE active_fi = %s",
8113 $max =
$row[
"maxpass"];
8128 $ilDB = $DIC[
'ilDB'];
8131 "SELECT * FROM tst_pass_result WHERE active_fi = %s",
8139 if (
$row[
"maxpoints"] > 0) {
8140 $factor =
$row[
"points"] /
$row[
"maxpoints"];
8145 if ($factor > $bestfactor) {
8147 $bestfactor = $factor;
8150 if (is_array($bestrow)) {
8151 return $bestrow[
"pass"];
8170 $counted_pass = null;
8176 return $counted_pass;
8192 $tree = $DIC[
'tree'];
8193 $ilDB = $DIC[
'ilDB'];
8195 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
8197 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
8199 $testSession = $testSessionFactory->getSession($active_id);
8201 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
8205 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
8207 $dynamicQuestionSetConfig->loadFromDb();
8218 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
8220 foreach ($this->questions as $value) {
8222 $workedthrough += 1;
8225 return $workedthrough;
8237 $ilDB = $DIC[
'ilDB'];
8239 if (is_null(
$pass)) {
8244 SELECT tst_pass_result.tstamp pass_res_tstamp, 8245 tst_test_result.tstamp quest_res_tstamp 8247 FROM tst_pass_result 8249 LEFT JOIN tst_test_result 8250 ON tst_test_result.active_fi = tst_pass_result.active_fi 8251 AND tst_test_result.pass = tst_pass_result.pass 8253 WHERE tst_pass_result.active_fi = %s 8254 AND tst_pass_result.pass = %s 8256 ORDER BY tst_test_result.tstamp DESC 8261 array(
'integer',
'integer'),
8262 array($active_id,
$pass)
8266 if (
$row[
'qres_tstamp']) {
8267 return $row[
'quest_res_tstamp'];
8270 return $row[
'pass_res_tstamp'];
8287 "executable" =>
true,
8288 "errormessage" =>
"" 8291 $result[
"executable"] =
false;
8296 $result[
"executable"] =
false;
8304 if ($active_id > 0) {
8318 $result[
"executable"] =
false;
8319 $result[
"errormessage"] = $this->lng->txt(
"detail_max_processing_time_reached");
8327 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8329 $testPassesSelector->setActiveId($active_id);
8330 $testPassesSelector->setLastFinishedPass(
$testSession->getLastFinishedPass());
8333 $closedPasses = $testPassesSelector->getClosedPasses();
8336 $result[
"executable"] =
false;
8337 $result[
"errormessage"] = $this->lng->txt(
"maximum_nr_of_tries_reached");
8342 $lastPass = $testPassesSelector->getLastFinishedPassTimestamp();
8345 $time_values = explode(
":", $pass_waiting_string);
8346 $next_pass_allowed = strtotime(
'+ ' . $time_values[0] .
' Months + ' . $time_values[1] .
' Days + ' . $time_values[2] .
' Hours' . $time_values[3] .
' Minutes', $lastPass);
8348 if (time() < $next_pass_allowed) {
8351 $result[
"executable"] =
false;
8352 $result[
"errormessage"] = sprintf($this->lng->txt(
'wait_for_next_pass_hint_msg'), $date);
8365 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8371 return $passSelector->hasReportablePasses();
8378 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8384 return $passSelector->hasExistingPasses();
8397 $ilDB = $DIC[
'ilDB'];
8399 if ($active_id < 1) {
8402 if (
$pass === null) {
8406 "SELECT tst_times.started FROM tst_times WHERE tst_times.active_fi = %s AND tst_times.pass = %s ORDER BY tst_times.started",
8407 array(
'integer',
'integer'),
8408 array($active_id,
$pass)
8412 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/",
$row[
"started"], $matches)) {
8413 return mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
8448 $ilDB = $DIC[
'ilDB'];
8452 questtypes.type_tag, 8454 tstquest.obligatory, 8455 origquest.obj_fi orig_obj_fi 8457 FROM qpl_questions questions 8459 INNER JOIN qpl_qst_type questtypes 8460 ON questtypes.question_type_id = questions.question_type_fi 8462 INNER JOIN tst_test_question tstquest 8463 ON tstquest.question_fi = questions.question_id 8465 LEFT JOIN qpl_questions origquest 8466 ON origquest.question_id = questions.original_id 8468 WHERE tstquest.test_fi = %s 8470 ORDER BY tstquest.sequence 8473 $query_result =
$ilDB->queryF(
8481 while (
$row =
$ilDB->fetchAssoc($query_result)) {
8484 $question[
'obligationPossible'] = self::isQuestionObligationPossible(
$row[
'question_id']);
8499 if ($questionData[
'question_id'] != $questionId) {
8513 $row = $DIC->database()->fetchAssoc($DIC->database()->queryF(
8514 "SELECT COUNT(question_id) cnt FROM qpl_questions WHERE question_id = %s AND obj_fi = %s",
8515 array(
'integer',
'integer'),
8516 array($questionId, $this->
getId())
8519 return (
bool)
$row[
'cnt'];
8530 $points += $questionData[
'points'];
8541 $totalWorkingTime =
'00:00:00';
8546 $questionData[
'working_time']
8550 return $totalWorkingTime;
8556 public function getPotentialRandomTestQuestions()
8562 $ilDB = $DIC[
'ilDB'];
8566 questtypes.type_tag, 8567 origquest.obj_fi orig_obj_fi 8569 FROM qpl_questions questions 8571 INNER JOIN qpl_qst_type questtypes 8572 ON questtypes.question_type_id = questions.question_type_fi 8574 INNER JOIN tst_rnd_cpy tstquest 8575 ON tstquest.qst_fi = questions.question_id 8577 LEFT JOIN qpl_questions origquest 8578 ON origquest.question_id = questions.original_id 8580 WHERE tstquest.tst_fi = %s 8583 $query_result =
$ilDB->queryF(
8591 while (
$row =
$ilDB->fetchAssoc($query_result)) {
8594 $question[
'obligationPossible'] = self::isQuestionObligationPossible(
$row[
'question_id']);
8610 return ($this->shuffle_questions) ? 1 : 0;
8621 $this->shuffle_questions = ($a_shuffle) ? 1 : 0;
8638 return ($this->show_summary) ? $this->show_summary : 0;
8655 $this->show_summary = $a_value;
8666 if (($this->show_summary & 1) > 0) {
8682 $this->show_summary = 1;
8684 $this->show_summary = 0;
8696 if (($this->show_summary & 2) > 0) {
8712 $this->show_summary = $this->show_summary | 2;
8716 $this->show_summary = $this->show_summary ^ 2;
8729 if (($this->show_summary & 4) > 0) {
8745 $this->show_summary = $this->show_summary | 4;
8749 $this->show_summary = $this->show_summary ^ 4;
8762 if (($this->show_summary & 8) > 0) {
8778 $this->show_summary = $this->show_summary | 8;
8782 $this->show_summary = $this->show_summary ^ 8;
8795 return ($this->results_presentation) ? $this->results_presentation : 0;
8806 if (($this->results_presentation & 1) > 0) {
8821 if (($this->results_presentation & 2) > 0) {
8836 if (($this->results_presentation & 4) > 0) {
8851 if (($this->results_presentation & 8) > 0) {
8866 if (($this->results_presentation & 16) > 0) {
8881 if (($this->results_presentation & 32) > 0) {
8894 if (($this->results_presentation & 64) > 0) {
8907 if (($this->results_presentation & 128) > 0) {
8922 $this->results_presentation = $a_results_presentation;
8936 $this->results_presentation = $this->results_presentation | 1;
8939 $this->results_presentation = $this->results_presentation ^ 1;
8953 $this->results_presentation = $this->results_presentation | 2;
8956 $this->results_presentation = $this->results_presentation ^ 2;
8981 $this->results_presentation = $this->results_presentation | 4;
8984 $this->results_presentation = $this->results_presentation ^ 4;
8998 $this->results_presentation = $this->results_presentation | 8;
9001 $this->results_presentation = $this->results_presentation ^ 8;
9015 $this->results_presentation = $this->results_presentation | 16;
9018 $this->results_presentation = $this->results_presentation ^ 16;
9032 $this->results_presentation = $this->results_presentation | 32;
9035 $this->results_presentation = $this->results_presentation ^ 32;
9049 $this->results_presentation = $this->results_presentation | 64;
9052 $this->results_presentation = $this->results_presentation ^ 64;
9064 if ($a_comparison) {
9065 $this->results_presentation = $this->results_presentation | 128;
9068 $this->results_presentation = $this->results_presentation ^ 128;
9079 $ilDB = $DIC[
'ilDB'];
9081 "SELECT user_fi FROM tst_active WHERE active_id = %s",
9087 return $row[
"user_fi"];
9111 return ($this->allowedUsers) ? $this->allowedUsers : 0;
9116 $this->allowedUsers = $a_allowed_users;
9121 return ($this->allowedUsersTimeGap) ? $this->allowedUsersTimeGap : 0;
9126 $this->allowedUsersTimeGap = $a_allowed_users_time_gap;
9132 $ilDB = $DIC[
'ilDB'];
9136 if (($nr_of_users > 0) && ($time_gap > 0)) {
9138 $time_border = $now - $time_gap;
9139 $str_time_border = strftime(
"%Y%m%d%H%M%S", $time_border);
9141 SELECT DISTINCT tst_times.active_fi 9143 INNER JOIN tst_active 9144 ON tst_times.active_fi = tst_active.active_id 9146 tst_times.pass > tst_active.last_finished_pass OR tst_active.last_finished_pass IS NULL 9148 WHERE tst_times.tstamp > %s 9149 AND tst_active.test_fi = %s 9152 if (
$result->numRows() >= $nr_of_users) {
9153 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
9168 $ilDB = $DIC[
'ilDB'];
9171 "SELECT finished FROM tst_times WHERE active_fi = %s ORDER BY finished DESC",
9177 return $row[
"finished"];
9187 SELECT MAX(tst_times.tstamp) as last_pass_access 9189 WHERE active_fi = %s 9193 $res = $DIC->database()->queryF(
9195 array(
'integer',
'integer'),
9196 array($activeId, $passIndex)
9199 while (
$row = $DIC->database()->fetchAssoc(
$res)) {
9200 return $row[
'last_pass_access'];
9215 if (preg_match(
"/<[^>]*?>/", $a_text)) {
9232 for (
$i = 0;
$i < $a_material->getMaterialCount();
$i++) {
9233 $material = $a_material->getMaterial(
$i);
9234 if (strcmp($material[
"type"],
"mattext") == 0) {
9235 $result .= $material[
"material"]->getContent();
9237 if (strcmp($material[
"type"],
"matimage") == 0) {
9238 $matimage = $material[
"material"];
9239 if (preg_match(
"/(il_([0-9]+)_mob_([0-9]+))/", $matimage->getLabel(), $matches)) {
9241 if (!is_array(
$_SESSION[
"import_mob_xhtml"])) {
9242 $_SESSION[
"import_mob_xhtml"] = array();
9244 array_push(
$_SESSION[
"import_mob_xhtml"], array(
"mob" => $matimage->getLabel(),
"uri" => $matimage->getUri()));
9264 include_once
"./Services/RTE/classes/class.ilRTE.php";
9265 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
9267 $a_xml_writer->xmlStartTag(
"material");
9269 "texttype" =>
"text/plain" 9271 if ($this->
isHTML($a_material)) {
9272 $attrs[
"texttype"] =
"text/xhtml";
9277 foreach (
$mobs as $mob) {
9278 $moblabel =
"il_" . IL_INST_ID .
"_mob_" . $mob;
9279 if (strpos($a_material,
"mm_$mob") !==
false) {
9283 "label" => $moblabel,
9284 "uri" =>
"objects/" .
"il_" . IL_INST_ID .
"_mob_" . $mob .
"/" . $mob_obj->getTitle()
9287 $a_xml_writer->xmlElement(
"matimage", $imgattrs, null);
9290 $a_xml_writer->xmlEndTag(
"material");
9301 include_once
"./Services/Utilities/classes/class.ilUtil.php";
9314 $ilDB = $DIC[
'ilDB'];
9316 $affectedRows =
$ilDB->manipulateF(
9317 "UPDATE tst_tests SET certificate_visibility = %s, tstamp = %s WHERE test_id = %s",
9318 array(
'text',
'integer',
'integer'),
9319 array($a_value, time(), $this->
getTestId())
9331 return (strlen($this->certificate_visibility)) ? $this->certificate_visibility : 0;
9342 $this->certificate_visibility = $a_value;
9353 return ($this->anonymity) ? 1 : 0;
9366 $this->anonymity = 1;
9369 $this->anonymity = 0;
9382 return ($this->show_cancel) ? 1 : 0;
9395 $this->show_cancel = 1;
9398 $this->show_cancel = 0;
9411 return ($this->show_marker) ? 1 : 0;
9424 $this->show_marker = 1;
9427 $this->show_marker = 0;
9440 return ($this->fixed_participants) ? 1 : 0;
9453 $this->fixed_participants = 1;
9456 $this->fixed_participants = 0;
9471 $ilDB = $DIC[
'ilDB'];
9474 "SELECT anonymity FROM tst_tests WHERE obj_fi = %s",
9479 return $row[
'anonymity'];
9493 $ilDB = $DIC[
'ilDB'];
9496 SELECT tst_tests.question_set_type 9498 INNER JOIN tst_tests 9499 ON tst_active.test_fi = tst_tests.test_id 9500 WHERE tst_active.active_id = %s 9506 return $row[
'question_set_type'];
9522 throw new Exception(__METHOD__ .
' is deprecated ... use ilObjTest::lookupQuestionSetTypeByActiveId() instead!');
9525 $ilDB = $DIC[
'ilDB'];
9528 "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",
9533 return $row[
'random_test'];
9548 public function userLookupFullName($user_id, $overwrite_anonymity =
false, $sorted_order =
false, $suffix =
"")
9551 return $this->lng->txt(
"anonymous") . $suffix;
9553 include_once
'./Services/User/classes/class.ilObjUser.php';
9555 if (strlen($uname[
"firstname"] . $uname[
"lastname"]) == 0) {
9556 $uname[
"firstname"] = $this->lng->txt(
"deleted_user");
9558 if ($sorted_order) {
9559 return trim($uname[
"lastname"] .
", " . $uname[
"firstname"]) . $suffix;
9561 return trim($uname[
"firstname"] .
" " . $uname[
"lastname"]) . $suffix;
9576 return $this->lng->txt(
"tst_start_test");
9578 $active_pass = self::_getPass($active_id);
9581 if ($active_pass == 0) {
9582 return $this->lng->txt(
"tst_start_test");
9584 return $this->lng->txt(
"tst_start_new_test_pass");
9587 return $this->lng->txt(
"tst_resume_test");
9596 public function getAvailableDefaults()
9603 $ilDB = $DIC[
'ilDB'];
9607 "SELECT * FROM tst_test_defaults WHERE user_fi = %s ORDER BY name ASC",
9611 $defaults = array();
9613 $defaults[
$row[
"test_defaults_id"]] =
$row;
9627 return self::_getTestDefaults($test_defaults_id);
9633 $ilDB = $DIC[
'ilDB'];
9636 "SELECT * FROM tst_test_defaults WHERE test_defaults_id = %s",
9638 array($test_defaults_id)
9640 if (
$result->numRows() == 1) {
9657 $ilDB = $DIC[
'ilDB'];
9658 $affectedRows =
$ilDB->manipulateF(
9659 "DELETE FROM tst_test_defaults WHERE test_defaults_id = %s",
9661 array($test_default_id)
9674 $ilDB = $DIC[
'ilDB'];
9676 $testsettings = array(
9770 $next_id =
$ilDB->nextId(
'tst_test_defaults');
9772 'tst_test_defaults',
9774 'test_defaults_id' => array(
'integer', $next_id),
9775 'name' => array(
'text', $a_name),
9776 'user_fi' => array(
'integer',
$ilUser->getId()),
9777 'defaults' => array(
'clob', serialize($testsettings)),
9778 'marks' => array(
'clob', serialize($this->mark_schema)),
9779 'tstamp' => array(
'integer', time())
9793 $testsettings = unserialize($test_defaults[
"defaults"]);
9794 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
9795 $this->mark_schema = unserialize($test_defaults[
"marks"]);
9829 $this->
setKiosk($testsettings[
"Kiosk"]);
9833 $this->
setECTSFX($testsettings[
"ECTSFX"]);
9835 if (isset($testsettings[
"isRandomTest"])) {
9836 if ($testsettings[
"isRandomTest"]) {
9841 } elseif (isset($testsettings[
"questionSetType"])) {
9863 if (isset($testsettings[
'examid_in_kiosk'])) {
9868 if (isset($testsettings[
'show_exam_id'])) {
9922 if (extension_loaded(
"tidy")) {
9925 "output-xml" =>
true,
9926 "numeric-entities" =>
true 9929 $tidy->parseString($print_output,
$config,
'utf8');
9930 $tidy->cleanRepair();
9931 $print_output = tidy_get_output($tidy);
9932 $print_output = preg_replace(
"/^.*?(<html)/",
"\\1", $print_output);
9934 $print_output = str_replace(
" ",
" ", $print_output);
9935 $print_output = str_replace(
"⊗",
"X", $print_output);
9937 $xsl = file_get_contents(
"./Modules/Test/xml/question2fo.xsl");
9942 'font-family="Helvetica, unifont"',
9943 'font-family="' . $DIC[
'ilSetting']->
get(
'rpc_pdf_font',
'Helvetica, unifont') .
'"',
9947 $args = array(
'/_xml' => $print_output,
'/_xsl' => $xsl );
9950 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl", null, $args,
$params);
9964 $content = preg_replace(
"/href=\".*?\"/",
"", $content);
9965 $printbody =
new ilTemplate(
"tpl.il_as_tst_print_body.html",
true,
true,
"Modules/Test");
9967 $printbody->setVariable(
"ADM_CONTENT", $content);
9968 $printbody->setCurrentBlock(
"css_file");
9970 $printbody->parseCurrentBlock();
9971 $printbody->setCurrentBlock(
"css_file");
9973 $printbody->parseCurrentBlock();
9974 $printoutput = $printbody->get();
9975 $html = str_replace(
"href=\"./",
"href=\"" . ILIAS_HTTP_PATH .
"/", $printoutput);
9976 $html = preg_replace(
"/<div id=\"dontprint\">.*?<\\/div>/ims",
"",
$html);
9977 if (extension_loaded(
"tidy")) {
9980 "output-xml" =>
true,
9981 "numeric-entities" =>
true 9985 $tidy->cleanRepair();
9986 $html = tidy_get_output($tidy);
9987 $html = preg_replace(
"/^.*?(<html)/",
"\\1",
$html);
9989 $html = str_replace(
" ",
" ",
$html);
9992 $html = preg_replace(
"/src=\".\\//ims",
"src=\"" . ILIAS_HTTP_PATH .
"/",
$html);
10007 include_once
"./Services/Utilities/classes/class.ilUtil.php";
10009 $fp =
fopen($fo_file,
"w");
10013 include_once
'./Services/WebServices/RPC/classes/class.ilRpcClientFactory.php';
10020 $ilLog->write(__METHOD__ .
': ' . $e->getMessage());
10037 $ilDB = $DIC[
'ilDB'];
10040 "SELECT feedback FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10041 array(
'integer',
'integer',
'integer'),
10042 array($active_id, $question_id,
$pass)
10046 include_once(
"./Services/RTE/classes/class.ilRTE.php");
10062 public function saveManualFeedback($active_id, $question_id,
$pass, $feedback)
10065 $ilDB = $DIC[
'ilDB'];
10067 $affectedRows =
$ilDB->manipulateF(
10068 "DELETE FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10069 array(
'integer',
'integer',
'integer'),
10070 array($active_id, $question_id,
$pass)
10073 if (strlen($feedback)) {
10074 $next_id =
$ilDB->nextId(
'tst_manual_fb');
10079 'manual_feedback_id' => array(
'integer', $next_id ),
10080 'active_fi' => array(
'integer', $active_id ),
10081 'question_fi' => array(
'integer', $question_id ),
10082 'pass' => array(
'integer',
$pass),
10084 'tstamp' => array(
'integer', time() ),
10087 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
10090 $lng = $DIC[
'lng'];
10092 include_once
"./Modules/Test/classes/class.ilObjTestAccess.php";
10094 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
10122 include_once
"./Modules/Test/classes/class.ilTestSequence.php";
10133 $this->test_id = $a_id;
10147 if (count($participants)) {
10148 foreach ($participants as $active_id => $user_rec) {
10150 $reached_points = 0;
10152 foreach ($this->questions as $value) {
10154 if (is_object($question)) {
10155 $max_points += $question->getMaximumPoints();
10156 $reached_points += $question->getReachedPoints($active_id);
10157 if ($max_points > 0) {
10158 $percentvalue = $reached_points / $max_points;
10159 if ($percentvalue < 0) {
10160 $percentvalue = 0.0;
10166 $user_rec[
'firstname'] =
"";
10167 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
10170 "user_id" => $user_rec[
'usr_id'],
10171 "matriculation" => $user_rec[
'matriculation'],
10172 "lastname" => $user_rec[
'lastname'],
10173 "firstname" => $user_rec[
'firstname'],
10174 "login" => $user_rec[
'login'],
10175 "question_id" => $question->getId(),
10176 "question_title" => $question->getTitle(),
10177 "reached_points" => $reached_points,
10178 "max_points" => $max_points
10194 $ilDB = $DIC[
'ilDB'];
10197 "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",
10202 return $rec[
"obj_id"];
10214 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
10215 if ($ilPluginAdmin->isActive(
IL_COMP_MODULE,
"TestQuestionPool",
"qst", $a_pname)) {
10225 $ilDB = $DIC[
'ilDB'];
10228 "SELECT passed FROM tst_result_cache WHERE active_fi = %s",
10234 return $row[
'passed'];
10237 $result_array = &$this->
getTestResult($active_id, $counted_pass);
10238 return $result_array[
"test"][
"passed"];
10254 if ($cert->isComplete()) {
10286 public function getParticipantsForTestAndQuestion(
$test_id, $question_id)
10290 $ilDB = $DIC[
'ilDB'];
10293 SELECT tst_test_result.active_fi, tst_test_result.question_fi, tst_test_result.pass 10294 FROM tst_test_result 10295 INNER JOIN tst_active ON tst_active.active_id = tst_test_result.active_fi AND tst_active.test_fi = %s 10296 INNER JOIN qpl_questions ON qpl_questions.question_id = tst_test_result.question_fi 10297 LEFT JOIN usr_data ON usr_data.usr_id = tst_active.user_fi 10298 WHERE tst_test_result.question_fi = %s 10299 ORDER BY usr_data.lastname ASC, usr_data.firstname ASC 10304 array(
'integer',
'integer'),
10307 $foundusers = array();
10314 if (!array_key_exists(
$row[
"active_fi"], $foundusers)) {
10315 $foundusers[
$row[
"active_fi"]] = array();
10317 array_push($foundusers[
$row[
"active_fi"]], array(
"pass" => $row[
"pass"],
"qid" => $row[
"question_fi"]));
10319 return $foundusers;
10330 $foundParticipants = &
$data->getParticipants();
10331 $results = array(
"overview" => array(),
"questions" => array());
10332 if (count($foundParticipants)) {
10333 $results[
"overview"][$this->lng->txt(
"tst_eval_total_persons")] = count($foundParticipants);
10334 $total_finished =
$data->getTotalFinishedParticipants();
10335 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished")] = $total_finished;
10337 $diff_seconds = $average_time;
10338 $diff_hours = floor($diff_seconds / 3600);
10339 $diff_seconds -= $diff_hours * 3600;
10340 $diff_minutes = floor($diff_seconds / 60);
10341 $diff_seconds -= $diff_minutes * 60;
10342 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10344 $total_passed_reached = 0;
10345 $total_passed_max = 0;
10346 $total_passed_time = 0;
10347 foreach ($foundParticipants as $userdata) {
10348 if ($userdata->getPassed()) {
10350 $total_passed_reached += $userdata->getReached();
10351 $total_passed_max += $userdata->getMaxpoints();
10352 $total_passed_time += $userdata->getTimeOfWork();
10355 $average_passed_reached = $total_passed ? $total_passed_reached / $total_passed : 0;
10356 $average_passed_max = $total_passed ? $total_passed_max / $total_passed : 0;
10357 $average_passed_time = $total_passed ? $total_passed_time / $total_passed : 0;
10358 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed")] = $total_passed;
10359 $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);
10360 $average_time = $average_passed_time;
10361 $diff_seconds = $average_time;
10362 $diff_hours = floor($diff_seconds / 3600);
10363 $diff_seconds -= $diff_hours * 3600;
10364 $diff_minutes = floor($diff_seconds / 60);
10365 $diff_seconds -= $diff_minutes * 60;
10366 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10369 foreach (
$data->getQuestionTitles() as $question_id => $question_title) {
10373 foreach ($foundParticipants as $userdata) {
10374 for (
$i = 0;
$i <= $userdata->getLastPass();
$i++) {
10375 if (is_object($userdata->getPass(
$i))) {
10376 $question = &$userdata->getPass(
$i)->getAnsweredQuestionByQuestionId($question_id);
10377 if (is_array($question)) {
10379 $reached += $question[
"reached"];
10380 $max += $question[
"points"];
10385 $percent = $max ? $reached / $max * 100.0 : 0;
10386 $results[
"questions"][$question_id] = array(
10388 sprintf(
"%.2f", $answered ? $reached / $answered : 0) .
" " . strtolower($this->lng->txt(
"of")) .
" " . sprintf(
"%.2f", $answered ? $max / $answered : 0),
10389 sprintf(
"%.2f", $percent) .
"%",
10391 sprintf(
"%.2f", $answered ? $reached / $answered : 0),
10392 sprintf(
"%.2f", $answered ? $max / $answered : 0),
10404 require_once
'Modules/Test/classes/class.ilTestExportFactory.php';
10406 $test_exp = $expFactory->getExporter(
'xml');
10407 return $test_exp->buildExportFile();
10425 $this->mailnotification = $a_notification;
10430 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10435 $mail->sendSimpleNotification($owner_id, $this->
getTitle(), $usr_data);
10445 include_once
"./Modules/Test/classes/class.ilObjTestGUI.php";
10446 include_once
"./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
10448 return $table_gui->getSelectedColumns();
10453 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10462 require_once
'Modules/Test/classes/class.ilTestExportFactory.php';
10464 $exportObj = $expFactory->getExporter(
'results');
10465 $exportObj->setForcedAccessFilteredParticipantList($participantList);
10466 $file = $exportObj->exportToExcel($deliver =
false,
'active_id', $active_id, $passedonly =
false);
10467 include_once
"./Services/Mail/classes/class.ilFileDataMail.php";
10469 $fd->copyAttachmentFile($file,
"result_" . $active_id .
".xls");
10470 $file_names[] =
"result_" . $active_id .
".xls";
10472 $mail->sendAdvancedNotification($owner_id, $this->
getTitle(), $usr_data, $file_names);
10474 if (count($file_names)) {
10475 $fd->unlinkFiles($file_names);
10484 $ilDB = $DIC[
'ilDB'];
10487 $query =
"SELECT usr_id FROM usr_data";
10490 $activequery = sprintf(
10491 "SELECT user_fi FROM tst_active WHERE test_fi = %s AND user_fi = %s",
10492 $ilDB->quote($this->getTestId()),
10495 $activeresult =
$ilDB->query($activequery);
10496 if ($activeresult->numRows() == 0) {
10497 $user_id =
$data[
'usr_id'];
10498 if ($user_id != 13) {
10499 include_once
"./Modules/Test/classes/class.ilTestSession.php";
10506 $random = new \ilRandom();
10507 $nr_of_passes = $random->int(1, $passes);
10510 include_once
"./Modules/Test/classes/class.ilTestSequence.php";
10518 for ($seq = 1; $seq <= count($this->questions); $seq++) {
10519 $question_id =
$testSequence->getQuestionForSequence($seq);
10521 $assSettings =
new ilSetting(
'assessment');
10522 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
10524 $processLockerFactory->setQuestionId($objQuestion->getId());
10525 $processLockerFactory->setUserId(
$testSession->getUserId());
10526 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
10528 $objQuestion->setProcessLocker($processLockerFactory->getLocker());
10535 $testSession->setSubmittedTimestamp(date(
'Y-m-d H:i:s'));
10539 if ($number == 0) {
10550 $ilDB = $DIC[
'ilDB'];
10554 FROM tst_result_cache 10555 WHERE active_fi = %s 10565 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
10571 FROM tst_result_cache 10572 WHERE active_fi = %s 10589 if ($this->mailnottype == 1) {
10599 $this->mailnottype = 1;
10601 $this->mailnottype = 0;
10607 if ($this->exportsettings) {
10617 $this->exportsettings = $a_settings;
10619 $this->exportsettings = 0;
10625 if (($this->exportsettings & 1) > 0) {
10635 $this->exportsettings = $this->exportsettings | 1;
10638 $this->exportsettings = $this->exportsettings ^ 1;
10645 return $this->enabled_view_mode;
10650 $this->enabled_view_mode = $mode;
10665 $new_array = array();
10668 $query =
'SELECT question_fi FROM tst_test_question WHERE test_fi = %s';
10669 $types = array(
'integer');
10672 $new_question_id += 1;
10675 $ilDB = $DIC[
'ilDB'];
10679 $qid =
$row[
'question_fi'];
10681 if ($qid == $new_question_id) {
10683 } elseif ($qid == $previous_question_id) {
10684 $new_array[$position++] = $qid;
10685 $new_array[$position++] = $new_question_id;
10688 $new_array[$position++] = $qid;
10692 $update_query =
'UPDATE tst_test_question SET sequence = %s WHERE test_fi = %s AND question_fi = %s';
10693 $update_types = array(
'integer',
'integer',
'integer');
10695 foreach ($new_array as $position => $qid) {
10696 $ilDB->manipulateF(
10721 $values[] =
'instant_feedback_specific';
10724 $values[] =
'instant_feedback_generic';
10727 $values[] =
'instant_feedback_points';
10730 $values[] =
'instant_feedback_solution';
10754 'pass_details' =>
'setShowPassDetails',
10755 'solution_details' =>
'setShowSolutionDetails',
10756 'solution_printview' =>
'setShowSolutionPrintview',
10757 'solution_feedback' =>
'setShowSolutionFeedback',
10758 'solution_answers_only' =>
'setShowSolutionAnswersOnly',
10759 'solution_signature' =>
'setShowSolutionSignature',
10760 'solution_suggested' =>
'setShowSolutionSuggested',
10762 foreach ($setter as
$key => $setter) {
10778 $this->poolUsage = (boolean) $usage;
10787 $tree = $DIC[
'tree'];
10788 $db = $DIC[
'ilDB'];
10789 $pluginAdmin = $DIC[
'ilPluginAdmin'];
10791 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
10793 $questionSetConfig = $qscFactory->getQuestionSetConfig();
10796 $reindexedSequencePositionMap = $questionSetConfig->reindexQuestionOrdering();
10800 return $reindexedSequencePositionMap;
10806 $ilDB = $DIC[
'ilDB'];
10812 foreach ($orders as
$id => $position) {
10816 isset($obligations[
$id]) && $obligations[
$id] ? 1 : 0
10820 UPDATE tst_test_question 10823 WHERE question_fi = %s 10826 $ilDB->manipulateF(
10828 array(
'integer',
'integer',
'integer'),
10829 array(
$i, $obligatory, $id)
10839 $ilDB = $DIC[
'ilDB'];
10841 if ($question_before) {
10842 $query =
'SELECT sequence, test_fi FROM tst_test_question WHERE question_fi = %s';
10843 $types = array(
'integer');
10844 $values = array($question_before);
10848 if (!$question_before || ($rset && !(
$row =
$ilDB->fetchAssoc($rset)))) {
10855 $update =
'UPDATE tst_test_question SET sequence = sequence + 1 WHERE sequence > %s AND test_fi = %s';
10856 $types = array(
'integer',
'integer');
10860 $update =
'UPDATE tst_test_question SET sequence = %s WHERE question_fi = %s';
10861 $types = array(
'integer',
'integer');
10862 $values = array(
$row[
'sequence'] + 1, $question_to_move);
10871 $ilDB = $DIC[
'ilDB'];
10875 $IN_questions =
$ilDB->in(
'q1.question_id', array_keys(
$questions),
false,
'integer');
10878 SELECT count(q1.question_id) cnt 10880 FROM qpl_questions q1 10882 INNER JOIN qpl_questions q2 10883 ON q2.question_id = q1.original_id 10885 WHERE $IN_questions 10886 AND q1.obj_fi = q2.obj_fi 10893 return $row[
'cnt'] > 0;
10905 $ilDB = $DIC[
'ilDB'];
10908 "SELECT test_fi,MAX(pass) AS pass FROM tst_active" .
10909 " JOIN tst_pass_result ON (tst_pass_result.active_fi = tst_active.active_id)" .
10910 " WHERE user_fi=%s" .
10911 " GROUP BY test_fi",
10912 array(
'integer',
'integer'),
10913 array($a_user_id, 1)
10917 $obj_id = self::_getObjectIDFromTestID(
$row[
"test_fi"]);
10918 $all[$obj_id] = (bool)
$row[
"pass"];
10929 return $this->online;
10934 $this->online = (bool) $a_online;
10955 $this->print_best_solution_with_result = (bool) $status;
10985 $this->activation_visibility = (bool) $a_value;
10995 return (
bool) $this->activation_limited;
11000 $this->activation_limited = (bool) $a_value;
11012 $this->_highscore_enabled = (bool) $a_enabled;
11022 return (
bool) $this->_highscore_enabled;
11034 $this->_highscore_anon = (bool) $a_anon;
11048 return (
bool) $this->_highscore_anon;
11075 $this->_highscore_achieved_ts = (bool) $a_achieved_ts;
11085 return (
bool) $this->_highscore_achieved_ts;
11095 $this->_highscore_score = (bool) $a_score;
11105 return (
bool) $this->_highscore_score;
11115 $this->_highscore_percentage = (bool) $a_percentage;
11125 return (
bool) $this->_highscore_percentage;
11135 $this->_highscore_hints = (bool) $a_hints;
11145 return (
bool) $this->_highscore_hints;
11155 $this->_highscore_wtime = (bool) $a_wtime;
11165 return (
bool) $this->_highscore_wtime;
11175 $this->_highscore_own_table = (bool) $a_own_table;
11185 return (
bool) $this->_highscore_own_table;
11195 $this->_highscore_top_table = (bool) $a_top_table;
11205 return (
bool) $this->_highscore_top_table;
11216 $this->_highscore_top_num = (int) $a_top_num;
11229 $retval = $a_retval;
11230 if ((
int) $this->_highscore_top_num != 0) {
11231 $retval = $this->_highscore_top_num;
11244 return self::HIGHSCORE_SHOW_ALL_TABLES;
11248 return self::HIGHSCORE_SHOW_TOP_TABLE;
11253 return self::HIGHSCORE_SHOW_OWN_TABLE;
11264 case self::HIGHSCORE_SHOW_ALL_TABLES:
11269 case self::HIGHSCORE_SHOW_TOP_TABLE:
11274 case self::HIGHSCORE_SHOW_OWN_TABLE:
11285 switch ($specific_answer_feedback) {
11287 $this->specific_answer_feedback = 1;
11290 $this->specific_answer_feedback = 0;
11297 switch ($this->specific_answer_feedback) {
11333 require_once(
'Modules/TestQuestionPool/classes/class.assQuestion.php');
11341 $obligationPossible = call_user_func(array($classConcreteQuestion,
'isObligationPossible'), $questionId);
11343 return $obligationPossible;
11355 $ilDB = $DIC[
'ilDB'];
11357 $rset =
$ilDB->queryF(
'SELECT obligatory FROM tst_test_question WHERE question_fi = %s', array(
'integer'), array($question_id));
11360 return (
bool)
$row[
'obligatory'];
11381 $ilDB = $DIC[
'ilDB'];
11383 $rset =
$ilDB->queryF(
11384 'SELECT obligations_answered FROM tst_pass_result WHERE active_fi = %s AND pass = %s',
11385 array(
'integer',
'integer'),
11386 array($active_id,
$pass)
11390 return (
bool)
$row[
'obligations_answered'];
11393 return !self::hasObligations(
$test_id);
11407 $ilDB = $DIC[
'ilDB'];
11409 $rset =
$ilDB->queryF(
11410 'SELECT count(*) cnt FROM tst_test_question WHERE test_fi = %s AND obligatory = 1',
11417 return (
bool)
$row[
'cnt'] > 0;
11460 #region Examview / PDF Examview 11523 return (strlen($this->activation_starting_time)) ? $this->activation_starting_time : null;
11528 return (strlen($this->activation_ending_time)) ? $this->activation_ending_time : null;
11540 $ilDB = $DIC[
'ilDB'];
11543 $result =
$ilDB->queryF(
"SELECT tst_times.active_fi, tst_times.started FROM tst_times, tst_active WHERE tst_times.active_fi = tst_active.active_id AND tst_active.test_fi = %s ORDER BY tst_times.tstamp DESC",
11548 $times[
$row[
'active_fi']] = $row[
'started'];
11556 $ilDB = $DIC[
'ilDB'];
11560 "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",
11565 $times[
$row[
'active_fi']] = $row[
'additionaltime'];
11573 $ilDB = $DIC[
'ilDB'];
11576 "SELECT additionaltime FROM tst_addtime WHERE active_fi = %s",
11580 if (
$result->numRows() > 0) {
11582 return $row[
'additionaltime'];
11591 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
11599 $participantData->setActiveIdsFilter(array($active_id));
11602 $participantData->load($this->
getTestId());
11604 foreach ($participantData->getActiveIds() as $active_id) {
11605 $result = $DIC->database()->queryF(
11606 "SELECT active_fi FROM tst_addtime WHERE active_fi = %s",
11611 if (
$result->numRows() > 0) {
11612 $DIC->database()->manipulateF(
11613 "DELETE FROM tst_addtime WHERE active_fi = %s",
11619 $DIC->database()->manipulateF(
11620 "UPDATE tst_active SET tries = %s, submitted = %s, submittimestamp = %s WHERE active_id = %s",
11621 array(
'integer',
'integer',
'timestamp',
'integer'),
11622 array(0, 0, null, $active_id)
11625 $DIC->database()->manipulateF(
11626 "INSERT INTO tst_addtime (active_fi, additionaltime, tstamp) VALUES (%s, %s, %s)",
11627 array(
'integer',
'integer',
'integer'),
11628 array($active_id, $minutes, time())
11631 require_once
'Modules/Test/classes/class.ilObjAssessmentFolder.php';
11657 public function getMaxPassOfTest()
11663 $ilDB = $DIC[
'ilDB'];
11666 SELECT MAX(tst_pass_result.pass) + 1 max_res 11667 FROM tst_pass_result 11668 INNER JOIN tst_active ON tst_active.active_id = tst_pass_result.active_fi 11669 WHERE test_fi = ' .
$ilDB->quote($this->
getTestId(),
'integer') .
' 11673 return (
int)
$data[
'max_res'];
11684 $ilDB = $DIC[
'ilDB'];
11686 $exam_id_query =
'SELECT exam_id FROM tst_pass_result WHERE active_fi = %s AND pass = %s';
11687 $exam_id_result =
$ilDB->queryF($exam_id_query, array(
'integer',
'integer' ), array( $active_id,
$pass ));
11688 if (
$ilDB->numRows($exam_id_result) == 1) {
11689 $exam_id_row =
$ilDB->fetchAssoc($exam_id_result);
11691 if ($exam_id_row[
'exam_id'] != null) {
11692 return $exam_id_row[
'exam_id'];
11710 $inst_id =
$ilSetting->get(
'inst_id', null);
11712 if ($test_obj_id === null) {
11713 $obj_id = self::_getObjectIDFromActiveID($active_id);
11715 $obj_id = $test_obj_id;
11718 $examId =
'I' . $inst_id .
'_T' . $obj_id .
'_A' . $active_id .
'_P' .
$pass;
11770 $this->char_selector_availability = (int) $availability;
11786 $this->char_selector_definition = $definition;
11828 $ilDB = $DIC[
'ilDB'];
11830 $query =
"SELECT question_set_type FROM tst_tests WHERE obj_fi = %s";
11882 return self::lookupQuestionSetType($a_obj_id) == self::QUESTION_SET_TYPE_RANDOM;
11889 return $lng->
txt(
'tst_question_set_type_fixed');
11892 return $lng->
txt(
'tst_question_set_type_random');
11895 return $lng->
txt(
'tst_question_set_type_dynamic');
11912 require_once
'class.ilTestScoring.php';
11914 $scoring->setPreserveManualScores($preserve_manscoring);
11915 $scoring->recalculateSolutions();
11920 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
11922 $questionChangeListeners = array(
11926 return $questionChangeListeners;
11932 $ilDB = $DIC[
'ilDB'];
11937 INNER JOIN tst_tests 11938 ON test_id = test_fi 11947 $objIds[] = (int)
$row[
'obj_fi'];
11979 if (!self::isSkillManagementGloballyActivated()) {
11990 if (self::$isSkillManagementGloballyActivated === null) {
11991 include_once
'Services/Skill/classes/class.ilSkillManagementSettings.php';
11994 self::$isSkillManagementGloballyActivated = $skmgSet->isActivated();
11997 return self::$isSkillManagementGloballyActivated;
12060 $ilDB = $DIC[
'ilDB'];
12061 $lng = $DIC[
'lng'];
12062 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
12068 $activeId = $testOBJ->getActiveIdOfUser($userId);
12070 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12073 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12076 $testSession = $testSessionFactory->getSession($activeId);
12081 if ($a_force_new_run) {
12094 $ilDB = $DIC[
'ilDB'];
12095 $lng = $DIC[
'lng'];
12096 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
12103 $activeId = $testOBJ->getActiveIdOfUser($userId);
12105 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12108 $testSessionFactory->reset();
12110 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12113 $testSession = $testSessionFactory->getSession($activeId);
12136 public function adjustTestSequence()
12142 $ilDB = $DIC[
'ilDB'];
12145 SELECT COUNT(test_question_id) cnt 12146 FROM tst_test_question 12154 $questCount =
$row[
'cnt'];
12159 FROM tst_active tac 12160 INNER JOIN tst_sequence tseq 12161 ON tseq.active_fi = tac.active_id 12162 WHERE tac.test_fi = %s 12165 $partRes =
$ilDB->queryF(
12171 while (
$row =
$ilDB->fetchAssoc($partRes)) {
12172 $sequence = @unserialize(
$row[
'sequence']);
12175 $sequence = array();
12178 $sequence = array_filter($sequence,
function ($value) use ($questCount) {
12179 return $value <= $questCount;
12182 $num_seq = count($sequence);
12183 if ($questCount > $num_seq) {
12184 $diff = $questCount - $num_seq;
12185 for (
$i = 1;
$i <= $diff;
$i++) {
12186 $sequence[$num_seq +
$i - 1] = $num_seq +
$i;
12190 $new_sequence = serialize($sequence);
12192 $ilDB->update(
'tst_sequence', array(
12193 'sequence' => array(
'clob', $new_sequence)
12195 'active_fi' => array(
'integer',
$row[
'active_fi']),
12196 'pass' => array(
'integer',
$row[
'pass'])
12200 $new_sequence = serialize($questCount > 0 ? range(1, $questCount) : array());
12204 FROM tst_active tac 12205 INNER JOIN tst_sequence tseq 12206 ON tseq.active_fi = tac.active_id 12207 WHERE tac.test_fi = %s 12210 $part_rest =
$ilDB->queryF(
12216 while (
$row =
$ilDB->fetchAssoc($part_rest)) {
12217 $ilDB->update(
'tst_sequence', array(
12218 'sequence' => array(
'clob', $new_sequence)
12220 'active_fi' => array(
'integer',
$row[
'active_fi']),
12221 'pass' => array(
'integer',
$row[
'pass'])
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.
& getWorkedQuestions($active_id, $pass=null)
Gets the id's of all questions a user already worked through.
setHighscoreTopTable($a_top_table)
Sets if the top-rankings table should be shown.
setPassScoring($a_pass_scoring=SCORE_LAST_PASS)
Sets the pass scoring.
setSkillServiceEnabled($skillServiceEnabled)
getListOfQuestionsDescription()
Returns TRUE if the list of questions should be presented with the question descriptions.
setOldOnlineStatus($oldOnlineStatus)
buildStatisticsAccessFilteredParticipantList()
getScoreReporting()
Gets the score reporting of the ilObjTest object.
getCharSelectorDefinition()
getTimeExtensionsOfParticipants()
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.
static _getWorkingTimeOfParticipantForPass($active_id, $pass)
Returns the complete working time in seconds for a test participant.
static _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.
setMailNotification($a_notification)
Set mail notification settings.
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 getPoolQuestionChangeListeners(ilDBInterface $db, $poolObjId)
setPassword($a_password=null)
Sets the password for test access.
& processCSVRow($row, $quoteAll=false, $separator=";")
Processes an array as a CSV row and converts the array values to correct CSV values.
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()
static getPluginObject(string $a_ctype, string $a_cname, string $a_slot_id, string $a_pname)
getHighscoreOwnTable()
Gets if the own rankings table should be shown.
setPassDeletionAllowed($passDeletionAllowed)
setter for the test setting passDeletionAllowed
if(isset($_REQUEST['delete'])) $list
getECTSOutput()
{int|bool}
_getTitleOutput($active_id)
Returns the value of the title_output status.
setOnline($a_online=true)
getFixedParticipants()
Returns the fixed participants status.
static _getObjectIDFromTestID($test_id)
Returns the ILIAS test object id for a given test id.
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.
static _includeClass($question_type, $gui=0)
Include the php class file for a given question type.
static _updateTestResultCache($active_id, ilAssQuestionProcessLocker $processLocker=null)
Move this to a proper place.
getCustomStyle()
Get the custom style.
getResultsPresentation()
Returns the combined results presentation value.
const DEFAULT_PROCESSING_TIME_MINUTES
$followupQuestionAnswerFixationEnabled
static allObligationsAnswered($test_id, $active_id, $pass)
checks wether all questions marked as obligatory were answered within the test pass with given testId...
setShowKioskModeTitle($a_title=false)
Set to true, if the full test title should be shown in kiosk mode.
logAction($logtext="", $question_id="")
Logs an action into the Test&Assessment log.
getProcessingTimeAsMinutes()
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
static sumTimesInISO8601FormatH_i_s_Extended($time1, $time2)
isPassDeletionAllowed()
getter for the test setting passDeletionAllowed
static _getParticipantData($active_id)
Retrieves a participant name from active id.
_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.
& createQuestionGUI($question_type, $question_id=-1)
Creates a question GUI instance of a given question type.
isShowExamIdInTestPassEnabled()
setQuestionOrderAndObligations($orders, $obligations)
setRedirectionMode($redirection_mode=0)
processPrintoutput2FO($print_output)
Convert a print output to XSL-FO.
setQuestionSetType($questionSetType)
setter for question set type
setECTSOutput($a_ects_output)
{}
setActivationEndingTime($ending_time=null)
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.
static _getQuestionType($question_id)
Returns the question type of a question with a given id.
checkQuestionParent($questionId)
static _getSolutionMaxPass($question_id, $active_id)
Returns the maximum pass a users question solution.
static _lookupTestObjIdForQuestionId($a_q_id)
Get test Object ID for question ID.
saveCompleteStatus(ilTestQuestionSetConfig $testQuestionSetConfig)
Checks if the test is complete and saves the status in the database.
$accessFilteredParticipantList
setReportingDate($reporting_date)
Sets the reporting date of the ilObjTest object.
getQuestionTitle($title, $nr=null)
Returns the title of a test question and checks if the title output is allowed.
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
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...
& 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
loadFromDb()
loads the question set config for current test from the database
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.
setFixedParticipants($a_value=1)
Sets the fixed participants status.
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.
setTmpCopyWizardCopyId($tmpCopyWizardCopyId)
updateMetaData()
update meta data entry
static _getPassScoring($active_id)
Gets the pass scoring type.
static lookupPassResultsUpdateTimestamp($active_id, $pass)
& getExistingQuestions($pass=null)
Get the id's of the questions which are already part of the test.
setInstantFeedbackOptionsByArray($options)
setCharSelectorDefinition($definition='')
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...
getShowKioskModeParticipant()
Returns the status of the kiosk mode participant.
static $isSkillManagementGloballyActivated
setHighscoreScore($a_score)
Sets if the actual score should be displayed.
const SCORE_REPORTING_AFTER_PASSED
static factory($a_package, $a_timeout=0)
Creates an ilRpcClient instance to our ilServer.
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 ...
getOfflineStatus()
Get offline status.
getShowInfo()
Gets whether the complete information page is shown or the required data only.
& 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.
getJavaScriptOutput()
Returns if Javascript should be chosen for drag & drop actions for the active user.
setPassWaiting($pass_waiting)
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...
getShowSolutionAnswersOnly()
Returns if the full solution (including ILIAS content) should be presented to the solution or not...
& createTestSequence($active_id, $pass, $shuffle)
static getPoolQuestionChangeListener(ilDBInterface $db, $poolObjId)
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)
getXMLZip()
Get zipped xml file for test.
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.
setParticipantAccessFilter($participantAccessFilter)
static _lookupTitle($a_id)
lookup object title
getAnonymity()
Returns the anonymity status of the test.
getFixedQuestionSetTotalWorkingTime()
toXML()
Returns a QTI xml representation of the test.
getQuestionCount()
Returns the number of questions in the test.
setEndingTimeEnabled($ending_time_enabled)
setActivationLimited($a_value)
$showGradingStatusEnabled
TableGUI class for evaluation of all users.
setSpecificAnswerFeedback($specific_answer_feedback)
getShuffleQuestions()
Returns the status of the shuffle_questions variable.
static _lookupClientIP($a_user_id)
Lookup client ip.
$offeringQuestionHintsEnabled
setTestId($a_id)
Sets the test ID.
create()
create test object
isPreviousSolutionReuseEnabled($activeId)
isShowExamIdInTestResultsEnabled()
_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...
startingTimeReached()
Returns true if the starting time of a test is reached A starting time is not available for self asse...
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.
static _getObjectIDFromActiveID($active_id)
Returns the ILIAS test object id for a given active id.
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...
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
getActiveParticipantList()
setRedirectionUrl($redirection_url=null)
static _getBestPass($active_id)
Retrieves the best pass of a given user for a given test.
static _lookupAnonymity($a_obj_id)
Returns the anonymity status of a test with a given object id.
setEndingTime($ending_time=null)
Sets the ending time in database timestamp format for the test.
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.
setListOfQuestionsStart($a_value=true)
Sets if the the list of questions as the start page of the test.
loadQuestions($active_id="", $pass=null)
Load the test question id's from the database.
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.
isTestQuestion($questionId)
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.
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 !!
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
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.
isRandomTest()
Returns the fact wether this test is a random questions test or not.
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}
setShowKioskModeParticipant($a_participant=false)
Set to true, if the participant's name should be shown in kiosk mode.
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.
getFixedQuestionSetTotalPoints()
isExecutable($testSession, $user_id, $allowPassIncrease=false)
Checks if the test is executable by the given user.
$instantFeedbackAnswerFixationEnabled
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
static _getLogLanguage()
retrieve the log language for assessment logging
setSignSubmission($sign_submission)
$char_selector_definition
static completeMissingPluginName($questionTypeData)
getSpecificAnswerFeedback()
getImportMapping()
get array of (two) new created questions for import id
static _getMaxPass($active_id)
Retrieves the maximum pass of a given user for a given test in which the user answered at least one q...
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.
hasAnyTestResult(ilTestSession $testSession)
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)
setStartingTime($starting_time=null)
Sets the starting time in database timestamp format for the test.
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.
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
getAccessFilteredParticipantList()
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)
setCustomStyle($a_customStyle=null)
Set the custom style.
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.
setProcessingTime($processing_time="00:00:00")
Sets the processing time for the test.
$forceInstantFeedbackEnabled
foreach($_POST as $key=> $value) $res
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.
setShowSolutionSuggested($a_solution=false)
Set to TRUE, if the suggested solution should be shown in the solution.
getHighscoreAnon()
Gets if the highscores should be anonymized per setting.
getTestParticipantsForManualScoring($filter=null)
setExportSettings($a_settings)
saveToDb($properties_only=false)
Saves a ilObjTest object to a database.
static _getQuestionCountAndPointsForPassOfParticipant($active_id, $pass)
removeQuestion($question_id)
Removes a question from the test object.
getId()
get object id public
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 ...
getInstantFeedbackOptionsAsArray()
static _addLog($user_id, $object_id, $logtext, $question_id="", $original_id="", $test_only=false, $test_ref_id=null)
Add an assessment log entry.
setHighscoreTopNum($a_top_num)
Sets the number of entries which are to be shown in the top-rankings table.
canShowEctsGrades()
{boolean}
setActivationVisibility($a_value)
hasQuestionsWithoutQuestionpool()
evalTotalPersons()
Returns the number of persons who started the test.
hasSingleChoiceQuestions()
Returns TRUE if the test contains single choice results.
static _getScoreCutting($active_id)
Determines if the score of a question should be cut at 0 points or the score of the whole test...
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.
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 _getResultPass($active_id)
Retrieves the pass number that should be counted for a given user.
static _lookupDescription($a_id)
lookup object description
randomSelectQuestions($nr_of_questions, $questionpool, $use_obj_id=0, $qpls="", $pass=null)
Returns a random selection of questions.
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.
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.
static ensureParticipantsLastActivePassFinished($testObjId, $userId, $a_force_new_run=false)
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.
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.
getShowSolutionSuggested()
& getAllQuestions($pass=null)
Returns all questions of a test in test order.
setShowSolutionFeedback($a_feedback=true)
Sets if the the feedback should be presented to the user in the solution or not.
isSkillServiceToBeConsidered()
exportXMLMetaData(&$a_xml_writer)
export content objects meta data to xml (see ilias_co.dtd)
static _getCountSystem($active_id)
Gets the count system for the calculation of points.
setInstantFeedbackSolution($instant_feedback=0)
Sets the instant feedback for the solution.
setListOfQuestions($a_value=true)
Sets if the the list of questions should be presented to the user or not.
static _getSolvedQuestions($active_id, $question_fi=null)
get solved questions
static getAccessStatisticsUserFilter($refId)
buildIso8601PeriodFromUnixtimeForExportCompatibility($unix_timestamp)
setAllowedUsersTimeGap($a_allowed_users_time_gap)
getTitle()
get object title public
applyDefaults($test_defaults)
Applies given test defaults to this test.
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.
getAnsweredQuestionCount($active_id, $pass=null)
Retrieves the number of answered questions for a given user in a given test.
isBestSolutionPrintedWithResult()
$activation_starting_time
static isSkillManagementGloballyActivated()
getAnswerFeedbackPoints()
Returns 1 if answer specific feedback as reached points is activated.
static _lookupOwner($a_id)
lookup object owner
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.
setAccessFilteredParticipantList($accessFilteredParticipantList)
setECTSGrades(array $a_ects_grades)
{}
removeTestResultsFromSoapLpAdministration($userIds)
getMarkSchema()
{ASS_MarkSchema}
getAggregatedResultsData()
Returns the aggregated test results.
static _lookupAuthor($obj_id)
Gets the authors name of the ilObjTest object.
getStartingTime()
Returns the starting time of the test.
getStartingTimeOfParticipants()
Note, this function should only be used if absolutely necessary, since it perform joins on tables tha...
setAnonymity($a_value=0)
Sets the anonymity status of the test.
static lookupLastTestPassAccess($activeId, $passIndex)
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)
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
static _getTestIDFromObjectID($object_id)
Returns the ILIAS test id for a given object id.
getInstantFeedbackSolution()
Returns 1 if the correct solution will be shown after answering a question.
getFinalStatement()
Gets the final statement.
setKiosk($kiosk=0)
Sets the kiosk mode for the test.
removeQuestionFromSequences($questionId, $activeIds, ilTestReindexedSequencePositionMap $reindexedSequencePositionMap)
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.
isAnyInstantFeedbackOptionEnabled()
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
isInstantFeedbackAnswerFixationEnabled()
prepareTextareaOutput($txt_output, $prepare_for_latex_output=false, $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output in tests.
$char_selector_availability
static _createImportDirectory()
creates data directory for import files (data_dir/tst_data/tst_<id>/import, depending on data directo...
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.
update($pash, $contents, Config $config)
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 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)
Returns a unique and non existing Path for e temporary file or directory.
& 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)
getResultsForActiveId($active_id)
setResultsPresentationOptionsByArray($options)
static getFirstNewsIdForContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id="", $a_context_sub_obj_type="")
Get first new id of news set related to a certain context.
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.
setShowSolutionListComparison($a_comparison=false)
Set to TRUE, if the list of answers should be shown prior to finish the test.
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
static deleteNewsOfContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id=0, $a_context_sub_obj_type="")
Delete all news of a context.
getEndingTime()
Returns the ending time 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)
getTextAnswer($active_id, $question_id, $pass=null)
Returns the text answer of a given user for a given question.
getScoreCutting()
Determines if the score of a question should be cut at 0 points or the score of the whole test...
getCharSelectorAvailability()
setKioskMode($a_kiosk=false)
Sets the kiosk mode for the test.
getTitleFilenameCompliant()
returns the object title prepared to be used as a filename
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.
static _getManualScoring()
Retrieve the manual scoring settings.
deleteTest()
Deletes the test and all related objects, files and database entries.
setShowSolutionAnswersOnly($a_full=true)
Set to true, if the full solution (including the ILIAS content pages) should be shown in the solution...
static _getAvailableTests($use_object_id=false)
Returns the available tests for the active user.
setOfferingQuestionHintsEnabled($offeringQuestionHintsEnabled)
sets offering question hints enabled/disabled
setOfflineStatus($a_status)
Set offline status.
checkMaximumAllowedUsers()
getInvitedParticipantList()
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)
static _getMCScoring($active_id)
Gets the scoring type for multiple choice questions.
& 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.
static getManageParticipantsUserFilter($refId)
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...
& 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...
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.
setFollowupQuestionAnswerFixationEnabled($followupQuestionAnswerFixationEnabled)
saveAuthorToMetadata($a_author="")
Saves an authors name into the lifecycle metadata if no lifecycle metadata exists This will only be c...
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 getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
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.
& getCompleteEvaluationData($withStatistics=true, $filterby="", $filtertext="")
static getGuiClassNameByQuestionType($questionType)
canEditEctsGrades()
{boolean}
getProcessingTimeInSeconds($active_id="")
Returns the processing time for the test in seconds.
static _cleanupMediaObjectUsage($a_text, $a_usage_type, $a_usage_id)
Synchronises appearances of media objects in $a_text with media object usage table.
setDescription($a_desc)
set object description
getShowCancel()
Returns wheather the cancel test button is shown or not.
canShowTestResults(ilTestSession $testSession)
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)
static recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
isShowGradingStatusEnabled()
A class defining mark schemas for assessment test objects.
canShowSolutionPrintview($user_id=null)
Calculates if a user may see the solution printview of his/her test results.
getHighscoreScore()
Gets if the score column should be shown.
setActivationStartingTime($starting_time=null)
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.
isFollowupQuestionAnswerFixationEnabled()
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.
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)
setHighscorePercentage($a_percentage)
Sets if the percentages of the scores pass should be shown.
setIntroductionEnabled($introductionEnabled)
static _getUsePreviousAnswers($active_id, $user_active_user_setting=false)
Returns if the previous results should be hidden for a learner.
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
const QUESTION_SET_TYPE_DYNAMIC
type setting value for dynamic question set (continues testing mode)
deliverPDFfromHTML($content, $title=null)
Delivers a PDF file from XHTML.
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. ...
setListOfQuestionsDescription($a_value=true)
Sets the show_summary attribute to TRUE if the list of questions should be presented with the questio...
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.
static getFeedbackClassNameByQuestionType($questionType)
static _getQuestionTitle($question_id)
Returns the question title of a question with a given id.
setShowFinalStatement($show=0)
Sets whether the final statement should be shown or not.
static deleteRequestsByActiveIds($activeIds)
Deletes all hint requests relating to a testactive included in given active ids.
setSequenceSettings($sequence_settings=0)
SEQUENCE SETTING = POSTPONING ENABLED !!
reindexFixedQuestionOrdering()
setListOfQuestionsSettings($a_value=0)
Sets the settings for the list of questions options in the test properties This could contain one of ...
setListOfQuestionsEnd($a_value=true)
Sets if the the list of questions as the end page of the test.
static _setImportDirectory($a_import_dir=null)
set import directory
static _getTestDefaults($test_defaults_id)
read()
read object data from db into object
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
setShowSolutionSignature($a_signature=false)
Set to TRUE, if the signature field should be shown in the solution.
userLookupFullName($user_id, $overwrite_anonymity=false, $sorted_order=false, $suffix="")
Returns the full name of a test user according to the anonymity status.
static _getActiveIdOfUser($user_id="", $test_id="")
Gets the active id of the tst_active table for the active user.
setStartingTimeEnabled($starting_time_enabled)
getHighscoreTopNum($a_retval=10)
Gets the number of entries which are to be shown in the top-rankings table.
static _getImportDirectory()
Get the import directory location of the test.
& 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.
$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...
static lookupExamId($active_id, $pass)
evalTotalStartedAverageTime($activeIdsFilter=null)
Returns the average processing time for all started tests.
getPassScoring()
Gets the pass scoring type.