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';
598 public function __construct($a_id = 0, $a_call_by_reference =
true)
605 $lng->loadLanguageModule(
"assessment");
607 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
609 $this->mark_schema->createSimpleSchema(
610 $lng->txt(
"failed_short"),
611 $lng->txt(
"failed_official"),
614 $lng->txt(
"passed_short"),
615 $lng->txt(
"passed_official"),
621 $this->author =
$ilUser->fullname;
622 $this->introductionEnabled =
false;
623 $this->introduction =
"";
624 $this->questions = array();
626 $this->score_reporting = self::SCORE_REPORTING_FINISHED;
627 $this->instant_verification = 0;
628 $this->answer_feedback_points = 0;
629 $this->reporting_date =
"";
630 $this->nr_of_tries = 0;
632 $this->use_previous_answers = 1;
633 $this->title_output = 0;
634 $this->starting_time =
"";
635 $this->ending_time =
"";
636 $this->processing_time =
"";
637 $this->enable_processing_time =
"0";
638 $this->reset_processing_time = 0;
639 $this->ects_output =
false;
640 $this->ects_fx = null;
641 $this->shuffle_questions =
false;
642 $this->mailnottype = 0;
643 $this->exportsettings = 0;
644 $this->show_summary = 8;
649 $this->answer_feedback = 0;
650 $this->password =
"";
651 $this->certificate_visibility = 0;
652 $this->allowedUsers =
"";
653 $this->_showfinalstatement =
false;
654 $this->_finalstatement =
"";
655 $this->_showinfo =
true;
656 $this->_forcejs =
true;
657 $this->_customStyle =
"";
658 $this->allowedUsersTimeGap =
"";
659 $this->anonymity = 0;
660 $this->show_cancel = 0;
661 $this->show_marker = 0;
662 $this->fixed_participants = 0;
667 $this->testSession =
false;
668 $this->testSequence =
false;
669 $this->mailnotification = 0;
670 $this->poolUsage = 1;
672 $this->ects_grades = array(
680 $this->autosave =
false;
681 $this->autosave_ival = 30000;
683 $this->enable_examview =
false;
684 $this->show_examview_html =
false;
685 $this->show_examview_pdf =
false;
686 $this->enable_archiving =
false;
688 $this->express_mode =
false;
689 $this->template_id =
'';
690 $this->redirection_mode = 0;
691 $this->redirection_url = null;
692 $this->show_exam_id_in_test_pass_enabled =
false;
693 $this->show_exam_id_in_test_results_enabled =
false;
694 $this->sign_submission =
false;
695 $this->char_selector_availability = 0;
696 $this->char_selector_definition = null;
698 $this->showGradingStatusEnabled =
true;
699 $this->showGradingMarkEnabled =
true;
701 $this->followupQuestionAnswerFixationEnabled =
false;
702 $this->instantFeedbackAnswerFixationEnabled =
false;
704 $this->testFinalBroken =
false;
706 $this->tmpCopyWizardCopyId = null;
718 require_once
'Services/Utilities/classes/class.ilUtil.php';
761 if (!parent::update()) {
788 public function delete()
791 if (!parent::delete()) {
801 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssQuestionSkillAssignmentImportFails.php';
803 $qsaImportFails->deleteRegisteredImportFails();
804 require_once
'Modules/Test/classes/class.ilTestSkillLevelThresholdImportFails.php';
806 $sltImportFails->deleteRegisteredImportFails();
819 $tree = $DIC[
'tree'];
820 $ilDB = $DIC[
'ilDB'];
821 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
824 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
826 $participantData->load($this->
getTestId());
829 $affectedRows =
$ilDB->manipulateF(
830 "DELETE FROM tst_mark WHERE test_fi = %s",
835 $affectedRows =
$ilDB->manipulateF(
836 "DELETE FROM tst_tests WHERE test_id = %s",
841 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
843 $testQuestionSetConfigFactory->getQuestionSetConfig()->removeQuestionSetRelatedData();
846 include_once
"./Services/Utilities/classes/class.ilUtil.php";
848 $directory = $tst_data_dir .
"/tst_" . $this->
getId();
849 if (is_dir($directory)) {
850 include_once
"./Services/Utilities/classes/class.ilUtil.php";
853 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
859 foreach (
$mobs as $mob) {
875 include_once
"./Services/Utilities/classes/class.ilUtil.php";
878 if (!is_writable($tst_data_dir)) {
879 $this->
ilias->raiseError(
"Test Data Directory (" . $tst_data_dir
880 .
") not writeable.", $this->
ilias->error_obj->MESSAGE);
884 $tst_dir = $tst_data_dir .
"/tst_" . $this->
getId();
886 if (!@is_dir($tst_dir)) {
887 $this->
ilias->raiseError(
"Creation of Test Directory failed.", $this->
ilias->error_obj->MESSAGE);
890 $export_dir = $tst_dir .
"/export";
892 if (!@is_dir($export_dir)) {
893 $this->
ilias->raiseError(
"Creation of Export Directory failed.", $this->
ilias->error_obj->MESSAGE);
904 include_once
"./Services/Utilities/classes/class.ilUtil.php";
915 public function getExportFiles($dir)
918 if (!@is_dir($dir) || !is_writeable($dir)) {
927 if ($file->isDir()) {
931 $files[] = $file->getBasename();
944 if (strlen($a_import_dir)) {
945 $_SESSION[
"tst_import_dir"] = $a_import_dir;
959 if (strlen(
$_SESSION[
"tst_import_dir"])) {
978 $ilias = $DIC[
'ilias'];
979 include_once
"./Services/Utilities/classes/class.ilUtil.php";
983 if (!is_writable($tst_data_dir)) {
984 $ilias->raiseError(
"Test Data Directory (" . $tst_data_dir
985 .
") not writeable.", $ilias->error_obj->FATAL);
989 $tst_dir = $tst_data_dir .
"/tst_import";
991 if (!@is_dir($tst_dir)) {
992 $ilias->raiseError(
"Creation of test import directory failed.", $ilias->error_obj->FATAL);
1010 $ilDB = $DIC[
'ilDB'];
1013 "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",
1019 if (strcmp($row[
'foundtypes'],
'assSingleChoice') == 0) {
1035 $ilDB = $DIC[
'ilDB'];
1038 "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",
1042 if (
$result->numRows() == 1) {
1044 if (strcmp($row[
'foundtypes'],
'assSingleChoice') == 0) {
1062 $ilDB = $DIC[
'ilDB'];
1070 SELECT DISTINCT(qpl_qst_sc.shuffle) foundshuffles 1076 WHERE tst_test_result.question_fi = qpl_questions.question_id 1077 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id 1078 AND tst_test_result.active_fi = tst_active.active_id 1079 AND qpl_questions.question_id = qpl_qst_sc.question_fi 1080 AND tst_active.test_fi = %s 1081 AND qpl_qst_type.type_tag = %s 1083 array(
'integer',
'text'),
1084 array($this->
getTestId(),
'assSingleChoice')
1086 if (
$result->numRows() == 1) {
1088 return ($row[
'foundshuffles'] == 0);
1101 if (!count($this->mark_schema->mark_steps)) {
1121 $tree = $DIC[
'tree'];
1122 $ilDB = $DIC[
'ilDB'];
1123 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
1126 $test->loadFromDb();
1128 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1131 return $test->isComplete($testQuestionSetConfigFactory->getQuestionSetConfig());
1143 $ilDB = $DIC[
'ilDB'];
1147 if (!preg_match(
'/\d+/', $this->
getECTSFX())) {
1154 SET ects_output = %s, ects_a = %s, ects_b = %s, ects_c = %s, ects_d = %s, ects_e = %s, ects_fx = %s 1155 WHERE test_id = %s",
1156 array(
'text',
'float',
'float',
'float',
'float',
'float',
'float',
'integer'),
1159 $grades[
'A'], $grades[
'B'], $grades[
'C'], $grades[
'D'], $grades[
'E'],
1174 $ilDB = $DIC[
'ilDB'];
1177 if ($this->
isComplete($testQuestionSetConfig)) {
1182 "UPDATE tst_tests SET complete = %s WHERE test_id = %s",
1183 array(
'text',
'integer'),
1184 array($complete, $this->test_id)
1209 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1210 $completecontent =
"";
1212 $completecontent .= $content;
1229 $tree = $DIC[
'tree'];
1230 $ilDB = $DIC[
'ilDB'];
1231 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
1238 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
1240 $testQuestionSetConfig = $testQuestionSetConfigFactory->getQuestionSetConfig();
1242 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1243 if ($this->test_id == -1) {
1245 $next_id =
$ilDB->nextId(
'tst_tests');
1247 $ilDB->insert(
'tst_tests', array(
1248 'test_id' => array(
'integer', $next_id),
1249 'obj_fi' => array(
'integer', $this->
getId()),
1250 'author' => array(
'text', $this->
getAuthor()),
1254 'showinfo' => array(
'integer', $this->
getShowInfo()),
1255 'forcejs' => array(
'integer', $this->
getForceJS()),
1267 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1269 'kiosk' => array(
'integer', $this->
getKiosk()),
1280 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1282 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : null),
1283 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : null),
1284 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : null),
1285 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : null),
1286 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : null),
1287 'ects_fx' => array(
'float', $this->
getECTSFX()),
1296 'password' => array(
'text', $this->
getPassword()),
1304 'created' => array(
'integer', time()),
1305 'tstamp' => array(
'integer', time()),
1307 'template_id' => array(
'integer', $this->
getTemplate()),
1308 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1323 'autosave' => array(
'integer', (
int) $this->
getAutosave()),
1346 'pass_waiting' => array(
'text', (
string) $this->
getPassWaiting())
1349 $this->test_id = $next_id;
1359 "SELECT * FROM tst_tests WHERE test_id = %s",
1361 array($this->test_id)
1363 if (
$result->numRows() == 1) {
1371 'author' => array(
'text', $this->
getAuthor()),
1375 'showinfo' => array(
'integer', $this->
getShowInfo()),
1376 'forcejs' => array(
'integer', $this->
getForceJS()),
1388 'nr_of_tries' => array(
'integer', $this->
getNrOfTries()),
1390 'kiosk' => array(
'integer', $this->
getKiosk()),
1401 'complete' => array(
'text', $this->
isComplete($testQuestionSetConfig)),
1403 'ects_a' => array(
'float', strlen($this->ects_grades[
"A"]) ? $this->ects_grades[
"A"] : null),
1404 'ects_b' => array(
'float', strlen($this->ects_grades[
"B"]) ? $this->ects_grades[
"B"] : null),
1405 'ects_c' => array(
'float', strlen($this->ects_grades[
"C"]) ? $this->ects_grades[
"C"] : null),
1406 'ects_d' => array(
'float', strlen($this->ects_grades[
"D"]) ? $this->ects_grades[
"D"] : null),
1407 'ects_e' => array(
'float', strlen($this->ects_grades[
"E"]) ? $this->ects_grades[
"E"] : null),
1408 'ects_fx' => array(
'float', $this->
getECTSFX()),
1417 'password' => array(
'text', $this->
getPassword()),
1425 'tstamp' => array(
'integer', time()),
1427 'template_id' => array(
'integer', $this->
getTemplate()),
1428 'pool_usage' => array(
'integer', $this->
getPoolUsage()),
1443 'autosave' => array(
'integer', (
int) $this->
getAutosave()),
1466 'pass_waiting' => array(
'text', (
string) $this->
getPassWaiting())
1469 'test_id' => array(
'integer', (
int) $this->
getTestId())
1473 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1475 $logresult =
$ilDB->queryF(
1476 "SELECT * FROM tst_tests WHERE test_id = %s",
1481 if ($logresult->numRows() == 1) {
1482 $newrow =
$ilDB->fetchAssoc($logresult);
1484 $changed_fields = array();
1485 foreach ($oldrow as $key => $value) {
1486 if (strcmp($oldrow[$key], $newrow[$key]) != 0) {
1487 array_push($changed_fields,
"$key: " . $oldrow[$key] .
" => " . $newrow[$key]);
1490 $changes = join(
", ", $changed_fields);
1491 if (count($changed_fields) > 0) {
1499 $aresult =
$ilDB->queryF(
1500 "SELECT active_id FROM tst_active WHERE test_fi = %s AND tries >= %s AND submitted = %s",
1501 array(
'integer',
'integer',
'integer'),
1504 while ($row =
$ilDB->fetchAssoc($aresult)) {
1506 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1507 array(
'integer',
'timestamp',
'integer'),
1508 array(1, date(
'Y-m-d H:i:s'), $row[
"active_id"])
1513 $aresult =
$ilDB->queryF(
1514 "SELECT active_id FROM tst_active WHERE test_fi = %s AND tries < %s AND submitted = %s",
1515 array(
'integer',
'integer',
'integer'),
1518 while ($row =
$ilDB->fetchAssoc($aresult)) {
1520 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1521 array(
'integer',
'timestamp',
'integer'),
1522 array(0, null, $row[
"active_id"])
1527 $aresult =
$ilDB->queryF(
1528 "SELECT active_id FROM tst_active WHERE test_fi = %s AND submitted = %s",
1529 array(
'integer',
'integer'),
1532 while ($row =
$ilDB->fetchAssoc($aresult)) {
1534 "UPDATE tst_active SET submitted = %s, submittimestamp = %s WHERE active_id = %s",
1535 array(
'integer',
'timestamp',
'integer'),
1536 array(0, null, $row[
"active_id"])
1544 include_once
'Services/News/classes/class.ilNewsItem.php';
1549 $newsItem->setContext($this->
getId(),
'tst');
1551 $newsItem->setTitle(
'new_test_online');
1552 $newsItem->setContentIsLangVar(
true);
1553 $newsItem->setContent(
'');
1554 $newsItem->setUserId(
$ilUser->getId());
1556 $newsItem->create();
1563 $newsItem->setTitle(
'new_test_online');
1564 $newsItem->setContentIsLangVar(
true);
1565 $newsItem->setContent(
'');
1566 $newsItem->update();
1571 if ($this->ref_id) {
1572 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
1585 $item->update($this->ref_id);
1588 if (!$properties_only) {
1593 $this->mark_schema->saveToDb($this->test_id);
1606 $ilDB = $DIC[
'ilDB'];
1608 $oldquestions = array();
1609 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
1612 "SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1618 array_push($oldquestions, $row[
"question_fi"]);
1624 $currentQuestionsObligationsQuery =
'SELECT question_fi, obligatory FROM tst_test_question WHERE test_fi = %s';
1625 $rset =
$ilDB->queryF($currentQuestionsObligationsQuery, array(
'integer'), array($this->
getTestId()));
1626 while ($row =
$ilDB->fetchAssoc($rset)) {
1627 $obligatoryQuestionState[$row[
'question_fi']] = $row[
'obligatory'];
1630 $affectedRows =
$ilDB->manipulateF(
1631 "DELETE FROM tst_test_question WHERE test_fi = %s",
1636 foreach ($this->questions as $key => $value) {
1638 if (!isset($obligatoryQuestionState[$value]) || is_null($obligatoryQuestionState[$value])) {
1639 $obligatoryQuestionState[$value] = 0;
1643 $next_id =
$ilDB->nextId(
'tst_test_question');
1644 $ilDB->insert(
'tst_test_question', array(
1645 'test_question_id' => array(
'integer', $next_id),
1646 'test_fi' => array(
'integer', $this->
getTestId()),
1647 'question_fi' => array(
'integer', $value),
1648 'sequence' => array(
'integer', $key),
1649 'obligatory' => array(
'integer', $obligatoryQuestionState[$value]),
1650 'tstamp' => array(
'integer', time())
1653 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1656 "SELECT question_fi FROM tst_test_question WHERE test_fi = %s ORDER BY sequence",
1660 $newquestions = array();
1663 array_push($newquestions, $row[
"question_fi"]);
1666 foreach ($oldquestions as
$index => $question_id) {
1667 if (strcmp($newquestions[
$index], $question_id) != 0) {
1668 $pos = array_search($question_id, $newquestions);
1669 if ($pos ===
false) {
1676 foreach ($newquestions as
$index => $question_id) {
1677 if (array_search($question_id, $oldquestions) ===
false) {
1692 $ilDB = $DIC[
'ilDB'];
1694 'SELECT copy_id FROM tst_rnd_cpy WHERE tst_fi = %s',
1698 return $result->numRows() > 0;
1716 $rbacsystem = $DIC[
'rbacsystem'];
1717 $ilDB = $DIC[
'ilDB'];
1720 if (($questionpool != 0) && (!$use_obj_id)) {
1726 "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",
1730 $original_ids = array();
1731 $paramtypes = array();
1732 $paramvalues = array();
1734 array_push($original_ids, $row[
'original_id']);
1739 if (($questionpool == 0) && (!is_array($qpls))) {
1740 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
1742 if (count($available_pools)) {
1743 $available =
" AND " .
$ilDB->in(
'obj_fi', $available_pools,
false,
'integer');
1749 $constraint_qpls =
"";
1750 $result_array = array();
1751 if ($questionpool == 0) {
1752 if (is_array($qpls)) {
1753 if (count($qpls) > 0) {
1754 $constraint_qpls =
" AND " .
$ilDB->in(
'obj_fi', $qpls,
false,
'integer');
1759 $original_clause =
"";
1760 if (count($original_ids)) {
1761 $original_clause =
" AND " .
$ilDB->in(
'question_id', $original_ids,
true,
'integer');
1764 if ($questionpool == 0) {
1766 "SELECT question_id FROM qpl_questions WHERE original_id IS NULL $available $constraint_qpls AND owner > %s AND complete = %s $original_clause",
1767 array(
'integer',
'text'),
1772 "SELECT question_id FROM qpl_questions WHERE original_id IS NULL AND obj_fi = %s AND owner > %s AND complete = %s $original_clause",
1773 array(
'integer',
'integer',
'text'),
1774 array($questionpool, 0,
"1")
1777 $found_ids = array();
1779 array_push($found_ids, $row[
'question_id']);
1781 $nr_of_questions = ($nr_of_questions > count($found_ids)) ? count($found_ids) : $nr_of_questions;
1782 if ($nr_of_questions == 0) {
1785 $rand_keys = array_rand($found_ids, $nr_of_questions);
1787 if (is_array($rand_keys)) {
1788 foreach ($rand_keys as $key) {
1789 $result[$found_ids[$key]] = $found_ids[$key];
1792 $result[$found_ids[$rand_keys]] = $found_ids[$rand_keys];
1807 $ilDB = $DIC[
'ilDB'];
1810 "SELECT test_result_id FROM tst_test_result WHERE active_fi = %s AND pass = %s",
1811 array(
'integer',
'integer'),
1812 array($active_id,
$pass)
1830 $ilDB = $DIC[
'ilDB'];
1832 "SELECT test_random_question_id FROM tst_test_rnd_qst WHERE active_fi = %s AND pass = %s",
1833 array(
'integer',
'integer'),
1834 array($active_id,
$pass)
1836 return (
$result->numRows() > 0) ?
true :
false;
1845 $ilDB = $DIC[
'ilDB'];
1848 "SELECT * FROM tst_tests WHERE obj_fi = %s",
1850 array($this->
getId())
1852 if (
$result->numRows() == 1) {
1859 include_once(
"./Services/RTE/classes/class.ilRTE.php");
1897 "A" =>
$data->ects_a,
1898 "B" =>
$data->ects_b,
1899 "C" =>
$data->ects_c,
1900 "D" =>
$data->ects_d,
1901 "E" =>
$data->ects_e
1905 $this->mark_schema->flush();
1906 $this->mark_schema->loadFromDb($this->
getTestId());
1964 if ($this->ref_id) {
1965 include_once
"./Services/Object/classes/class.ilObjectActivation.php";
1967 switch ($activation[
"timing_type"]) {
1992 $ilDB = $DIC[
'ilDB'];
1994 $this->questions = array();
1996 if (strcmp($active_id,
"") == 0) {
1999 if (is_null(
$pass)) {
2000 $pass = self::_getPass($active_id);
2003 "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",
2004 array(
'integer',
'integer'),
2005 array($active_id,
$pass)
2011 if (
$result->numRows() == 0) {
2013 "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",
2020 "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",
2022 array($this->test_id)
2027 $this->questions[
$index++] =
$data[
"question_fi"];
2055 return (strlen($this->introduction)) ? $this->introduction : null;
2083 if (is_null($a_statement)) {
2098 $this->_showinfo = ($a_info) ? 1 : 0;
2110 $this->_forcejs = ($a_js) ? 1 : 0;
2122 $this->_customStyle = $a_customStyle;
2134 return (strlen($this->_customStyle)) ? $this->_customStyle : null;
2147 $css_path = str_replace(
"ta.css",
"customstyles", $css_path) .
"/";
2148 $customstyles = array();
2149 if (is_dir($css_path)) {
2151 include_once
"./Services/Utilities/classes/class.ilFileUtils.php";
2155 if (strpos($filename,
".css")) {
2156 array_push($customstyles, $filename);
2161 return $customstyles;
2175 $custom = str_replace(
"ta.css",
"customstyles/" . $this->
getCustomStyle(), $default);
2176 if (file_exists($custom)) {
2178 $custom = str_replace(
"ta.css",
"customstyles/" . $this->
getCustomStyle(), $custom);
2197 $this->_showfinalstatement = ($show) ? 1 : 0;
2208 return (strlen($this->_finalstatement)) ? $this->_finalstatement : null;
2220 return ($this->_showinfo) ? 1 : 0;
2232 return ($this->_forcejs) ? 1 : 0;
2244 return ($this->_showfinalstatement) ? 1 : 0;
2264 return ($this->ects_output) ? 1 : 0;
2272 $this->ects_output = $a_ects_output ? 1 : 0;
2280 return (strlen($this->ects_fx)) ? $this->ects_fx : null;
2288 $this->ects_fx = $a_ects_fx;
2304 $this->ects_grades = $a_ects_grades;
2314 return ($this->sequence_settings) ? $this->sequence_settings : 0;
2364 switch ($instant_feedback) {
2366 $this->instant_verification = 1;
2369 $this->instant_verification = 0;
2385 $this->answer_feedback = 1;
2388 $this->answer_feedback = 0;
2400 switch ($generic_answer_feedback) {
2402 $this->answer_feedback = 1;
2405 $this->answer_feedback = 0;
2421 $this->answer_feedback_points = 1;
2424 $this->answer_feedback_points = 0;
2436 $this->reporting_date =
'';
2458 return ($this->score_reporting) ? $this->score_reporting : 0;
2464 case self::SCORE_REPORTING_FINISHED:
2465 case self::SCORE_REPORTING_IMMIDIATLY:
2466 case self::SCORE_REPORTING_DATE:
2467 case self::SCORE_REPORTING_AFTER_PASSED:
2471 case self::SCORE_REPORTING_DISABLED:
2487 return ($this->instant_verification) ? $this->instant_verification : 0;
2500 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2511 return ($this->answer_feedback) ? $this->answer_feedback : 0;
2523 return ($this->answer_feedback_points) ? $this->answer_feedback_points : 0;
2535 return ($this->count_system) ? $this->count_system : 0;
2548 $ilDB = $DIC[
'ilDB'];
2550 "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",
2556 return $row[
"count_system"];
2570 return ($this->mc_scoring) ? $this->mc_scoring : 0;
2582 return ($this->score_cutting) ? $this->score_cutting : 0;
2594 return ($this->pass_scoring) ? $this->pass_scoring : 0;
2607 $ilDB = $DIC[
'ilDB'];
2609 "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",
2615 return $row[
"pass_scoring"];
2630 $ilDB = $DIC[
'ilDB'];
2632 "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",
2638 return $row[
"mc_scoring"];
2653 $ilDB = $DIC[
'ilDB'];
2655 "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",
2661 return $row[
"score_cutting"];
2675 return (strlen($this->reporting_date)) ? $this->reporting_date : null;
2687 return ($this->nr_of_tries) ? $this->nr_of_tries : 0;
2715 return ($this->_kiosk) ? $this->_kiosk : 0;
2728 $this->_kiosk = $kiosk;
2740 if (($this->_kiosk & 1) > 0) {
2757 $this->_kiosk = $this->_kiosk | 1;
2760 $this->_kiosk = $this->_kiosk ^ 1;
2774 if (($this->_kiosk & 2) > 0) {
2790 $this->_kiosk = $this->_kiosk | 2;
2793 $this->_kiosk = $this->_kiosk ^ 2;
2807 if (($this->_kiosk & 4) > 0) {
2822 if ($a_participant) {
2823 $this->_kiosk = $this->_kiosk | 4;
2826 $this->_kiosk = $this->_kiosk ^ 4;
2840 return ($this->use_previous_answers) ? $this->use_previous_answers : 0;
2852 return ($this->title_output) ? $this->title_output : 0;
2866 $ilDB = $DIC[
'ilDB'];
2869 "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",
2875 return $row[
"title_output"];
2884 return self::_getUsePreviousAnswers($activeId,
true);
2900 $ilDB = $DIC[
'ilDB'];
2906 "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",
2916 if ($user_active_user_setting) {
2917 $res =
$ilUser->getPref(
"tst_use_previous_answers");
2918 if (
$res !==
false) {
2935 return (strlen($this->processing_time)) ? $this->processing_time : null;
2946 if (strlen($this->processing_time)) {
2947 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches)) {
2948 if ((
int) $matches[1] + (
int) $matches[2] + (
int) $matches[3] == 0) {
2952 'hh' => $matches[1],
2953 'mm' => $matches[2],
2954 'ss' => $matches[3],
2964 if (strlen($this->processing_time)) {
2965 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/is", $this->processing_time, $matches)) {
2966 return ($matches[1] * 60) + $matches[2];
2970 return self::DEFAULT_PROCESSING_TIME_MINUTES;
2982 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $this->
getProcessingTime(), $matches)) {
2984 return ($matches[1] * 3600) + ($matches[2] * 60) + $matches[3] + $extratime;
3002 return $ending - $now;
3017 return ($this->enable_processing_time) ? $this->enable_processing_time : 0;
3029 return ($this->reset_processing_time) ? $this->reset_processing_time : 0;
3057 return ($this->starting_time != 0) ? $this->starting_time : 0;
3097 return ($this->ending_time != 0) ? $this->ending_time : 0;
3134 $this->use_previous_answers = 1;
3136 $this->use_previous_answers = 0;
3168 $this->title_output = 1;
3171 $this->title_output = 2;
3174 $this->title_output = 0;
3193 $this->processing_time = sprintf(
"%02d:%02d:00", floor($minutes / 60), $minutes % 60);
3206 $this->enable_processing_time =
"1";
3208 $this->enable_processing_time =
"0";
3222 $this->reset_processing_time = 1;
3224 $this->reset_processing_time = 0;
3237 $this->count_system = $a_count_system;
3265 return (strlen($this->password)) ? $this->password : null;
3277 $this->password = $a_password;
3289 $this->score_cutting = $a_score_cutting;
3301 $this->mc_scoring = $a_mc_scoring;
3313 switch ($a_pass_scoring) {
3361 $DIC[
'ilPluginAdmin'],
3365 foreach ($activeIds as $activeId) {
3369 foreach ($passSelector->getExistingPasses() as
$pass) {
3370 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($activeId,
$pass);
3373 $testSequence->removeQuestion($questionId, $reindexedSequencePositionMap);
3384 foreach ($removeQuestionIds as $value) {
3401 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3405 $question->delete($question_id);
3421 $ilDB = $DIC[
'ilDB'];
3424 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3426 $participantData->setUserIdsFilter($userIds);
3427 $participantData->load($this->
getTestId());
3440 require_once
'Services/Object/classes/class.ilObjectLP.php';
3442 $testLP->setTestObject($this);
3443 $testLP->resetLPDataForUserIds($participantData->
getUserIds(),
false);
3454 $ilDB = $DIC[
'ilDB'];
3457 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
3459 $participantData->setUserIdsFilter($userIds);
3460 $participantData->load($this->
getTestId());
3462 $IN_userIds =
$ilDB->in(
'usr_id', $participantData->getUserIds(),
false,
'integer');
3464 "DELETE FROM usr_pref WHERE $IN_userIds AND keyword = %s",
3466 array(
"tst_password_" . $this->
getTestId())
3469 if (count($participantData->getActiveIds())) {
3477 $ilDB = $DIC[
'ilDB'];
3479 $IN_activeIds =
$ilDB->in(
'active_fi', $activeIds,
false,
'integer');
3481 $ilDB->manipulate(
"DELETE FROM tst_solutions WHERE $IN_activeIds");
3482 $ilDB->manipulate(
"DELETE FROM tst_qst_solved WHERE $IN_activeIds");
3483 $ilDB->manipulate(
"DELETE FROM tst_test_result WHERE $IN_activeIds");
3484 $ilDB->manipulate(
"DELETE FROM tst_pass_result WHERE $IN_activeIds");
3485 $ilDB->manipulate(
"DELETE FROM tst_result_cache WHERE $IN_activeIds");
3486 $ilDB->manipulate(
"DELETE FROM tst_sequence WHERE $IN_activeIds");
3487 $ilDB->manipulate(
"DELETE FROM tst_times WHERE $IN_activeIds");
3490 $ilDB->manipulate(
"DELETE FROM tst_test_rnd_qst WHERE $IN_activeIds");
3492 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_tracking WHERE $IN_activeIds");
3493 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_answstatus WHERE $IN_activeIds");
3494 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_postponed WHERE $IN_activeIds");
3495 $ilDB->manipulate(
"DELETE FROM tst_seq_qst_checked WHERE $IN_activeIds");
3498 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3500 foreach ($activeIds as $active_id) {
3502 if (@is_dir(CLIENT_WEB_DIR .
"/assessment/tst_" . $this->
getTestId() .
"/$active_id")) {
3511 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
3518 $ilDB = $DIC[
'ilDB'];
3520 $IN_activeIds =
$ilDB->in(
'active_id', $activeIds,
false,
'integer');
3521 $ilDB->manipulate(
"DELETE FROM tst_active WHERE $IN_activeIds");
3534 $ilDB = $DIC[
'ilDB'];
3538 "SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3539 array(
'integer',
'integer'),
3543 if (
$data->sequence > 1) {
3546 "SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3547 array(
'integer',
'integer'),
3552 $affectedRows =
$ilDB->manipulateF(
3553 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3554 array(
'integer',
'integer'),
3555 array(
$data->sequence, $data_previous->test_question_id)
3558 $affectedRows =
$ilDB->manipulateF(
3559 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3560 array(
'integer',
'integer'),
3561 array(
$data->sequence - 1,
$data->test_question_id)
3563 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3581 $ilDB = $DIC[
'ilDB'];
3585 "SELECT * FROM tst_test_question WHERE test_fi=%s AND question_fi=%s",
3586 array(
'integer',
'integer'),
3591 "SELECT * FROM tst_test_question WHERE test_fi=%s AND sequence=%s",
3592 array(
'integer',
'integer'),
3595 if (
$result->numRows() == 1) {
3599 $affectedRows =
$ilDB->manipulateF(
3600 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3601 array(
'integer',
'integer'),
3602 array(
$data->sequence, $data_next->test_question_id)
3605 $affectedRows =
$ilDB->manipulateF(
3606 "UPDATE tst_test_question SET sequence=%s WHERE test_question_id=%s",
3607 array(
'integer',
'integer'),
3608 array(
$data->sequence + 1,
$data->test_question_id)
3610 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3630 $duplicate_id = $question->duplicate(
true, null, null, null, $this->
getId());
3632 return $duplicate_id;
3646 $ilDB = $DIC[
'ilDB'];
3647 #var_dump($question_id); 3649 $duplicate_id = $question_id;
3656 "SELECT MAX(sequence) seq FROM tst_test_question WHERE test_fi=%s",
3662 if (
$result->numRows() == 1) {
3664 $sequence =
$data->seq + 1;
3667 $next_id =
$ilDB->nextId(
'tst_test_question');
3668 $affectedRows =
$ilDB->manipulateF(
3669 "INSERT INTO tst_test_question (test_question_id, test_fi, question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
3670 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
3671 array($next_id, $this->
getTestId(), $duplicate_id, $sequence, time())
3673 if ($affectedRows == 1) {
3674 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
3680 $affectedRows =
$ilDB->manipulateF(
3681 "DELETE FROM tst_active WHERE test_fi = %s",
3687 return $duplicate_id;
3702 $ilDB = $DIC[
'ilDB'];
3704 "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",
3709 array_push($titles, $row[
"title"]);
3727 $ilDB = $DIC[
'ilDB'];
3729 "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",
3734 $titles[$row[
'question_id']] = $row[
"title"];
3756 } elseif (isset($nr)) {
3757 return $this->lng->txt(
"ass_question") .
' ' . $nr;
3759 return $this->lng->txt(
"ass_question");
3778 $ilDB = $DIC[
'ilDB'];
3781 "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",
3799 $ilDB = $DIC[
'ilDB'];
3801 $existing_questions = array();
3804 if (is_null(
$pass)) {
3808 "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",
3809 array(
'integer',
'integer'),
3810 array($active_id,
$pass)
3814 "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",
3820 if (
$data->original_id === null) {
3824 array_push($existing_questions,
$data->original_id);
3826 return $existing_questions;
3839 $ilDB = $DIC[
'ilDB'];
3841 if ($question_id < 1) {
3845 "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",
3849 if (
$result->numRows() == 1) {
3851 return $data->type_tag;
3866 $ilDB = $DIC[
'ilDB'];
3868 $next_id =
$ilDB->nextId(
'tst_times');
3869 $affectedRows =
$ilDB->manipulateF(
3870 "INSERT INTO tst_times (times_id, active_fi, started, finished, pass, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
3871 array(
'integer',
'integer',
'timestamp',
'timestamp',
'integer',
'integer'),
3872 array($next_id, $active_id, strftime(
"%Y-%m-%d %H:%M:%S"), strftime(
"%Y-%m-%d %H:%M:%S"),
$pass, time())
3886 $ilDB = $DIC[
'ilDB'];
3888 $affectedRows =
$ilDB->manipulateF(
3889 "UPDATE tst_times SET finished = %s, tstamp = %s WHERE times_id = %s",
3890 array(
'timestamp',
'integer',
'integer'),
3891 array(strftime(
"%Y-%m-%d %H:%M:%S"), time(), $times_id)
3905 $ilDB = $DIC[
'ilDB'];
3907 if (is_null(
$pass)) {
3909 "SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3910 array(
'integer',
'integer'),
3911 array($active_id, 0)
3915 "SELECT question_fi FROM tst_solutions WHERE active_fi = %s AND pass = %s GROUP BY question_fi",
3916 array(
'integer',
'integer'),
3917 array($active_id,
$pass)
3920 $result_array = array();
3922 array_push($result_array, $row[
"question_fi"]);
3924 return $result_array;
3938 return ((($currentpass > 0) && ($num == 0)) || $this->
isTestFinished($active_id)) ? true :
false;
3951 $ilDB = $DIC[
'ilDB'];
3953 $result_array = array();
3957 if (count($this->questions) == 0) {
3958 return $result_array;
3960 if (is_null(
$pass)) {
3961 $pass = self::_getPass($active_id);
3964 "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'),
3965 array(
'integer',
'integer'),
3966 array($active_id,
$pass)
3969 if (count($this->questions) == 0) {
3970 return $result_array;
3972 $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'));
3975 $result_array[$row[
"question_id"]] = $row;
3977 return $result_array;
3991 $ilDB = $DIC[
'ilDB'];
3999 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
4000 array(
'integer',
'integer',
'text'),
4003 } elseif (strlen($anonymous_id)) {
4005 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s AND anonymous_id = %s",
4006 array(
'integer',
'integer',
'text'),
4007 array($user_id, $this->test_id, $anonymous_id)
4010 if (
$GLOBALS[
'DIC'][
'ilUser']->
getId() == ANONYMOUS_USER_ID) {
4014 "SELECT active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
4015 array(
'integer',
'integer'),
4016 array($user_id, $this->test_id)
4021 return $row[
"active_id"];
4038 $ilDB = $DIC[
'ilDB'];
4048 "SELECT tst_active.active_id FROM tst_active WHERE user_fi = %s AND test_fi = %s",
4049 array(
'integer',
'integer'),
4054 return $row[
"active_id"];
4068 $keys = array_keys($array);
4071 foreach (
$keys as $key) {
4084 public function &
getTestResult($active_id,
$pass = null, $ordered_sequence =
false, $considerHiddenQuestions =
true, $considerOptionalQuestions =
true)
4087 $tree = $DIC[
'tree'];
4088 $ilDB = $DIC[
'ilDB'];
4090 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
4094 if (is_null(
$pass)) {
4098 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
4100 $testSession = $testSessionFactory->getSession($active_id);
4102 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4104 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id,
$pass);
4107 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4109 $dynamicQuestionSetConfig->loadFromDb();
4116 $testSequence->setConsiderHiddenQuestionsEnabled($considerHiddenQuestions);
4117 $testSequence->setConsiderOptionalQuestionsEnabled($considerOptionalQuestions);
4122 if ($ordered_sequence) {
4129 $arrResults = array();
4132 SELECT tst_test_result.question_fi, 4133 tst_test_result.points reached, 4134 tst_test_result.hint_count requested_hints, 4135 tst_test_result.hint_points hint_points, 4136 tst_test_result.answered answered 4138 FROM tst_test_result 4140 LEFT JOIN tst_solutions 4141 ON tst_solutions.active_fi = tst_test_result.active_fi 4142 AND tst_solutions.question_fi = tst_test_result.question_fi 4144 WHERE tst_test_result.active_fi = %s 4145 AND tst_test_result.pass = %s 4148 $solutionresult =
$ilDB->queryF(
4150 array(
'integer',
'integer'),
4151 array($active_id,
$pass)
4154 while ($row =
$ilDB->fetchAssoc($solutionresult)) {
4155 $arrResults[ $row[
'question_fi'] ] = $row;
4158 $numWorkedThrough = count($arrResults);
4160 require_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
4162 $IN_question_ids =
$ilDB->in(
'qpl_questions.question_id', $sequence,
false,
'integer');
4165 SELECT qpl_questions.*, 4166 qpl_qst_type.type_tag, 4167 qpl_sol_sug.question_fi has_sug_sol 4172 LEFT JOIN qpl_sol_sug 4173 ON qpl_sol_sug.question_fi = qpl_questions.question_id 4175 WHERE qpl_qst_type.question_type_id = qpl_questions.question_type_fi 4176 AND $IN_question_ids 4181 $unordered = array();
4185 $obligationsAnswered =
true;
4189 $row[
'points'] ? $arrResults[ $row[
'question_id'] ][
'reached'] / $row[
'points'] : 0
4192 if ($percentvalue < 0) {
4193 $percentvalue = 0.0;
4199 "max" => round($row[
'points'], 2),
4200 "reached" => round($arrResults[$row[
'question_id']][
'reached'], 2),
4201 'requested_hints' => $arrResults[$row[
'question_id']][
'requested_hints'],
4202 'hint_points' => $arrResults[$row[
'question_id']][
'hint_points'],
4203 "percent" => sprintf(
"%2.2f ", ($percentvalue) * 100) .
"%",
4205 "type" => $row[
"type_tag"],
4206 "qid" => $row[
'question_id'],
4207 "original_id" => $row[
"original_id"],
4208 "workedthrough" => isset($arrResults[$row[
'question_id']]) ? 1 : 0,
4209 'answered' => $arrResults[$row[
'question_id']][
'answered']
4212 if (!$arrResults[ $row[
'question_id'] ][
'answered']) {
4213 $obligationsAnswered =
false;
4216 $unordered[ $row[
'question_id'] ] =
$data;
4221 $numQuestionsTotal = count($unordered);
4225 $pass_requested_hints = 0;
4226 $pass_hint_points = 0;
4231 foreach ($sequence as $qid) {
4234 $pass_max += round($unordered[$qid][
'max'], 2);
4235 $pass_reached += round($unordered[$qid][
'reached'], 2);
4236 $pass_requested_hints += $unordered[$qid][
'requested_hints'];
4237 $pass_hint_points += $unordered[$qid][
'hint_points'];
4241 $unordered[$qid][
'nr'] = $key;
4242 array_push($found, $unordered[$qid]);
4251 if (
$results[
'reached_points'] < 0) {
4255 if ($pass_reached < 0) {
4260 $found[
'pass'][
'total_max_points'] = $pass_max;
4261 $found[
'pass'][
'total_reached_points'] = $pass_reached;
4262 $found[
'pass'][
'total_requested_hints'] = $pass_requested_hints;
4263 $found[
'pass'][
'total_hint_points'] = $pass_hint_points;
4264 $found[
'pass'][
'percent'] = ($pass_max > 0) ? $pass_reached / $pass_max : 0;
4265 $found[
'pass'][
'obligationsAnswered'] = $obligationsAnswered;
4266 $found[
'pass'][
'num_workedthrough'] = $numWorkedThrough;
4267 $found[
'pass'][
'num_questions_total'] = $numQuestionsTotal;
4269 $found[
"test"][
"total_max_points"] =
$results[
'max_points'];
4270 $found[
"test"][
"total_reached_points"] =
$results[
'reached_points'];
4271 $found[
"test"][
"total_requested_hints"] =
$results[
'hint_count'];
4272 $found[
"test"][
"total_hint_points"] =
$results[
'hint_points'];
4273 $found[
"test"][
"result_pass"] =
$results[
'pass'];
4274 $found[
'test'][
'result_tstamp'] =
$results[
'tstamp'];
4275 $found[
'test'][
'obligations_answered'] =
$results[
'obligations_answered'];
4277 if ((!$found[
'pass'][
'total_reached_points']) or (! $found[
'pass'][
'total_max_points'])) {
4280 $percentage = ($found[
'pass'][
'total_reached_points'] / $found[
'pass'][
'total_max_points']) * 100.0;
4282 if ($percentage < 0) {
4287 $found[
"test"][
"passed"] =
$results[
'passed'];
4301 $ilDB = $DIC[
'ilDB'];
4304 "SELECT COUNT(active_id) total FROM tst_active WHERE test_fi = %s",
4309 return $row[
"total"];
4321 $ilDB = $DIC[
'ilDB'];
4324 "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",
4325 array(
'integer',
'integer'),
4330 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"started"], $matches);
4331 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4332 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"finished"], $matches);
4333 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4334 $time += ($epoch_2 - $epoch_1);
4360 $ilDB = $DIC[
'ilDB'];
4363 "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",
4370 if (!array_key_exists($row[
"active_fi"], $times)) {
4371 $times[$row[
"active_fi"]] = 0;
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 $times[$row[
"active_fi"]] += ($epoch_2 - $epoch_1);
4391 $ilDB = $DIC[
'ilDB'];
4394 "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",
4395 array(
'integer',
'integer'),
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);
4418 $ilDB = $DIC[
'ilDB'];
4421 "SELECT * FROM tst_times WHERE active_fi = %s AND pass = %s ORDER BY started",
4422 array(
'integer',
'integer'),
4423 array($active_id,
$pass)
4427 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"started"], $matches);
4428 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4429 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"finished"], $matches);
4430 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4431 $time += ($epoch_2 - $epoch_1);
4459 $ilDB = $DIC[
'ilDB'];
4462 "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",
4463 array(
'integer',
'integer'),
4469 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"started"], $matches);
4470 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4471 if ($firstvisit == 0 || $epoch_1 < $firstvisit) {
4472 $firstvisit = $epoch_1;
4474 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"finished"], $matches);
4475 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4476 if ($epoch_2 > $lastvisit) {
4477 $lastvisit = $epoch_2;
4480 return array(
"firstvisit" => $firstvisit,
"lastvisit" => $lastvisit);
4492 $ilDB = $DIC[
'ilDB'];
4497 "SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.active_id = %s AND tst_active.active_id = tst_times.active_fi",
4505 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row->started, $matches);
4506 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4507 if (!$first_visit) {
4508 $first_visit = $epoch_1;
4510 if ($epoch_1 < $first_visit) {
4511 $first_visit = $epoch_1;
4513 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row->finished, $matches);
4514 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
4516 $last_visit = $epoch_2;
4518 if ($epoch_2 > $last_visit) {
4519 $last_visit = $epoch_2;
4521 $times[$row->active_fi] += ($epoch_2 - $epoch_1);
4524 foreach ($times as $key => $value) {
4525 $max_time += $value;
4527 if ((!$test_result[
"test"][
"total_reached_points"]) or (!$test_result[
"test"][
"total_max_points"])) {
4530 $percentage = ($test_result[
"test"][
"total_reached_points"] / $test_result[
"test"][
"total_max_points"]) * 100.0;
4531 if ($percentage < 0) {
4535 $mark_obj = $this->mark_schema->getMatchingMark($percentage);
4536 $first_date = getdate($first_visit);
4537 $last_date = getdate($last_visit);
4538 $qworkedthrough = 0;
4539 foreach ($test_result as $key => $value) {
4540 if (preg_match(
"/\d+/", $key)) {
4541 $qworkedthrough += $value[
"workedthrough"];
4544 if (!$qworkedthrough) {
4547 $atimeofwork = $max_time / $qworkedthrough;
4550 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4556 $result_mark = $mark_obj->getShortName();
4558 if ($mark_obj->getPassed() && $obligationsAnswered) {
4564 $percent_worked_through = 0;
4565 if (count($this->questions)) {
4566 $percent_worked_through = $qworkedthrough / count($this->questions);
4568 $result_array = array(
4569 "qworkedthrough" => $qworkedthrough,
4570 "qmax" => count($this->questions),
4571 "pworkedthrough" => $percent_worked_through,
4572 "timeofwork" => $max_time,
4573 "atimeofwork" => $atimeofwork,
4574 "firstvisit" => $first_date,
4575 "lastvisit" => $last_date,
4576 "resultspoints" => $test_result[
"test"][
"total_reached_points"],
4577 "maxpoints" => $test_result[
"test"][
"total_max_points"],
4578 "resultsmarks" => $result_mark,
4579 "passed" => $passed,
4580 "distancemedian" =>
"0" 4582 foreach ($test_result as $key => $value) {
4583 if (preg_match(
"/\d+/", $key)) {
4584 $result_array[$key] = $value;
4587 return $result_array;
4599 $totalpoints_array = array();
4601 foreach ($all_users as $active_id => $user_name) {
4603 $reached = $test_result[
"test"][
"total_reached_points"];
4604 $total = $test_result[
"test"][
"total_max_points"];
4606 $mark = $this->mark_schema->getMatchingMark($percentage * 100.0);
4608 $obligationsAnswered = $test_result[
"test"][
"obligations_answered"];
4611 if ($mark->getPassed() && $obligationsAnswered) {
4612 array_push($totalpoints_array, $test_result[
"test"][
"total_reached_points"]);
4616 return $totalpoints_array;
4627 $ilDB = $DIC[
'ilDB'];
4629 "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",
4633 $persons_array = array();
4635 $name = $this->lng->txt(
"anonymous");
4636 $fullname = $this->lng->txt(
"anonymous");
4639 if (strlen($row[
"firstname"] . $row[
"lastname"] . $row[
"title"]) == 0) {
4640 $name = $this->lng->txt(
"deleted_user");
4641 $fullname = $this->lng->txt(
"deleted_user");
4642 $login = $this->lng->txt(
"unknown");
4645 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4646 $name = $this->lng->txt(
"anonymous");
4647 $fullname = $this->lng->txt(
"anonymous");
4649 $name = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4650 $fullname = trim($row[
"title"] .
" " . $row[
"firstname"] .
" " . $row[
"lastname"]);
4654 $persons_array[$row[
"active_id"]] = array(
4656 "fullname" => $fullname,
4660 return $persons_array;
4672 $ilDB = $DIC[
'ilDB'];
4674 "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),
4678 $persons_array = array();
4685 $persons_array[$row[
"active_id"]] = $this->lng->txt(
"anonymous");
4687 if (strlen($row[
"firstname"] . $row[
"lastname"] . $row[
"title"]) == 0) {
4688 $persons_array[$row[
"active_id"]] = $this->lng->txt(
"deleted_user");
4690 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4691 $persons_array[$row[
"active_id"]] = $row[
"lastname"];
4693 $persons_array[$row[
"active_id"]] = trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]);
4698 return $persons_array;
4710 $ilDB = $DIC[
'ilDB'];
4712 "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),
4716 $persons_array = array();
4719 $persons_array[$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"anonymous"));
4721 if (strlen($row[
"firstname"] . $row[
"lastname"] . $row[
"title"]) == 0) {
4722 $persons_array[$row[
"active_id"]] = array(
"name" => $this->lng->txt(
"deleted_user"));
4724 if ($row[
"user_fi"] == ANONYMOUS_USER_ID) {
4725 $persons_array[$row[
"active_id"]] = array(
"name" => $row[
"lastname"]);
4727 $persons_array[$row[
"active_id"]] = array(
"name" => trim($row[
"lastname"] .
", " . $row[
"firstname"] .
" " . $row[
"title"]),
"login" => $row[
"login"]);
4732 return $persons_array;
4744 $ilDB = $DIC[
'ilDB'];
4748 "SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4749 "tst_test_rnd_qst.pass, qpl_questions.points " .
4750 "FROM tst_test_rnd_qst, qpl_questions " .
4751 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4752 "AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence",
4758 "SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4759 "qpl_questions.points " .
4760 "FROM tst_test_question, tst_active, qpl_questions " .
4761 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4762 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4770 array_push($qtest, $row);
4785 $ilDB = $DIC[
'ilDB'];
4789 "SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, " .
4790 "qpl_questions.points " .
4791 "FROM tst_test_rnd_qst, qpl_questions " .
4792 "WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id " .
4793 "AND tst_test_rnd_qst.active_fi = %s AND tst_test_rnd_qst.pass = %s " .
4794 "ORDER BY tst_test_rnd_qst.sequence",
4795 array(
'integer',
'integer'),
4796 array($active_id,
$pass)
4800 "SELECT tst_test_question.sequence, tst_test_question.question_fi, " .
4801 "qpl_questions.points " .
4802 "FROM tst_test_question, tst_active, qpl_questions " .
4803 "WHERE tst_test_question.question_fi = qpl_questions.question_id " .
4804 "AND tst_active.active_id = %s AND tst_active.test_fi = tst_test_question.test_fi",
4812 array_push($qpass, $row);
4844 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
4845 require_once
'Modules/Test/classes/class.ilTestParticipantAccessFilter.php';
4850 $list = $list->getAccessFilteredList(
4857 public function getUnfilteredEvaluationData()
4862 $ilDB = $DIC->database();
4864 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
4865 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
4866 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
4871 SELECT tst_test_result.*, 4872 qpl_questions.original_id, 4873 qpl_questions.title questiontitle, 4874 qpl_questions.points maxpoints 4876 FROM tst_test_result, qpl_questions, tst_active 4878 WHERE tst_active.active_id = tst_test_result.active_fi 4879 AND qpl_questions.question_id = tst_test_result.question_fi 4880 AND tst_active.test_fi = %s 4882 ORDER BY tst_active.active_id ASC, tst_test_result.pass ASC, tst_test_result.tstamp DESC 4897 $participantObject =
$data->getParticipant($row[
"active_fi"]);
4903 $passObject = $participantObject->getPass($row[
"pass"]);
4909 $passObject->addAnsweredQuestion(
4910 $row[
"question_fi"],
4919 foreach (array_keys(
$data->getParticipants()) as $active_id) {
4921 for ($testpass = 0; $testpass <=
$data->getParticipant($active_id)->getLastPass(); $testpass++) {
4925 SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, qpl_questions.original_id, 4926 tst_test_rnd_qst.pass, qpl_questions.points, qpl_questions.title 4927 FROM tst_test_rnd_qst, qpl_questions 4928 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id 4929 AND tst_test_rnd_qst.pass = %s 4930 AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence 4935 array(
'integer',
'integer'),
4936 array($testpass, $active_id)
4941 $tpass = array_key_exists(
"pass", $row) ? $row[
"pass"] : 0;
4943 $data->getParticipant($active_id)->addQuestion(
4944 $row[
"original_id"],
4945 $row[
"question_fi"],
4951 $data->addQuestionTitle($row[
"question_fi"], $row[
"title"]);
4956 $lastPass =
$data->getParticipant($active_id)->getLastPass();
4957 for ($testpass = 0; $testpass <= $lastPass; $testpass++) {
4958 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
4960 $DIC->repositoryTree(),
4962 $DIC[
'ilPluginAdmin'],
4967 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
4968 $testSequenceFactory =
new ilTestSequenceFactory($DIC->database(), $DIC->language(), $DIC[
'ilPluginAdmin'], $this);
4969 $testSequence = $testSequenceFactory->getSequenceByActiveIdAndPass($active_id, $testpass);
4971 $testSequence->loadFromDb($dynamicQuestionSetConfig);
4974 $sequence = (array) $testSequence->getUserSequenceQuestions();
4976 $questionsIdsToRequest = array_diff(array_values($sequence), array_values($questionData));
4977 if (count($questionsIdsToRequest) > 0) {
4978 $questionIdsCondition =
' ' . $DIC->database()->in(
'question_id', array_values($questionsIdsToRequest),
false,
'integer') .
' ';
4980 $res = $DIC->database()->queryF(
4984 WHERE {$questionIdsCondition}",
4988 while ($row = $DIC->database()->fetchAssoc(
$res)) {
4989 $questionData[$row[
'question_id']] = $row;
4990 $data->addQuestionTitle($row[
'question_id'], $row[
'title']);
4994 foreach ($sequence as $questionId) {
4995 if (!isset($questionData[$questionId])) {
4999 $row = $questionData[$questionId];
5001 $data->getParticipant(
5004 $row[
'original_id'],
5005 $row[
'question_id'],
5014 SELECT tst_test_question.sequence, tst_test_question.question_fi, 5015 qpl_questions.points, qpl_questions.title, qpl_questions.original_id 5016 FROM tst_test_question, tst_active, qpl_questions 5017 WHERE tst_test_question.question_fi = qpl_questions.question_id 5018 AND tst_active.active_id = %s 5019 AND tst_active.test_fi = tst_test_question.test_fi 5020 ORDER BY tst_test_question.sequence 5030 $questionsbysequence = array();
5033 $questionsbysequence[$row[
"sequence"]] = $row;
5036 $seqresult =
$ilDB->queryF(
5037 "SELECT * FROM tst_sequence WHERE active_fi = %s",
5042 while ($seqrow =
$ilDB->fetchAssoc($seqresult)) {
5043 $questionsequence = unserialize($seqrow[
"sequence"]);
5045 foreach ($questionsequence as $sidx => $seq) {
5046 $data->getParticipant($active_id)->addQuestion(
5047 $questionsbysequence[$seq][
"original_id"],
5048 $questionsbysequence[$seq][
"question_fi"],
5049 $questionsbysequence[$seq][
"points"],
5054 $data->addQuestionTitle(
5055 $questionsbysequence[$seq][
"question_fi"],
5056 $questionsbysequence[$seq][
"title"]
5068 foreach (array_keys(
$data->getParticipants()) as $active_id) {
5069 $tstUserData =
$data->getParticipant($active_id);
5071 $percentage = $tstUserData->getReachedPointsInPercent();
5073 $obligationsAnswered = $tstUserData->areObligationsAnswered();
5075 $mark = $this->mark_schema->getMatchingMark($percentage);
5077 if (is_object($mark)) {
5078 $tstUserData->setMark($mark->getShortName());
5079 $tstUserData->setMarkOfficial($mark->getOfficialName());
5081 $tstUserData->setPassed(
5082 $mark->getPassed() && $tstUserData->areObligationsAnswered()
5089 $tstUserData->getReached(),
5090 $tstUserData->getMaxPoints()
5093 $tstUserData->setECTSMark($ects_mark);
5098 $tstUserData->setFirstVisit($visitingTime[
"firstvisit"]);
5099 $tstUserData->setLastVisit($visitingTime[
"lastvisit"]);
5108 $ilDB = $DIC[
'ilDB'];
5117 SELECT COUNT(qpl_questions.question_id) qcount, 5118 SUM(qpl_questions.points) qsum 5120 INNER JOIN tst_tests 5121 ON tst_tests.test_id = tst_active.test_fi 5122 INNER JOIN tst_dyn_quest_set_cfg 5123 ON tst_dyn_quest_set_cfg.test_fi = tst_tests.test_id 5124 INNER JOIN qpl_questions 5125 ON qpl_questions.obj_fi = tst_dyn_quest_set_cfg.source_qpl_fi 5126 AND qpl_questions.original_id IS NULL 5127 AND qpl_questions.complete = %s 5128 WHERE tst_active.active_id = %s 5130 array(
'integer',
'integer'),
5131 array(1, $active_id)
5140 SELECT tst_test_rnd_qst.pass, 5141 COUNT(tst_test_rnd_qst.question_fi) qcount, 5142 SUM(qpl_questions.points) qsum 5144 FROM tst_test_rnd_qst, 5147 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id 5148 AND tst_test_rnd_qst.active_fi = %s 5151 GROUP BY tst_test_rnd_qst.active_fi, 5152 tst_test_rnd_qst.pass 5154 array(
'integer',
'integer'),
5155 array($active_id,
$pass)
5164 SELECT COUNT(tst_test_question.question_fi) qcount, 5165 SUM(qpl_questions.points) qsum 5167 FROM tst_test_question, 5171 WHERE tst_test_question.question_fi = qpl_questions.question_id 5172 AND tst_test_question.test_fi = tst_active.test_fi 5173 AND tst_active.active_id = %s 5175 GROUP BY tst_test_question.test_fi 5185 throw new ilTestException(
"not supported question set type: $questionSetType");
5190 if (is_array($row)) {
5191 return array(
"count" => $row[
"qcount"],
"points" => $row[
"qsum"]);
5194 return array(
"count" => 0,
"points" => 0);
5199 include_once
"./Modules/Test/classes/class.ilTestEvaluationData.php";
5200 include_once
"./Modules/Test/classes/class.ilTestEvaluationPassData.php";
5201 include_once
"./Modules/Test/classes/class.ilTestEvaluationUserData.php";
5202 $data = $this->getUnfilteredEvaluationData();
5203 if ($withStatistics) {
5204 $data->calculateStatistics();
5206 $data->setFilter($filterby, $filtertext);
5230 $ilDB = $DIC[
'ilDB'];
5233 "SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5234 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5235 "qpl_questions.points maxpoints " .
5236 "FROM tst_test_result, qpl_questions, tst_active " .
5237 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5238 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5239 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5240 "AND tst_active.test_fi = %s " .
5241 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5245 $overview = array();
5247 if (!array_key_exists($row[
"active_fi"], $overview)) {
5248 $overview[$row[
"active_fi"]] = array();
5249 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5250 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5251 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5252 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5253 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5254 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5255 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5257 if (!array_key_exists($row[
"pass"], $overview[$row[
"active_fi"]])) {
5258 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5259 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5260 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5262 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5263 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5278 $ilDB = $DIC[
'ilDB'];
5281 "SELECT usr_data.usr_id, usr_data.firstname, usr_data.lastname, usr_data.title, usr_data.login, " .
5282 "tst_test_result.*, qpl_questions.original_id, qpl_questions.title questiontitle, " .
5283 "qpl_questions.points maxpoints " .
5284 "FROM tst_test_result, qpl_questions, tst_active " .
5285 "LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id " .
5286 "WHERE tst_active.active_id = tst_test_result.active_fi " .
5287 "AND qpl_questions.question_id = tst_test_result.question_fi " .
5288 "AND tst_active.test_fi = %s AND tst_active.active_id = %s" .
5289 "ORDER BY tst_active.active_id, tst_test_result.pass, tst_test_result.tstamp",
5290 array(
'integer',
'integer'),
5293 $overview = array();
5295 if (!array_key_exists($row[
"active_fi"], $overview)) {
5296 $overview[$row[
"active_fi"]] = array();
5297 $overview[$row[
"active_fi"]][
"firstname"] = $row[
"firstname"];
5298 $overview[$row[
"active_fi"]][
"lastname"] = $row[
"lastname"];
5299 $overview[$row[
"active_fi"]][
"title"] = $row[
"title"];
5300 $overview[$row[
"active_fi"]][
"login"] = $row[
"login"];
5301 $overview[$row[
"active_fi"]][
"usr_id"] = $row[
"usr_id"];
5302 $overview[$row[
"active_fi"]][
"started"] = $row[
"started"];
5303 $overview[$row[
"active_fi"]][
"finished"] = $row[
"finished"];
5305 if (!array_key_exists($row[
"pass"], $overview[$row[
"active_fi"]])) {
5306 $overview[$row[
"active_fi"]][$row[
"pass"]] = array();
5307 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] = 0;
5308 $overview[$row[
"active_fi"]][$row[
"pass"]][
"maxpoints"] = $row[
"maxpoints"];
5310 array_push($overview[$row[
"active_fi"]][$row[
"pass"]], $row);
5311 $overview[$row[
"active_fi"]][$row[
"pass"]][
"reached"] += $row[
"points"];
5330 if (strlen($firstname . $lastname .
$title) == 0) {
5331 $name = $this->lng->txt(
"deleted_user");
5333 if ($user_id == ANONYMOUS_USER_ID) {
5336 $name = trim($lastname .
", " . $firstname .
" " . $title);
5339 $name = $this->lng->txt(
"anonymous");
5362 if (strlen($firstname . $lastname .
$title) == 0) {
5365 if ($user_id == ANONYMOUS_USER_ID) {
5368 $name = trim($lastname .
", " . $firstname .
" " . $title);
5370 if ($is_anonymous) {
5387 $query =
"SELECT tst_times.* FROM tst_active, tst_times WHERE tst_active.test_fi = %s AND tst_active.active_id = tst_times.active_fi";
5389 if (is_array($activeIdsFilter) && count($activeIdsFilter)) {
5390 $query .=
" AND " . $DIC->database()->in(
'active_id', $activeIdsFilter,
false,
'integer');
5395 while ($row = $DIC->database()->fetchObject(
$result)) {
5396 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row->started, $matches);
5397 $epoch_1 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5398 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row->finished, $matches);
5399 $epoch_2 = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
5400 $times[$row->active_fi] += ($epoch_2 - $epoch_1);
5404 foreach ($times as $key => $value) {
5405 $max_time += $value;
5409 $average_time = round($max_time / $counter);
5413 return $average_time;
5422 public function &
getAvailableQuestionpools($use_object_id =
false, $equal_points =
false, $could_be_offline =
false, $show_path =
false, $with_questioncount =
false, $permission =
"read")
5424 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5436 $time_in_seconds = 0;
5437 foreach ($this->questions as $question_id) {
5439 $est_time = $question->getEstimatedWorkingTime();
5440 $time_in_seconds += $est_time[
"h"] * 3600 + $est_time[
"m"] * 60 + $est_time[
"s"];
5442 $hours = (int) ($time_in_seconds / 3600) ;
5443 $time_in_seconds = $time_in_seconds - ($hours * 3600);
5444 $minutes = (int) ($time_in_seconds / 60);
5445 $time_in_seconds = $time_in_seconds - ($minutes * 60);
5446 $result = array(
"hh" => $hours,
"mm" => $minutes,
"ss" => $time_in_seconds);
5458 return CLIENT_WEB_DIR .
"/assessment/" . $this->
getId() .
"/images/";
5469 include_once
"./Services/Utilities/classes/class.ilUtil.php";
5484 if ((!$question_type) and ($question_id > 0)) {
5488 if (!strlen($question_type)) {
5492 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5496 $question =
new $question_type_gui();
5498 if ($question_id > 0) {
5499 $question->object->loadFromDb($question_id);
5503 $ilDB = $DIC[
'ilDB'];
5508 $question->object->feedbackOBJ =
new $feedbackObjectClassname($question->object,
$ilCtrl,
$ilDB,
$lng);
5510 $assSettings =
new ilSetting(
'assessment');
5511 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
5513 $processLockerFactory->setQuestionId($question->object->getId());
5514 $processLockerFactory->setUserId(
$ilUser->getId());
5515 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
5517 $question->object->setProcessLocker($processLockerFactory->getLocker());
5534 if (strcmp($question_id,
"") != 0) {
5535 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
5550 $this->questions = array_values($this->questions);
5551 $array_pos = array_search($target_index, $this->questions);
5552 if ($insert_mode == 0) {
5553 $part1 = array_slice($this->questions, 0, $array_pos);
5554 $part2 = array_slice($this->questions, $array_pos);
5555 } elseif ($insert_mode == 1) {
5556 $part1 = array_slice($this->questions, 0, $array_pos + 1);
5557 $part2 = array_slice($this->questions, $array_pos + 1);
5559 foreach ($move_questions as $question_id) {
5560 if (!(array_search($question_id, $part1) ===
false)) {
5561 unset($part1[array_search($question_id, $part1)]);
5563 if (!(array_search($question_id, $part2) ===
false)) {
5564 unset($part2[array_search($question_id, $part2)]);
5567 $part1 = array_values($part1);
5568 $part2 = array_values($part2);
5569 $new_array = array_values(array_merge($part1, $move_questions, $part2));
5570 $this->questions = array();
5572 foreach ($new_array as $question_id) {
5573 $this->questions[$counter] = $question_id;
5624 $pluginAdmin = $DIC[
'ilPluginAdmin'];
5627 $ilDB = $DIC[
'ilDB'];
5629 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
5632 if (count($available_pools)) {
5633 $available =
" AND " .
$ilDB->in(
'qpl_questions.obj_fi', $available_pools,
false,
'integer');
5637 if ($completeonly) {
5638 $available .=
" AND qpl_questions.complete = " .
$ilDB->quote(
"1",
'text');
5642 if (is_array($arrFilter)) {
5643 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
5644 $where .=
" AND " .
$ilDB->like(
'qpl_questions.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
5646 if (array_key_exists(
'description', $arrFilter) && strlen($arrFilter[
'description'])) {
5647 $where .=
" AND " .
$ilDB->like(
'qpl_questions.description',
'text',
"%%" . $arrFilter[
'description'] .
"%%");
5649 if (array_key_exists(
'author', $arrFilter) && strlen($arrFilter[
'author'])) {
5650 $where .=
" AND " .
$ilDB->like(
'qpl_questions.author',
'text',
"%%" . $arrFilter[
'author'] .
"%%");
5652 if (array_key_exists(
'type', $arrFilter) && strlen($arrFilter[
'type'])) {
5653 $where .=
" AND qpl_qst_type.type_tag = " .
$ilDB->quote($arrFilter[
'type'],
'text');
5655 if (array_key_exists(
'qpl', $arrFilter) && strlen($arrFilter[
'qpl'])) {
5656 $where .=
" AND " .
$ilDB->like(
'object_data.title',
'text',
"%%" . $arrFilter[
'qpl'] .
"%%");
5661 $original_clause =
" qpl_questions.original_id IS NULL";
5662 if (count($original_ids)) {
5663 $original_clause =
" qpl_questions.original_id IS NULL AND " .
$ilDB->in(
'qpl_questions.question_id', $original_ids,
true,
'integer');
5666 $query_result =
$ilDB->query(
" 5667 SELECT qpl_questions.*, qpl_questions.tstamp, 5668 qpl_qst_type.type_tag, qpl_qst_type.plugin, qpl_qst_type.plugin_name, 5669 object_data.title parent_title 5670 FROM qpl_questions, qpl_qst_type, object_data 5671 WHERE $original_clause $available 5672 AND object_data.obj_id = qpl_questions.obj_fi 5673 AND qpl_questions.tstamp > 0 5674 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id 5678 $types = $this->getQuestionTypeTranslations();
5679 if ($query_result->numRows()) {
5680 while ($row =
$ilDB->fetchAssoc($query_result)) {
5683 if (!$row[
'plugin']) {
5684 $row[
'ttype' ] =
$lng->txt($row[
"type_tag" ]);
5690 if (!$pluginAdmin->isActive(
IL_COMP_MODULE,
'TestQuestionPool',
'qst', $row[
'plugin_name'])) {
5695 $row[
'ttype' ] = $pl->getQuestionTypeTranslation();
5715 foreach ($assessment->objectives as $objectives) {
5716 foreach ($objectives->materials as $material) {
5731 foreach ($assessment->assessmentcontrol as $assessmentcontrol) {
5732 switch ($assessmentcontrol->getSolutionswitch()) {
5747 foreach ($assessment->qtimetadata as
$metadata) {
5748 switch ($metadata[
"label"]) {
5751 $type = $metadata[
"entry"];
5771 case "sequence_settings":
5774 case "solution_details":
5777 case "print_bs_with_res":
5786 case 'block_after_passed':
5789 case "pass_waiting":
5793 $this->
setKiosk($metadata[
"entry"]);
5795 case "showfinalstatement":
5808 case "highscore_enabled":
5812 case "highscore_anon":
5816 case "highscore_achieved_ts":
5820 case "highscore_score":
5824 case "highscore_percentage":
5828 case "highscore_hints":
5832 case "highscore_wtime":
5836 case "highscore_own_table":
5840 case "highscore_top_table":
5844 case "highscore_top_num":
5848 case "hide_previous_results":
5849 if ($metadata[
"entry"] == 0) {
5855 case "use_previous_answers":
5858 case "answer_feedback":
5861 case "hide_title_points":
5864 case "title_output":
5867 case "question_set_type":
5871 if ($metadata[
"entry"]) {
5877 case "results_presentation":
5880 case "reset_processing_time":
5883 case "instant_verification":
5886 case "follow_qst_answer_fixation":
5889 case "instant_feedback_answer_fixation":
5892 case "force_instant_feedback":
5895 case "answer_feedback_points":
5910 case "fixed_participants":
5913 case "score_reporting":
5916 case "shuffle_questions":
5919 case "count_system":
5925 case "mailnotification":
5931 case "exportsettings":
5934 case "score_cutting":
5941 case "allowedUsers":
5945 case "allowedUsersTimeGap":
5948 case "pass_scoring":
5951 case 'pass_deletion_allowed':
5954 case "show_summary":
5957 case "reporting_date":
5958 $iso8601period = $metadata[
"entry"];
5959 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5960 $this->
setReportingDate(sprintf(
"%02d%02d%02d%02d%02d%02d", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
5963 case 'enable_processing_time':
5966 case "processing_time":
5969 case "starting_time":
5970 $iso8601period = $metadata[
"entry"];
5971 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5972 $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);
5978 $iso8601period = $metadata[
"entry"];
5979 if (preg_match(
"/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $iso8601period, $matches)) {
5980 $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);
5985 case "enable_examview":
5988 case 'show_examview_html':
5991 case 'show_examview_pdf':
5994 case 'redirection_mode':
5997 case 'redirection_url':
6000 case 'examid_in_kiosk':
6001 case 'examid_in_test_pass':
6004 case 'show_exam_id':
6005 case 'examid_in_test_res':
6008 case 'enable_archiving':
6011 case 'sign_submission':
6014 case 'char_selector_availability':
6017 case 'char_selector_definition':
6020 case 'skill_service':
6023 case 'result_tax_filters':
6024 $this->
setResultFilterTaxIds(strlen($metadata[
'entry']) ? unserialize($metadata[
'entry']) : array());
6026 case 'show_grading_status':
6029 case 'show_grading_mark':
6032 case 'activation_limited':
6035 case 'activation_start_time':
6038 case 'activation_end_time':
6041 case 'activation_visibility':
6047 case 'autosave_ival':
6050 case 'offer_question_hints':
6053 case 'instant_feedback_specific':
6056 case 'obligations_enabled':
6060 if (preg_match(
"/mark_step_\d+/", $metadata[
"label"])) {
6061 $xmlmark = $metadata[
"entry"];
6062 preg_match(
"/<short>(.*?)<\/short>/", $xmlmark, $matches);
6063 $mark_short = $matches[1];
6064 preg_match(
"/<official>(.*?)<\/official>/", $xmlmark, $matches);
6065 $mark_official = $matches[1];
6066 preg_match(
"/<percentage>(.*?)<\/percentage>/", $xmlmark, $matches);
6067 $mark_percentage = $matches[1];
6068 preg_match(
"/<passed>(.*?)<\/passed>/", $xmlmark, $matches);
6069 $mark_passed = $matches[1];
6070 $this->mark_schema->addMarkStep($mark_short, $mark_official, $mark_percentage, $mark_passed);
6074 if (is_array(
$_SESSION[
"import_mob_xhtml"])) {
6075 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6076 include_once
"./Services/RTE/classes/class.ilRTE.php";
6077 include_once
"./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
6078 foreach (
$_SESSION[
"import_mob_xhtml"] as $mob) {
6080 if (file_exists($importfile)) {
6088 $ilLog->write(
"Error: Could not open XHTML mob file for test introduction during test import. File $importfile does not exist!");
6102 include_once(
"./Services/Xml/classes/class.ilXmlWriter.php");
6106 $a_xml_writer->xmlSetDtdDef(
"<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">");
6107 $a_xml_writer->xmlStartTag(
"questestinterop");
6110 "ident" =>
"il_" . IL_INST_ID .
"_tst_" . $this->
getTestId(),
6113 $a_xml_writer->xmlStartTag(
"assessment", $attrs);
6115 $a_xml_writer->xmlElement(
"qticomment", null, $this->
getDescription());
6118 if ($this->enable_processing_time) {
6119 preg_match(
"/(\d+):(\d+):(\d+)/", $this->processing_time, $matches);
6120 $a_xml_writer->xmlElement(
"duration", null, sprintf(
"P0Y0M0DT%dH%dM%dS", $matches[1], $matches[2], $matches[3]));
6124 $a_xml_writer->xmlStartTag(
"qtimetadata");
6125 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6126 $a_xml_writer->xmlElement(
"fieldlabel", null,
"ILIAS_VERSION");
6127 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
ilias->getSetting(
"ilias_version"));
6128 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6131 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6132 $a_xml_writer->xmlElement(
"fieldlabel", null,
"anonymity");
6133 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getAnonymity()));
6134 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6136 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6137 $a_xml_writer->xmlElement(
"fieldlabel", null,
"use_pool");
6138 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPoolUsage() ? 1 : 0);
6139 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6142 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6143 $a_xml_writer->xmlElement(
"fieldlabel", null,
"question_set_type");
6145 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6148 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6149 $a_xml_writer->xmlElement(
"fieldlabel", null,
"sequence_settings");
6151 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6154 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6155 $a_xml_writer->xmlElement(
"fieldlabel", null,
"author");
6156 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getAuthor());
6157 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6160 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6161 $a_xml_writer->xmlElement(
"fieldlabel", null,
"reset_processing_time");
6163 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6166 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6167 $a_xml_writer->xmlElement(
"fieldlabel", null,
"count_system");
6168 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getCountSystem());
6169 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6172 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6173 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mc_scoring");
6174 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getMCScoring());
6175 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6178 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6179 $a_xml_writer->xmlElement(
"fieldlabel", null,
"score_cutting");
6180 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getScoreCutting());
6181 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6184 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6185 $a_xml_writer->xmlElement(
"fieldlabel", null,
"password");
6186 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassword());
6187 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6190 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6191 $a_xml_writer->xmlElement(
"fieldlabel", null,
"allowedUsers");
6192 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getAllowedUsers());
6193 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6196 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6197 $a_xml_writer->xmlElement(
"fieldlabel", null,
"allowedUsersTimeGap");
6199 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6202 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6203 $a_xml_writer->xmlElement(
"fieldlabel", null,
"pass_scoring");
6204 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassScoring());
6205 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6207 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6208 $a_xml_writer->xmlElement(
'fieldlabel', null,
'pass_deletion_allowed');
6210 $a_xml_writer->xmlEndTag(
'qtimetadatafield');
6214 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6215 $a_xml_writer->xmlElement(
"fieldlabel", null,
"reporting_date");
6216 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->reporting_date, $matches);
6217 $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]));
6218 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6221 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6222 $a_xml_writer->xmlElement(
"fieldlabel", null,
"nr_of_tries");
6223 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getNrOfTries()));
6224 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6227 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6228 $a_xml_writer->xmlElement(
'fieldlabel', null,
'block_after_passed');
6230 $a_xml_writer->xmlEndTag(
'qtimetadatafield');
6233 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6234 $a_xml_writer->xmlElement(
"fieldlabel", null,
"pass_waiting");
6235 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getPassWaiting());
6236 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6239 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6240 $a_xml_writer->xmlElement(
"fieldlabel", null,
"kiosk");
6241 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getKiosk()));
6242 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6246 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6247 $a_xml_writer->xmlElement(
"fieldlabel", null,
"redirection_mode");
6249 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6252 $a_xml_writer->xmlStartTag(
'qtimetadatafield');
6253 $a_xml_writer->xmlElement(
"fieldlabel", null,
"redirection_url");
6255 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6258 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6259 $a_xml_writer->xmlElement(
"fieldlabel", null,
"use_previous_answers");
6261 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6264 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6265 $a_xml_writer->xmlElement(
"fieldlabel", null,
"title_output");
6266 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getTitleOutput()));
6267 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6270 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6271 $a_xml_writer->xmlElement(
"fieldlabel", null,
"results_presentation");
6273 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6276 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6277 $a_xml_writer->xmlElement(
"fieldlabel", null,
"examid_in_test_pass");
6279 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6282 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6283 $a_xml_writer->xmlElement(
"fieldlabel", null,
"examid_in_test_res");
6285 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6288 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6289 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_summary");
6291 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6294 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6295 $a_xml_writer->xmlElement(
"fieldlabel", null,
"score_reporting");
6296 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getScoreReporting()));
6297 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6299 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6300 $a_xml_writer->xmlElement(
"fieldlabel", null,
"solution_details");
6302 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6303 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6304 $a_xml_writer->xmlElement(
"fieldlabel", null,
"print_bs_with_res");
6306 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6309 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6310 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_verification");
6312 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6315 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6316 $a_xml_writer->xmlElement(
"fieldlabel", null,
"answer_feedback");
6317 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getAnswerFeedback()));
6318 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6321 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6322 $a_xml_writer->xmlElement(
"fieldlabel", null,
"answer_feedback_points");
6324 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6327 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6328 $a_xml_writer->xmlElement(
"fieldlabel", null,
"follow_qst_answer_fixation");
6330 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6333 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6334 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_answer_fixation");
6336 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6339 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6340 $a_xml_writer->xmlElement(
"fieldlabel", null,
"force_instant_feedback");
6342 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6346 $highscore_metadata = array(
6358 foreach ($highscore_metadata as $label =>
$data) {
6359 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6360 $a_xml_writer->xmlElement(
"fieldlabel", null, $label);
6361 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d",
$data[
'value']));
6362 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6366 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6367 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_cancel");
6368 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShowCancel()));
6369 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6372 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6373 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_marker");
6374 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShowMarker()));
6375 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6378 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6379 $a_xml_writer->xmlElement(
"fieldlabel", null,
"fixed_participants");
6381 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6384 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6385 $a_xml_writer->xmlElement(
"fieldlabel", null,
"showfinalstatement");
6386 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getShowFinalStatement()) ?
"1" :
"0")));
6387 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6390 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6391 $a_xml_writer->xmlElement(
"fieldlabel", null,
"showinfo");
6392 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getShowInfo()) ?
"1" :
"0")));
6393 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6396 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6397 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mailnotification");
6399 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6402 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6403 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mailnottype");
6405 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6408 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6409 $a_xml_writer->xmlElement(
"fieldlabel", null,
"exportsettings");
6410 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getExportSettings());
6411 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6414 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6415 $a_xml_writer->xmlElement(
"fieldlabel", null,
"forcejs");
6416 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", (($this->
getForceJS()) ?
"1" :
"0")));
6417 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6420 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6421 $a_xml_writer->xmlElement(
"fieldlabel", null,
"customstyle");
6422 $a_xml_writer->xmlElement(
"fieldentry", null, $this->
getCustomStyle());
6423 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6426 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6427 $a_xml_writer->xmlElement(
"fieldlabel", null,
"shuffle_questions");
6428 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
"%d", $this->
getShuffleQuestions()));
6429 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6432 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6433 $a_xml_writer->xmlElement(
"fieldlabel", null,
"processing_time");
6435 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6438 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6439 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_examview");
6440 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getEnableExamview());
6441 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6444 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6445 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_examview_html");
6447 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6450 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6451 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_examview_pdf");
6453 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6456 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6457 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_archiving");
6459 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6462 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6463 $a_xml_writer->xmlElement(
"fieldlabel", null,
"sign_submission");
6464 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getSignSubmission());
6465 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6468 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6469 $a_xml_writer->xmlElement(
"fieldlabel", null,
"char_selector_availability");
6471 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6474 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6475 $a_xml_writer->xmlElement(
"fieldlabel", null,
"char_selector_definition");
6477 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6480 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6481 $a_xml_writer->xmlElement(
"fieldlabel", null,
"skill_service");
6483 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6486 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6487 $a_xml_writer->xmlElement(
"fieldlabel", null,
"result_tax_filters");
6489 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6492 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6493 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_grading_status");
6495 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6498 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6499 $a_xml_writer->xmlElement(
"fieldlabel", null,
"show_grading_mark");
6501 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6506 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6507 $a_xml_writer->xmlElement(
"fieldlabel", null,
"starting_time");
6509 $a_xml_writer->xmlElement(
"fieldentry", null, $backward_compatibility_format);
6510 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6514 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6515 $a_xml_writer->xmlElement(
"fieldlabel", null,
"ending_time");
6517 $a_xml_writer->xmlElement(
"fieldentry", null, $backward_compatibility_format);
6518 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6523 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6524 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_limited");
6526 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6529 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6530 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_start_time");
6532 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6535 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6536 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_end_time");
6538 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6541 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6542 $a_xml_writer->xmlElement(
"fieldlabel", null,
"activation_visibility");
6544 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6547 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6548 $a_xml_writer->xmlElement(
"fieldlabel", null,
"autosave");
6549 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getAutosave());
6550 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6553 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6554 $a_xml_writer->xmlElement(
"fieldlabel", null,
"autosave_ival");
6555 $a_xml_writer->xmlElement(
"fieldentry", null, (
int) $this->
getAutosaveIval());
6556 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6559 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6560 $a_xml_writer->xmlElement(
"fieldlabel", null,
"offer_question_hints");
6562 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6565 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6566 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_specific");
6568 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6571 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6572 $a_xml_writer->xmlElement(
"fieldlabel", null,
"instant_feedback_answer_fixation");
6574 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6577 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6578 $a_xml_writer->xmlElement(
"fieldlabel", null,
"obligations_enabled");
6580 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6583 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6584 $a_xml_writer->xmlElement(
"fieldlabel", null,
"enable_processing_time");
6586 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6588 foreach ($this->mark_schema->mark_steps as
$index => $mark) {
6590 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
6591 $a_xml_writer->xmlElement(
"fieldlabel", null,
"mark_step_$index");
6592 $a_xml_writer->xmlElement(
"fieldentry", null, sprintf(
6593 "<short>%s</short><official>%s</official><percentage>%.2f</percentage><passed>%d</passed>",
6594 $mark->getShortName(),
6595 $mark->getOfficialName(),
6596 $mark->getMinimumLevel(),
6599 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
6601 $a_xml_writer->xmlEndTag(
"qtimetadata");
6604 $a_xml_writer->xmlStartTag(
"objectives");
6606 $a_xml_writer->xmlEndTag(
"objectives");
6611 "solutionswitch" =>
"Yes" 6616 $a_xml_writer->xmlElement(
"assessmentcontrol", $attrs, null);
6620 $a_xml_writer->xmlStartTag(
"presentation_material");
6621 $a_xml_writer->xmlStartTag(
"flow_mat");
6623 $a_xml_writer->xmlEndTag(
"flow_mat");
6624 $a_xml_writer->xmlEndTag(
"presentation_material");
6630 $a_xml_writer->xmlElement(
"section", $attrs, null);
6631 $a_xml_writer->xmlEndTag(
"assessment");
6632 $a_xml_writer->xmlEndTag(
"questestinterop");
6634 $xml = $a_xml_writer->xmlDumpMem(
false);
6646 preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $date_time, $matches);
6647 $iso8601_period = sprintf(
"P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]);
6648 return $iso8601_period;
6662 $this->mob_ids = array();
6663 $this->file_ids = array();
6669 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export Page Objects");
6670 $ilBench->start(
"ContentObjectExport",
"exportPageObjects");
6672 $ilBench->stop(
"ContentObjectExport",
"exportPageObjects");
6673 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export Page Objects");
6676 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export Media Objects");
6677 $ilBench->start(
"ContentObjectExport",
"exportMediaObjects");
6679 $ilBench->stop(
"ContentObjectExport",
"exportMediaObjects");
6680 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export Media Objects");
6683 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Start Export File Items");
6684 $ilBench->start(
"ContentObjectExport",
"exportFileItems");
6686 $ilBench->stop(
"ContentObjectExport",
"exportFileItems");
6687 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Finished Export File Items");
6698 include_once
"./Services/MetaData/classes/class.ilMD2XML.php";
6700 $md2xml->setExportMode(
true);
6701 $md2xml->startExport();
6702 $a_xml_writer->appendXML($md2xml->getXML());
6712 if ($a_tag ==
"Identifier" && $a_param ==
"Entry") {
6713 include_once
"./Services/Utilities/classes/class.ilUtil.php";
6732 include_once
"./Modules/LearningModule/classes/class.ilLMPageObject.php";
6734 foreach ($this->questions as $question_id) {
6735 $ilBench->start(
"ContentObjectExport",
"exportPageObject");
6736 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Page Object " . $question_id);
6739 $a_xml_writer->xmlStartTag(
"PageObject", $attrs);
6743 $ilBench->start(
"ContentObjectExport",
"exportPageObject_XML");
6744 include_once
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPage.php";
6746 $page_object->buildDom();
6747 $page_object->insertInstIntoIDs($a_inst);
6748 $mob_ids = $page_object->collectMediaObjects(
false);
6749 require_once
'Services/COPage/classes/class.ilPCFileList.php';
6751 $xml = $page_object->getXMLFromDom(
false,
false,
false,
"",
true);
6752 $xml = str_replace(
"&",
"&", $xml);
6753 $a_xml_writer->appendXML($xml);
6754 $page_object->freeDom();
6755 unset($page_object);
6757 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_XML");
6760 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6762 foreach ($mob_ids as $mob_id) {
6763 $this->mob_ids[$mob_id] = $mob_id;
6765 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectMedia");
6768 $ilBench->start(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6770 foreach ($file_ids as $file_id) {
6771 $this->file_ids[$file_id] = $file_id;
6773 $ilBench->stop(
"ContentObjectExport",
"exportPageObject_CollectFileItems");
6775 $a_xml_writer->xmlEndTag(
"PageObject");
6778 $ilBench->stop(
"ContentObjectExport",
"exportPageObject");
6790 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
6792 foreach ($this->mob_ids as $mob_id) {
6793 $expLog->write(date(
"[y-m-d H:i:s] ") .
"Media Object " . $mob_id);
6796 $media_obj->exportXML($a_xml_writer, $a_inst);
6797 $media_obj->exportFiles($a_target_dir);
6809 include_once
"./Modules/File/classes/class.ilObjFile.php";
6811 foreach ($this->file_ids as $file_id) {
6812 $expLog->write(date(
"[y-m-d H:i:s] ") .
"File Item " . $file_id);
6813 $file_obj =
new ilObjFile($file_id,
false);
6814 $file_obj->export($a_target_dir);
6825 if (!is_array($this->import_mapping)) {
6828 return $this->import_mapping;
6853 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);
6861 include_once
"./Modules/Test/classes/class.ilStatistics.php";
6864 $passed_statistics->setData($points_passed);
6865 $ects_percentiles = array(
6866 "A" => $passed_statistics->quantile(
$a),
6867 "B" => $passed_statistics->quantile(
$b),
6868 "C" => $passed_statistics->quantile(
$c),
6869 "D" => $passed_statistics->quantile(
$d),
6870 "E" => $passed_statistics->quantile(
$e)
6872 if (count($points_passed) && ($reached_points >= $ects_percentiles[
"A"])) {
6874 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"B"])) {
6876 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"C"])) {
6878 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"D"])) {
6880 } elseif (count($points_passed) && ($reached_points >= $ects_percentiles[
"E"])) {
6882 } elseif (strcmp($fx,
"") != 0) {
6883 if ($max_points > 0) {
6884 $percentage = ($reached_points / $max_points) * 100.0;
6885 if ($percentage < 0) {
6891 if ($percentage >= $fx) {
6906 return $this->mark_schema->checkMarks();
6935 $ilDB = $DIC[
'ilDB'];
6936 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
6937 $tree = $DIC[
'tree'];
6939 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
6956 if (preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getReportingDate(), $matches)) {
6957 $epoch_time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
6959 if ($now < $epoch_time) {
6994 $md_life = &$md->getLifecycle();
6996 if (strlen($a_author) == 0) {
6999 $a_author =
$ilUser->getFullname();
7002 $md_life = &$md->addLifecycle();
7004 $con = &$md_life->addContribute();
7005 $con->setRole(
"Author");
7007 $ent = &$con->addEntity();
7008 $ent->setEntity($a_author);
7020 parent::createMetaData();
7034 include_once
"./Services/MetaData/classes/class.ilMD.php";
7036 $md_life = &$md->getLifecycle();
7038 $ids = &$md_life->getContributeIds();
7039 foreach ($ids as
$id) {
7040 $md_cont = &$md_life->getContribute($id);
7041 if (strcmp($md_cont->getRole(),
"Author") == 0) {
7042 $entids = &$md_cont->getEntityIds();
7043 foreach ($entids as $entid) {
7044 $md_ent = &$md_cont->getEntity($entid);
7045 array_push(
$author, $md_ent->getEntity());
7063 include_once
"./Services/MetaData/classes/class.ilMD.php";
7064 $md =
new ilMD($obj_id, 0,
"tst");
7065 $md_life = &$md->getLifecycle();
7067 $ids = &$md_life->getContributeIds();
7068 foreach ($ids as
$id) {
7069 $md_cont = &$md_life->getContribute($id);
7070 if (strcmp($md_cont->getRole(),
"Author") == 0) {
7071 $entids = &$md_cont->getEntityIds();
7072 foreach ($entids as $entid) {
7073 $md_ent = &$md_cont->getEntity($entid);
7074 array_push(
$author, $md_ent->getEntity());
7092 $ilDB = $DIC[
'ilDB'];
7094 $result_array = array();
7095 $tests = array_slice(
7103 if (count($tests)) {
7106 if ($use_object_id) {
7108 $result_array[$obj_id] = $titles[
$ref_id];
7114 return $result_array;
7125 public function cloneObject($a_target_id, $a_copy_id = 0, $a_omit_tree =
false)
7129 $certificateLogger = $DIC->logger()->cert();
7130 $tree = $DIC[
'tree'];
7131 $ilDB = $DIC->database();
7132 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
7138 $newObj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree);
7139 $newObj->setTmpCopyWizardCopyId($a_copy_id);
7143 $newObj->setOfflineStatus(
true);
7168 $newObj->setKiosk($this->
getKiosk());
7224 $newObj->saveToDb();
7233 $templateRepository,
7234 $DIC->filesystem()->web(),
7239 $cloneAction->cloneCertificate($this, $newObj);
7242 $testQuestionSetConfigFactory->getQuestionSetConfig()->cloneQuestionSetRelatedData($newObj);
7244 require_once
'Modules/Test/classes/class.ilTestSkillLevelThresholdList.php';
7246 $skillLevelThresholdList->setTestId($this->
getTestId());
7247 $skillLevelThresholdList->loadFromDb();
7248 $skillLevelThresholdList->cloneListForTest($newObj->getTestId());
7250 $newObj->saveToDb();
7251 $newObj->updateMetaData();
7253 include_once(
'./Services/Tracking/classes/class.ilLPObjSettings.php');
7255 $obj_settings->cloneSettings($newObj->getId());
7272 $tree = $DIC[
'tree'];
7273 $ilDB = $DIC[
'ilDB'];
7274 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
7283 $questionSetConfig->loadFromDb();
7285 if ($questionSetConfig->isQuestionAmountConfigurationModePerPool()) {
7286 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
7287 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilderWithAmountPerPool.php';
7288 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
7296 $sourcePoolDefinitionList->loadDefinitions();
7298 $num = $sourcePoolDefinitionList->getQuestionAmount();
7300 $num = $questionSetConfig->getQuestionAmountPerTest();
7303 $num = count($this->questions);
7322 if (strcmp($question_id,
"") != 0) {
7323 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7326 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7340 $ilDB = $DIC[
'ilDB'];
7343 "SELECT obj_fi FROM tst_tests WHERE test_id = %s",
7349 $object_id = $row[
"obj_fi"];
7364 $ilDB = $DIC[
'ilDB'];
7367 "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",
7373 $object_id = $row[
"obj_fi"];
7388 $ilDB = $DIC[
'ilDB'];
7391 "SELECT test_id FROM tst_tests WHERE obj_fi = %s",
7413 $ilDB = $DIC[
'ilDB'];
7416 if (($active_id) && ($question_id)) {
7417 if (is_null(
$pass)) {
7418 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
7422 "SELECT value1 FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
7423 array(
'integer',
'integer',
'integer'),
7424 array($active_id, $question_id,
$pass)
7426 if (
$result->numRows() == 1) {
7428 $res = $row[
"value1"];
7444 $ilDB = $DIC[
'ilDB'];
7449 "SELECT question_text FROM qpl_questions WHERE question_id = %s",
7453 if (
$result->numRows() == 1) {
7455 $res = $row[
"question_text"];
7466 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
7470 return $participantList;
7478 require_once
'Modules/Test/classes/class.ilTestParticipantList.php';
7482 return $participantList;
7494 $ilDB = $DIC[
'ilDB'];
7496 $result_array = array();
7499 if (is_numeric($user_id)) {
7501 "SELECT tst_active.active_id, tst_active.tries, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7502 "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 " .
7503 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7504 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7506 array(
'text',
'text',
'text',
'integer',
'integer'),
7507 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId(), $user_id)
7511 "SELECT tst_active.active_id, usr_id, %s login, %s lastname, %s firstname, tst_invited_user.clientip, " .
7512 "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 " .
7513 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7514 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7516 array(
'text',
'text',
'text',
'integer'),
7517 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7521 if (is_numeric($user_id)) {
7523 "SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7524 "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 " .
7525 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7526 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id AND usr_data.usr_id=%s " .
7528 array(
'integer',
'integer'),
7533 "SELECT tst_active.active_id, tst_active.tries, usr_id, login, lastname, firstname, tst_invited_user.clientip, " .
7534 "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 " .
7535 "LEFT JOIN tst_active ON tst_active.user_fi = tst_invited_user.user_fi AND tst_active.test_fi = tst_invited_user.test_fi " .
7536 "WHERE tst_invited_user.test_fi = %s and tst_invited_user.user_fi=usr_data.usr_id " .
7543 $result_array = array();
7545 $result_array[$row[
'usr_id']] = $row;
7547 return $result_array;
7559 $ilDB = $DIC[
'ilDB'];
7563 SELECT tst_active.active_id, 7565 tst_active.user_fi usr_id, 7569 tst_active.submitted test_finished, 7570 usr_data.matriculation, 7572 tst_active.lastindex, 7573 COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes 7576 ON tst_active.user_fi = usr_data.usr_id 7577 WHERE tst_active.test_fi = %s 7578 ORDER BY usr_data.lastname 7582 array(
'text',
'text',
'text',
'integer'),
7583 array(
"", $this->lng->txt(
"anonymous"),
"", $this->
getTestId())
7587 SELECT tst_active.active_id, 7589 tst_active.user_fi usr_id, 7593 tst_active.submitted test_finished, 7594 usr_data.matriculation, 7596 tst_active.lastindex, 7597 COALESCE(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass unfinished_passes 7600 ON tst_active.user_fi = usr_data.usr_id 7601 WHERE tst_active.test_fi = %s 7602 ORDER BY usr_data.lastname 7612 $data[$row[
'active_id']] = $row;
7615 if (strlen(trim($participant[
"firstname"] . $participant[
"lastname"])) == 0) {
7616 $data[
$index][
"lastname"] = $this->lng->txt(
"deleted_user");
7625 $ilDB = $DIC[
'ilDB'];
7627 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
7629 if (count($scoring) == 0) {
7634 $filtered_participants = array();
7635 foreach ($participants as $active_id => $participant) {
7636 $qstType_IN_manScoreableQstTypes =
$ilDB->in(
'qpl_questions.question_type_fi', $scoring,
false,
'integer');
7639 SELECT tst_test_result.manual 7641 FROM tst_test_result 7643 INNER JOIN qpl_questions 7644 ON tst_test_result.question_fi = qpl_questions.question_id 7646 WHERE tst_test_result.active_fi = %s 7647 AND $qstType_IN_manScoreableQstTypes 7661 if ($participant->active) {
7662 $filtered_participants[$active_id] = $participant;
7666 if (!$participant->active) {
7667 $filtered_participants[$active_id] = $participant;
7671 $filtered_participants[$active_id] = $participant;
7686 $assessmentSetting =
new ilSetting(
"assessment");
7687 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7688 if ($manscoring_done) {
7689 $filtered_participants[$active_id] = $participant;
7702 $assessmentSetting =
new ilSetting(
"assessment");
7703 $manscoring_done = $assessmentSetting->get(
"manscoring_done_" . $active_id);
7704 if (!$manscoring_done) {
7705 $filtered_participants[$active_id] = $participant;
7713 if ($row[
"manual"]) {
7717 if (($found > 0) && ($found < $count)) {
7718 $filtered_participants[$active_id] = $participant;
7722 $filtered_participants[$active_id] = $participant;
7727 return $filtered_participants;
7740 $ilDB = $DIC[
'ilDB'];
7742 if (!is_array($ids) || count($ids) == 0) {
7748 "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",
7749 array(
'text',
'text',
'text'),
7750 array(
"", $this->lng->txt(
"anonymous"),
"")
7753 $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");
7756 $result_array = array();
7758 $result_array[$row[
"usr_id"]] = $row;
7760 return $result_array;
7765 if (!is_array($ids) || count($ids) == 0) {
7778 if (!is_array($ids) || count($ids) == 0) {
7782 foreach ($ids as $obj_id) {
7797 include_once
"./Modules/Group/classes/class.ilObjGroup.php";
7799 $members = $group->getGroupMemberIds();
7800 include_once
'./Services/User/classes/class.ilObjUser.php';
7801 foreach ($members as $user_id) {
7817 include_once
'./Services/User/classes/class.ilObjUser.php';
7818 foreach ($members as $user_id) {
7834 $ilDB = $DIC[
'ilDB'];
7836 $affectedRows =
$ilDB->manipulateF(
7837 "DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7838 array(
'integer',
'integer'),
7852 $ilDB = $DIC[
'ilDB'];
7854 $affectedRows =
$ilDB->manipulateF(
7855 "DELETE FROM tst_invited_user WHERE test_fi = %s AND user_fi = %s",
7856 array(
'integer',
'integer'),
7859 $affectedRows =
$ilDB->manipulateF(
7860 "INSERT INTO tst_invited_user (test_fi, user_fi, clientip, tstamp) VALUES (%s, %s, %s, %s)",
7861 array(
'integer',
'integer',
'text',
'integer'),
7862 array($this->
getTestId(), $user_id, (strlen($client_ip)) ? $client_ip : null, time())
7870 $ilDB = $DIC[
'ilDB'];
7872 $affectedRows =
$ilDB->manipulateF(
7873 "UPDATE tst_invited_user SET clientip = %s, tstamp = %s WHERE test_fi=%s and user_fi=%s",
7874 array(
'text',
'integer',
'integer',
'integer'),
7875 array((strlen($client_ip)) ? $client_ip : null, time(), $this->
getTestId(), $user_id)
7887 $ilDB = $DIC[
'ilDB'];
7888 if (is_numeric($question_fi)) {
7890 "SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s AND question_fi=%s",
7891 array(
'integer',
'integer'),
7892 array($active_id, $question_fi)
7896 "SELECT question_fi, solved FROM tst_qst_solved WHERE active_fi = %s",
7901 $result_array = array();
7903 $result_array[$row[
"question_fi"]] = $row;
7905 return $result_array;
7915 $ilDB = $DIC[
'ilDB'];
7918 $affectedRows =
$ilDB->manipulateF(
7919 "DELETE FROM tst_qst_solved WHERE active_fi = %s AND question_fi = %s",
7920 array(
'integer',
'integer'),
7921 array($active_id, $question_id)
7923 $affectedRows =
$ilDB->manipulateF(
7924 "INSERT INTO tst_qst_solved (solved, question_fi, active_fi) VALUES (%s, %s, %s)",
7925 array(
'integer',
'integer',
'integer'),
7926 array($value, $question_id, $active_id)
7936 $ilDB = $DIC[
'ilDB'];
7939 "SELECT submitted FROM tst_active WHERE active_id=%s AND submitted=%s",
7940 array(
'integer',
'integer'),
7941 array($active_id, 1)
7943 return $result->numRows() == 1;
7953 $ilDB = $DIC[
'ilDB'];
7955 if (!is_numeric($user_id)) {
7960 "SELECT submitted FROM tst_active WHERE test_fi=%s AND user_fi=%s AND submitted=%s",
7961 array(
'integer',
'integer',
'integer'),
7964 return $result->numRows() == 1;
7999 "user_id" => $this->lng->txt(
"user_id"),
8000 "matriculation" => $this->lng->txt(
"matriculation"),
8001 "lastname" => $this->lng->txt(
"lastname"),
8002 "firstname" => $this->lng->txt(
"firstname"),
8003 "login" => $this->lng->txt(
"login"),
8004 "reached_points" => $this->lng->txt(
"tst_reached_points"),
8005 "max_points" => $this->lng->txt(
"tst_maximum_points"),
8006 "percent_value" => $this->lng->txt(
"tst_percent_solved"),
8007 "mark" => $this->lng->txt(
"tst_mark"),
8008 "ects" => $this->lng->txt(
"ects_grade")
8011 if (count($participants)) {
8015 foreach ($participants as $active_id => $user_rec) {
8016 $mark = $ects_mark =
'';
8018 $reached_points = 0;
8020 foreach ($this->questions as $value) {
8022 if (is_object($question)) {
8023 $max_points += $question->getMaximumPoints();
8024 $reached_points += $question->getReachedPoints($active_id);
8027 if ($max_points > 0) {
8028 $percentvalue = $reached_points / $max_points;
8029 if ($percentvalue < 0) {
8030 $percentvalue = 0.0;
8035 $mark_obj = $this->mark_schema->getMatchingMark($percentvalue * 100);
8038 $mark = $mark_obj->getOfficialName();
8040 $ects_mark = $this->
getECTSGrade($passed_array, $reached_points, $max_points);
8044 $user_rec[
'firstname'] =
"";
8045 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
8048 "user_id" => $user_rec[
'usr_id'],
8049 "matriculation" => $user_rec[
'matriculation'],
8050 "lastname" => $user_rec[
'lastname'],
8051 "firstname" => $user_rec[
'firstname'],
8052 "login" => $user_rec[
'login'],
8053 "reached_points" => $reached_points,
8054 "max_points" => $max_points,
8055 "percent_value" => $percentvalue,
8057 "ects" => $ects_mark
8059 $results[] = $prepareForCSV ? $this->
processCSVRow($row,
true) : $row;
8077 $resultarray = array();
8078 foreach ($row as $rowindex => $entry) {
8083 if (strpos($entry,
"\"") !==
false) {
8084 $entry = str_replace(
"\"",
"\"\"", $entry);
8087 if (strpos($entry, $separator) !==
false) {
8091 $entry = str_replace(chr(13) . chr(10), chr(10), $entry);
8094 $entry =
"\"" . $entry .
"\"";
8097 $resultarray[$rowindex] = $entry;
8099 return $resultarray;
8113 $ilDB = $DIC[
'ilDB'];
8115 "SELECT tries FROM tst_active WHERE active_id = %s",
8121 return $row[
"tries"];
8139 $ilDB = $DIC[
'ilDB'];
8141 "SELECT MAX(pass) maxpass FROM tst_pass_result WHERE active_fi = %s",
8147 $max = $row[
"maxpass"];
8162 $ilDB = $DIC[
'ilDB'];
8165 "SELECT * FROM tst_pass_result WHERE active_fi = %s",
8173 if ($row[
"maxpoints"] > 0) {
8174 $factor = $row[
"points"] / $row[
"maxpoints"];
8179 if ($factor > $bestfactor) {
8181 $bestfactor = $factor;
8184 if (is_array($bestrow)) {
8185 return $bestrow[
"pass"];
8204 $counted_pass = null;
8210 return $counted_pass;
8226 $tree = $DIC[
'tree'];
8227 $ilDB = $DIC[
'ilDB'];
8229 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
8231 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
8233 $testSession = $testSessionFactory->getSession($active_id);
8235 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
8239 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
8241 $dynamicQuestionSetConfig->loadFromDb();
8252 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
8254 foreach ($this->questions as $value) {
8256 $workedthrough += 1;
8259 return $workedthrough;
8271 $ilDB = $DIC[
'ilDB'];
8273 if (is_null(
$pass)) {
8278 SELECT tst_pass_result.tstamp pass_res_tstamp, 8279 tst_test_result.tstamp quest_res_tstamp 8281 FROM tst_pass_result 8283 LEFT JOIN tst_test_result 8284 ON tst_test_result.active_fi = tst_pass_result.active_fi 8285 AND tst_test_result.pass = tst_pass_result.pass 8287 WHERE tst_pass_result.active_fi = %s 8288 AND tst_pass_result.pass = %s 8290 ORDER BY tst_test_result.tstamp DESC 8295 array(
'integer',
'integer'),
8296 array($active_id,
$pass)
8300 if ($row[
'qres_tstamp']) {
8301 return $row[
'quest_res_tstamp'];
8304 return $row[
'pass_res_tstamp'];
8321 "executable" =>
true,
8322 "errormessage" =>
"" 8325 $result[
"executable"] =
false;
8330 $result[
"executable"] =
false;
8338 if ($active_id > 0) {
8352 $result[
"executable"] =
false;
8353 $result[
"errormessage"] = $this->lng->txt(
"detail_max_processing_time_reached");
8361 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8363 $testPassesSelector->setActiveId($active_id);
8364 $testPassesSelector->setLastFinishedPass(
$testSession->getLastFinishedPass());
8367 $closedPasses = $testPassesSelector->getClosedPasses();
8370 $result[
"executable"] =
false;
8371 $result[
"errormessage"] = $this->lng->txt(
"maximum_nr_of_tries_reached");
8377 $result[
'executable'] =
false;
8378 $result[
'errormessage'] = $this->lng->txt(
"tst_addit_passes_blocked_after_passed_msg");
8384 $lastPass = $testPassesSelector->getLastFinishedPassTimestamp();
8387 $time_values = explode(
":", $pass_waiting_string);
8388 $next_pass_allowed = strtotime(
'+ ' . $time_values[0] .
' Months + ' . $time_values[1] .
' Days + ' . $time_values[2] .
' Hours' . $time_values[3] .
' Minutes', $lastPass);
8390 if (time() < $next_pass_allowed) {
8393 $result[
"executable"] =
false;
8394 $result[
"errormessage"] = sprintf($this->lng->txt(
'wait_for_next_pass_hint_msg'), $date);
8407 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8413 return $passSelector->hasReportablePasses();
8420 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
8426 return $passSelector->hasExistingPasses();
8439 $ilDB = $DIC[
'ilDB'];
8441 if ($active_id < 1) {
8444 if (
$pass === null) {
8448 "SELECT tst_times.started FROM tst_times WHERE tst_times.active_fi = %s AND tst_times.pass = %s ORDER BY tst_times.started",
8449 array(
'integer',
'integer'),
8450 array($active_id,
$pass)
8454 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $row[
"started"], $matches)) {
8455 return mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
8490 $ilDB = $DIC[
'ilDB'];
8494 questtypes.type_tag, 8496 tstquest.obligatory, 8497 origquest.obj_fi orig_obj_fi 8499 FROM qpl_questions questions 8501 INNER JOIN qpl_qst_type questtypes 8502 ON questtypes.question_type_id = questions.question_type_fi 8504 INNER JOIN tst_test_question tstquest 8505 ON tstquest.question_fi = questions.question_id 8507 LEFT JOIN qpl_questions origquest 8508 ON origquest.question_id = questions.original_id 8510 WHERE tstquest.test_fi = %s 8512 ORDER BY tstquest.sequence 8515 $query_result =
$ilDB->queryF(
8523 while ($row =
$ilDB->fetchAssoc($query_result)) {
8526 $question[
'obligationPossible'] = self::isQuestionObligationPossible($row[
'question_id']);
8541 if ($questionData[
'question_id'] != $questionId) {
8555 $row = $DIC->database()->fetchAssoc($DIC->database()->queryF(
8556 "SELECT COUNT(question_id) cnt FROM qpl_questions WHERE question_id = %s AND obj_fi = %s",
8557 array(
'integer',
'integer'),
8558 array($questionId, $this->
getId())
8561 return (
bool) $row[
'cnt'];
8572 $points += $questionData[
'points'];
8583 $totalWorkingTime =
'00:00:00';
8588 $questionData[
'working_time']
8592 return $totalWorkingTime;
8598 public function getPotentialRandomTestQuestions()
8604 $ilDB = $DIC[
'ilDB'];
8608 questtypes.type_tag, 8609 origquest.obj_fi orig_obj_fi 8611 FROM qpl_questions questions 8613 INNER JOIN qpl_qst_type questtypes 8614 ON questtypes.question_type_id = questions.question_type_fi 8616 INNER JOIN tst_rnd_cpy tstquest 8617 ON tstquest.qst_fi = questions.question_id 8619 LEFT JOIN qpl_questions origquest 8620 ON origquest.question_id = questions.original_id 8622 WHERE tstquest.tst_fi = %s 8625 $query_result =
$ilDB->queryF(
8633 while ($row =
$ilDB->fetchAssoc($query_result)) {
8636 $question[
'obligationPossible'] = self::isQuestionObligationPossible($row[
'question_id']);
8652 return ($this->shuffle_questions) ? 1 : 0;
8663 $this->shuffle_questions = ($a_shuffle) ? 1 : 0;
8680 return ($this->show_summary) ? $this->show_summary : 0;
8697 $this->show_summary = $a_value;
8708 if (($this->show_summary & 1) > 0) {
8724 $this->show_summary = 1;
8726 $this->show_summary = 0;
8738 if (($this->show_summary & 2) > 0) {
8754 $this->show_summary = $this->show_summary | 2;
8758 $this->show_summary = $this->show_summary ^ 2;
8771 if (($this->show_summary & 4) > 0) {
8787 $this->show_summary = $this->show_summary | 4;
8791 $this->show_summary = $this->show_summary ^ 4;
8804 if (($this->show_summary & 8) > 0) {
8820 $this->show_summary = $this->show_summary | 8;
8824 $this->show_summary = $this->show_summary ^ 8;
8837 return ($this->results_presentation) ? $this->results_presentation : 0;
8848 if (($this->results_presentation & 1) > 0) {
8863 if (($this->results_presentation & 2) > 0) {
8878 if (($this->results_presentation & 4) > 0) {
8893 if (($this->results_presentation & 8) > 0) {
8908 if (($this->results_presentation & 16) > 0) {
8923 if (($this->results_presentation & 32) > 0) {
8936 if (($this->results_presentation & 64) > 0) {
8949 if (($this->results_presentation & 128) > 0) {
8964 $this->results_presentation = $a_results_presentation;
8978 $this->results_presentation = $this->results_presentation | 1;
8981 $this->results_presentation = $this->results_presentation ^ 1;
8995 $this->results_presentation = $this->results_presentation | 2;
8998 $this->results_presentation = $this->results_presentation ^ 2;
9023 $this->results_presentation = $this->results_presentation | 4;
9026 $this->results_presentation = $this->results_presentation ^ 4;
9040 $this->results_presentation = $this->results_presentation | 8;
9043 $this->results_presentation = $this->results_presentation ^ 8;
9057 $this->results_presentation = $this->results_presentation | 16;
9060 $this->results_presentation = $this->results_presentation ^ 16;
9074 $this->results_presentation = $this->results_presentation | 32;
9077 $this->results_presentation = $this->results_presentation ^ 32;
9091 $this->results_presentation = $this->results_presentation | 64;
9094 $this->results_presentation = $this->results_presentation ^ 64;
9106 if ($a_comparison) {
9107 $this->results_presentation = $this->results_presentation | 128;
9110 $this->results_presentation = $this->results_presentation ^ 128;
9121 $ilDB = $DIC[
'ilDB'];
9123 "SELECT user_fi FROM tst_active WHERE active_id = %s",
9129 return $row[
"user_fi"];
9153 return ($this->allowedUsers) ? $this->allowedUsers : 0;
9158 $this->allowedUsers = $a_allowed_users;
9163 return ($this->allowedUsersTimeGap) ? $this->allowedUsersTimeGap : 0;
9168 $this->allowedUsersTimeGap = $a_allowed_users_time_gap;
9174 $ilDB = $DIC[
'ilDB'];
9178 if (($nr_of_users > 0) && ($time_gap > 0)) {
9180 $time_border = $now - $time_gap;
9181 $str_time_border = strftime(
"%Y%m%d%H%M%S", $time_border);
9183 SELECT DISTINCT tst_times.active_fi 9185 INNER JOIN tst_active 9186 ON tst_times.active_fi = tst_active.active_id 9188 tst_times.pass > tst_active.last_finished_pass OR tst_active.last_finished_pass IS NULL 9190 WHERE tst_times.tstamp > %s 9191 AND tst_active.test_fi = %s 9194 if (
$result->numRows() >= $nr_of_users) {
9195 include_once
"./Modules/Test/classes/class.ilObjAssessmentFolder.php";
9210 $ilDB = $DIC[
'ilDB'];
9213 "SELECT finished FROM tst_times WHERE active_fi = %s ORDER BY finished DESC",
9219 return $row[
"finished"];
9229 SELECT MAX(tst_times.tstamp) as last_pass_access 9231 WHERE active_fi = %s 9235 $res = $DIC->database()->queryF(
9237 array(
'integer',
'integer'),
9238 array($activeId, $passIndex)
9241 while ($row = $DIC->database()->fetchAssoc(
$res)) {
9242 return $row[
'last_pass_access'];
9257 if (preg_match(
"/<[^>]*?>/", $a_text)) {
9274 for (
$i = 0;
$i < $a_material->getMaterialCount();
$i++) {
9275 $material = $a_material->getMaterial(
$i);
9276 if (strcmp($material[
"type"],
"mattext") == 0) {
9277 $result .= $material[
"material"]->getContent();
9279 if (strcmp($material[
"type"],
"matimage") == 0) {
9280 $matimage = $material[
"material"];
9281 if (preg_match(
"/(il_([0-9]+)_mob_([0-9]+))/", $matimage->getLabel(), $matches)) {
9283 if (!is_array(
$_SESSION[
"import_mob_xhtml"])) {
9284 $_SESSION[
"import_mob_xhtml"] = array();
9286 array_push(
$_SESSION[
"import_mob_xhtml"], array(
"mob" => $matimage->getLabel(),
"uri" => $matimage->getUri()));
9306 include_once
"./Services/RTE/classes/class.ilRTE.php";
9307 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
9309 $a_xml_writer->xmlStartTag(
"material");
9311 "texttype" =>
"text/plain" 9313 if ($this->
isHTML($a_material)) {
9314 $attrs[
"texttype"] =
"text/xhtml";
9319 foreach (
$mobs as $mob) {
9320 $moblabel =
"il_" . IL_INST_ID .
"_mob_" . $mob;
9321 if (strpos($a_material,
"mm_$mob") !==
false) {
9325 "label" => $moblabel,
9326 "uri" =>
"objects/" .
"il_" . IL_INST_ID .
"_mob_" . $mob .
"/" . $mob_obj->getTitle()
9329 $a_xml_writer->xmlElement(
"matimage", $imgattrs, null);
9332 $a_xml_writer->xmlEndTag(
"material");
9343 include_once
"./Services/Utilities/classes/class.ilUtil.php";
9356 $ilDB = $DIC[
'ilDB'];
9358 $affectedRows =
$ilDB->manipulateF(
9359 "UPDATE tst_tests SET certificate_visibility = %s, tstamp = %s WHERE test_id = %s",
9360 array(
'text',
'integer',
'integer'),
9361 array($a_value, time(), $this->
getTestId())
9373 return (strlen($this->certificate_visibility)) ? $this->certificate_visibility : 0;
9384 $this->certificate_visibility = $a_value;
9395 return ($this->anonymity) ? 1 : 0;
9408 $this->anonymity = 1;
9411 $this->anonymity = 0;
9424 return ($this->show_cancel) ? 1 : 0;
9437 $this->show_cancel = 1;
9440 $this->show_cancel = 0;
9453 return ($this->show_marker) ? 1 : 0;
9466 $this->show_marker = 1;
9469 $this->show_marker = 0;
9482 return ($this->fixed_participants) ? 1 : 0;
9495 $this->fixed_participants = 1;
9498 $this->fixed_participants = 0;
9513 $ilDB = $DIC[
'ilDB'];
9516 "SELECT anonymity FROM tst_tests WHERE obj_fi = %s",
9521 return $row[
'anonymity'];
9535 $ilDB = $DIC[
'ilDB'];
9538 SELECT tst_tests.question_set_type 9540 INNER JOIN tst_tests 9541 ON tst_active.test_fi = tst_tests.test_id 9542 WHERE tst_active.active_id = %s 9547 while ($row =
$ilDB->fetchAssoc(
$res)) {
9548 return $row[
'question_set_type'];
9564 throw new Exception(__METHOD__ .
' is deprecated ... use ilObjTest::lookupQuestionSetTypeByActiveId() instead!');
9567 $ilDB = $DIC[
'ilDB'];
9570 "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",
9575 return $row[
'random_test'];
9590 public function userLookupFullName($user_id, $overwrite_anonymity =
false, $sorted_order =
false, $suffix =
"")
9593 return $this->lng->txt(
"anonymous") . $suffix;
9595 include_once
'./Services/User/classes/class.ilObjUser.php';
9597 if (strlen($uname[
"firstname"] . $uname[
"lastname"]) == 0) {
9598 $uname[
"firstname"] = $this->lng->txt(
"deleted_user");
9600 if ($sorted_order) {
9601 return trim($uname[
"lastname"] .
", " . $uname[
"firstname"]) . $suffix;
9603 return trim($uname[
"firstname"] .
" " . $uname[
"lastname"]) . $suffix;
9618 return $this->lng->txt(
"tst_start_test");
9620 $active_pass = self::_getPass($active_id);
9623 if ($active_pass == 0) {
9624 return $this->lng->txt(
"tst_start_test");
9626 return $this->lng->txt(
"tst_start_new_test_pass");
9629 return $this->lng->txt(
"tst_resume_test");
9638 public function getAvailableDefaults()
9645 $ilDB = $DIC[
'ilDB'];
9649 "SELECT * FROM tst_test_defaults WHERE user_fi = %s ORDER BY name ASC",
9653 $defaults = array();
9655 $defaults[$row[
"test_defaults_id"]] = $row;
9669 return self::_getTestDefaults($test_defaults_id);
9675 $ilDB = $DIC[
'ilDB'];
9678 "SELECT * FROM tst_test_defaults WHERE test_defaults_id = %s",
9680 array($test_defaults_id)
9682 if (
$result->numRows() == 1) {
9699 $ilDB = $DIC[
'ilDB'];
9700 $affectedRows =
$ilDB->manipulateF(
9701 "DELETE FROM tst_test_defaults WHERE test_defaults_id = %s",
9703 array($test_default_id)
9716 $ilDB = $DIC[
'ilDB'];
9718 $testsettings = array(
9813 $next_id =
$ilDB->nextId(
'tst_test_defaults');
9815 'tst_test_defaults',
9817 'test_defaults_id' => array(
'integer', $next_id),
9818 'name' => array(
'text', $a_name),
9819 'user_fi' => array(
'integer',
$ilUser->getId()),
9820 'defaults' => array(
'clob', serialize($testsettings)),
9821 'marks' => array(
'clob', serialize($this->mark_schema)),
9822 'tstamp' => array(
'integer', time())
9836 $testsettings = unserialize($test_defaults[
"defaults"]);
9837 include_once
"./Modules/Test/classes/class.assMarkSchema.php";
9838 $this->mark_schema = unserialize($test_defaults[
"marks"]);
9873 $this->
setKiosk($testsettings[
"Kiosk"]);
9877 $this->
setECTSFX($testsettings[
"ECTSFX"]);
9879 if (isset($testsettings[
"isRandomTest"])) {
9880 if ($testsettings[
"isRandomTest"]) {
9885 } elseif (isset($testsettings[
"questionSetType"])) {
9907 if (isset($testsettings[
'examid_in_kiosk'])) {
9912 if (isset($testsettings[
'show_exam_id'])) {
9966 if (extension_loaded(
"tidy")) {
9969 "output-xml" =>
true,
9970 "numeric-entities" =>
true 9973 $tidy->parseString($print_output,
$config,
'utf8');
9974 $tidy->cleanRepair();
9975 $print_output = tidy_get_output($tidy);
9976 $print_output = preg_replace(
"/^.*?(<html)/",
"\\1", $print_output);
9978 $print_output = str_replace(
" ",
" ", $print_output);
9979 $print_output = str_replace(
"⊗",
"X", $print_output);
9981 $xsl = file_get_contents(
"./Modules/Test/xml/question2fo.xsl");
9986 'font-family="Helvetica, unifont"',
9987 'font-family="' . $DIC[
'ilSetting']->
get(
'rpc_pdf_font',
'Helvetica, unifont') .
'"',
9991 $args = array(
'/_xml' => $print_output,
'/_xsl' => $xsl );
9994 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl", null, $args, $params);
10008 $content = preg_replace(
"/href=\".*?\"/",
"", $content);
10009 $printbody =
new ilTemplate(
"tpl.il_as_tst_print_body.html",
true,
true,
"Modules/Test");
10011 $printbody->setVariable(
"ADM_CONTENT", $content);
10012 $printbody->setCurrentBlock(
"css_file");
10014 $printbody->parseCurrentBlock();
10015 $printbody->setCurrentBlock(
"css_file");
10017 $printbody->parseCurrentBlock();
10018 $printoutput = $printbody->get();
10019 $html = str_replace(
"href=\"./",
"href=\"" .
ILIAS_HTTP_PATH .
"/", $printoutput);
10020 $html = preg_replace(
"/<div id=\"dontprint\">.*?<\\/div>/ims",
"", $html);
10021 if (extension_loaded(
"tidy")) {
10024 "output-xml" =>
true,
10025 "numeric-entities" =>
true 10027 $tidy =
new tidy();
10028 $tidy->parseString($html,
$config,
'utf8');
10029 $tidy->cleanRepair();
10030 $html = tidy_get_output($tidy);
10031 $html = preg_replace(
"/^.*?(<html)/",
"\\1", $html);
10033 $html = str_replace(
" ",
" ", $html);
10034 $html = str_replace(
"⊗",
"X", $html);
10036 $html = preg_replace(
"/src=\".\\//ims",
"src=\"" .
ILIAS_HTTP_PATH .
"/", $html);
10051 include_once
"./Services/Utilities/classes/class.ilUtil.php";
10053 $fp = fopen($fo_file,
"w");
10057 include_once
'./Services/WebServices/RPC/classes/class.ilRpcClientFactory.php';
10064 $ilLog->write(__METHOD__ .
': ' . $e->getMessage());
10081 $row = self::getSingleManualFeedback($active_id, $question_id,
$pass);
10084 $feedback = $row[
'feedback'];
10103 $ilDB = $DIC->database();
10106 "SELECT * FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10107 array(
'integer',
'integer',
'integer'),
10108 array($active_id, $question_id,
$pass)
10111 if (
$result->numRows() === 1) {
10115 $DIC->logger()->root()->warning(
"WARNING: Multiple feedback entries on tst_manual_fb for " .
10116 "active_fi = $active_id , question_fi = $question_id and pass = $pass");
10133 $ilDB = $DIC->database();
10134 $feedback = array();
10136 "SELECT * FROM tst_manual_fb WHERE question_fi = %s",
10138 array($question_id)
10142 $active = $row[
'active_fi'];
10143 $pass = $row[
'pass'];
10144 $question = $row[
'question_fi'];
10148 $feedback[$active][
$pass][$question] = $row;
10171 $finalized_record = (int) $feedback_old[
'finalized_evaluation'];
10172 if ($finalized_record === 0 || ($is_single_feedback && $finalized_record === 1)) {
10173 $DIC->database()->manipulateF(
10174 "DELETE FROM tst_manual_fb WHERE active_fi = %s AND question_fi = %s AND pass = %s",
10175 array(
'integer',
'integer',
'integer'),
10176 array($active_id, $question_id,
$pass)
10203 $ilDB = $DIC->database();
10205 $next_id =
$ilDB->nextId(
'tst_manual_fb');
10207 $finalized_time = time();
10209 $update_default = [
10210 'manual_feedback_id' => [
'integer', $next_id],
10211 'active_fi' => [
'integer', $active_id],
10212 'question_fi' => [
'integer', $question_id],
10213 'pass' => [
'integer',
$pass],
10215 'tstamp' => [
'integer', time()]
10218 if ($feedback_old[
'finalized_evaluation'] == 1) {
10219 $user = $feedback_old[
'finalized_by_usr_id'];
10220 $finalized_time = $feedback_old[
'finalized_tstamp'];
10223 if ($finalized ===
true || $feedback_old[
'finalized_evaluation'] == 1) {
10224 if (!array_key_exists(
'evaluated',
$_POST)) {
10225 $update_default[
'finalized_evaluation'] = [
'integer', 0];
10226 $update_default[
'finalized_by_usr_id'] = [
'integer', 0];
10227 $update_default[
'finalized_tstamp'] = [
'integer', 0];
10229 $update_default[
'finalized_evaluation'] = [
'integer', 1];
10230 $update_default[
'finalized_by_usr_id'] = [
'integer', $user];
10231 $update_default[
'finalized_tstamp'] = [
'integer', $finalized_time];
10235 $ilDB->insert(
'tst_manual_fb', $update_default);
10250 $lng = $DIC->language();
10285 include_once
"./Modules/Test/classes/class.ilTestSequence.php";
10296 $this->test_id = $a_id;
10310 if (count($participants)) {
10311 foreach ($participants as $active_id => $user_rec) {
10313 $reached_points = 0;
10315 foreach ($this->questions as $value) {
10317 if (is_object($question)) {
10318 $max_points += $question->getMaximumPoints();
10319 $reached_points += $question->getReachedPoints($active_id);
10320 if ($max_points > 0) {
10321 $percentvalue = $reached_points / $max_points;
10322 if ($percentvalue < 0) {
10323 $percentvalue = 0.0;
10329 $user_rec[
'firstname'] =
"";
10330 $user_rec[
'lastname'] = $this->lng->txt(
"anonymous");
10333 "user_id" => $user_rec[
'usr_id'],
10334 "matriculation" => $user_rec[
'matriculation'],
10335 "lastname" => $user_rec[
'lastname'],
10336 "firstname" => $user_rec[
'firstname'],
10337 "login" => $user_rec[
'login'],
10338 "question_id" => $question->getId(),
10339 "question_title" => $question->getTitle(),
10340 "reached_points" => $reached_points,
10341 "max_points" => $max_points
10357 $ilDB = $DIC[
'ilDB'];
10360 "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",
10365 return $rec[
"obj_id"];
10377 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
10378 if ($ilPluginAdmin->isActive(
IL_COMP_MODULE,
"TestQuestionPool",
"qst", $a_pname)) {
10388 $ilDB = $DIC[
'ilDB'];
10391 "SELECT passed FROM tst_result_cache WHERE active_fi = %s",
10397 return $row[
'passed'];
10400 $result_array = &$this->
getTestResult($active_id, $counted_pass);
10401 return $result_array[
"test"][
"passed"];
10413 $isComplete =
false;
10416 $userCertificateRepository->fetchActiveCertificate($user_id, $this->
getId());
10417 $isComplete =
true;
10453 public function getParticipantsForTestAndQuestion(
$test_id, $question_id)
10457 $ilDB = $DIC[
'ilDB'];
10460 SELECT tst_test_result.active_fi, tst_test_result.question_fi, tst_test_result.pass 10461 FROM tst_test_result 10462 INNER JOIN tst_active ON tst_active.active_id = tst_test_result.active_fi AND tst_active.test_fi = %s 10463 INNER JOIN qpl_questions ON qpl_questions.question_id = tst_test_result.question_fi 10464 LEFT JOIN usr_data ON usr_data.usr_id = tst_active.user_fi 10465 WHERE tst_test_result.question_fi = %s 10466 ORDER BY usr_data.lastname ASC, usr_data.firstname ASC 10471 array(
'integer',
'integer'),
10474 $foundusers = array();
10481 if (!array_key_exists($row[
"active_fi"], $foundusers)) {
10482 $foundusers[$row[
"active_fi"]] = array();
10484 array_push($foundusers[$row[
"active_fi"]], array(
"pass" => $row[
"pass"],
"qid" => $row[
"question_fi"]));
10486 return $foundusers;
10497 $foundParticipants = &
$data->getParticipants();
10498 $results = array(
"overview" => array(),
"questions" => array());
10499 if (count($foundParticipants)) {
10500 $results[
"overview"][$this->lng->txt(
"tst_eval_total_persons")] = count($foundParticipants);
10501 $total_finished =
$data->getTotalFinishedParticipants();
10502 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished")] = $total_finished;
10504 $diff_seconds = $average_time;
10505 $diff_hours = floor($diff_seconds / 3600);
10506 $diff_seconds -= $diff_hours * 3600;
10507 $diff_minutes = floor($diff_seconds / 60);
10508 $diff_seconds -= $diff_minutes * 60;
10509 $results[
"overview"][$this->lng->txt(
"tst_eval_total_finished_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10511 $total_passed_reached = 0;
10512 $total_passed_max = 0;
10513 $total_passed_time = 0;
10514 foreach ($foundParticipants as $userdata) {
10515 if ($userdata->getPassed()) {
10517 $total_passed_reached += $userdata->getReached();
10518 $total_passed_max += $userdata->getMaxpoints();
10519 $total_passed_time += $userdata->getTimeOfWork();
10522 $average_passed_reached = $total_passed ? $total_passed_reached / $total_passed : 0;
10523 $average_passed_max = $total_passed ? $total_passed_max / $total_passed : 0;
10524 $average_passed_time = $total_passed ? $total_passed_time / $total_passed : 0;
10525 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed")] = $total_passed;
10526 $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);
10527 $average_time = $average_passed_time;
10528 $diff_seconds = $average_time;
10529 $diff_hours = floor($diff_seconds / 3600);
10530 $diff_seconds -= $diff_hours * 3600;
10531 $diff_minutes = floor($diff_seconds / 60);
10532 $diff_seconds -= $diff_minutes * 60;
10533 $results[
"overview"][$this->lng->txt(
"tst_eval_total_passed_average_time")] = sprintf(
"%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
10536 foreach (
$data->getQuestionTitles() as $question_id => $question_title) {
10540 foreach ($foundParticipants as $userdata) {
10541 for (
$i = 0;
$i <= $userdata->getLastPass();
$i++) {
10542 if (is_object($userdata->getPass(
$i))) {
10543 $question = &$userdata->getPass(
$i)->getAnsweredQuestionByQuestionId($question_id);
10544 if (is_array($question)) {
10546 $reached += $question[
"reached"];
10547 $max += $question[
"points"];
10552 $percent = $max ? $reached / $max * 100.0 : 0;
10553 $results[
"questions"][$question_id] = array(
10555 sprintf(
"%.2f", $answered ? $reached / $answered : 0) .
" " . strtolower($this->lng->txt(
"of")) .
" " . sprintf(
"%.2f", $answered ? $max / $answered : 0),
10556 sprintf(
"%.2f", $percent) .
"%",
10558 sprintf(
"%.2f", $answered ? $reached / $answered : 0),
10559 sprintf(
"%.2f", $answered ? $max / $answered : 0),
10571 require_once
'Modules/Test/classes/class.ilTestExportFactory.php';
10573 $test_exp = $expFactory->getExporter(
'xml');
10574 return $test_exp->buildExportFile();
10592 $this->mailnotification = $a_notification;
10597 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10602 $mail->sendSimpleNotification($owner_id, $this->
getTitle(), $usr_data);
10612 include_once
"./Modules/Test/classes/class.ilObjTestGUI.php";
10613 include_once
"./Modules/Test/classes/tables/class.ilEvaluationAllTableGUI.php";
10615 return $table_gui->getSelectedColumns();
10620 include_once
"./Modules/Test/classes/class.ilTestMailNotification.php";
10629 require_once
'Modules/Test/classes/class.ilTestExportFactory.php';
10631 $exportObj = $expFactory->getExporter(
'results');
10632 $exportObj->setForcedAccessFilteredParticipantList($participantList);
10633 $file = $exportObj->exportToExcel($deliver =
false,
'active_id', $active_id, $passedonly =
false);
10634 include_once
"./Services/Mail/classes/class.ilFileDataMail.php";
10636 $fd->copyAttachmentFile($file,
"result_" . $active_id .
".xls");
10637 $file_names[] =
"result_" . $active_id .
".xls";
10639 $mail->sendAdvancedNotification($owner_id, $this->
getTitle(), $usr_data, $file_names);
10641 if (count($file_names)) {
10642 $fd->unlinkFiles($file_names);
10651 $ilDB = $DIC[
'ilDB'];
10655 FROM tst_result_cache 10656 WHERE active_fi = %s 10666 include_once
"./Modules/TestQuestionPool/classes/class.assQuestion.php";
10672 FROM tst_result_cache 10673 WHERE active_fi = %s 10690 if ($this->mailnottype == 1) {
10700 $this->mailnottype = 1;
10702 $this->mailnottype = 0;
10708 if ($this->exportsettings) {
10718 $this->exportsettings = $a_settings;
10720 $this->exportsettings = 0;
10726 if (($this->exportsettings & 1) > 0) {
10736 $this->exportsettings = $this->exportsettings | 1;
10739 $this->exportsettings = $this->exportsettings ^ 1;
10746 return $this->enabled_view_mode;
10751 $this->enabled_view_mode = $mode;
10766 $new_array = array();
10769 $query =
'SELECT question_fi FROM tst_test_question WHERE test_fi = %s';
10770 $types = array(
'integer');
10773 $new_question_id += 1;
10776 $ilDB = $DIC[
'ilDB'];
10779 while ($row =
$ilDB->fetchAssoc(
$res)) {
10780 $qid = $row[
'question_fi'];
10782 if ($qid == $new_question_id) {
10784 } elseif ($qid == $previous_question_id) {
10785 $new_array[$position++] = $qid;
10786 $new_array[$position++] = $new_question_id;
10789 $new_array[$position++] = $qid;
10793 $update_query =
'UPDATE tst_test_question SET sequence = %s WHERE test_fi = %s AND question_fi = %s';
10794 $update_types = array(
'integer',
'integer',
'integer');
10796 foreach ($new_array as $position => $qid) {
10797 $ilDB->manipulateF(
10822 $values[] =
'instant_feedback_specific';
10825 $values[] =
'instant_feedback_generic';
10828 $values[] =
'instant_feedback_points';
10831 $values[] =
'instant_feedback_solution';
10839 if (is_array($options)) {
10855 'pass_details' =>
'setShowPassDetails',
10856 'solution_details' =>
'setShowSolutionDetails',
10857 'solution_printview' =>
'setShowSolutionPrintview',
10858 'solution_feedback' =>
'setShowSolutionFeedback',
10859 'solution_answers_only' =>
'setShowSolutionAnswersOnly',
10860 'solution_signature' =>
'setShowSolutionSignature',
10861 'solution_suggested' =>
'setShowSolutionSuggested',
10863 foreach ($setter as $key => $setter) {
10864 if (in_array($key, $options)) {
10879 $this->poolUsage = (boolean) $usage;
10888 $tree = $DIC[
'tree'];
10889 $db = $DIC[
'ilDB'];
10890 $pluginAdmin = $DIC[
'ilPluginAdmin'];
10892 require_once
'Modules/Test/classes/class.ilTestQuestionSetConfigFactory.php';
10894 $questionSetConfig = $qscFactory->getQuestionSetConfig();
10897 $reindexedSequencePositionMap = $questionSetConfig->reindexQuestionOrdering();
10901 return $reindexedSequencePositionMap;
10907 $ilDB = $DIC[
'ilDB'];
10913 foreach ($orders as
$id => $position) {
10917 isset($obligations[
$id]) && $obligations[
$id] ? 1 : 0
10921 UPDATE tst_test_question 10924 WHERE question_fi = %s 10927 $ilDB->manipulateF(
10929 array(
'integer',
'integer',
'integer'),
10930 array(
$i, $obligatory, $id)
10940 $ilDB = $DIC[
'ilDB'];
10942 if ($question_before) {
10943 $query =
'SELECT sequence, test_fi FROM tst_test_question WHERE question_fi = %s';
10944 $types = array(
'integer');
10945 $values = array($question_before);
10949 if (!$question_before || ($rset && !($row =
$ilDB->fetchAssoc($rset)))) {
10956 $update =
'UPDATE tst_test_question SET sequence = sequence + 1 WHERE sequence > %s AND test_fi = %s';
10957 $types = array(
'integer',
'integer');
10958 $values = array($row[
'sequence'], $row[
'test_fi']);
10959 $ilDB->manipulateF($update, $types, $values);
10961 $update =
'UPDATE tst_test_question SET sequence = %s WHERE question_fi = %s';
10962 $types = array(
'integer',
'integer');
10963 $values = array($row[
'sequence'] + 1, $question_to_move);
10964 $ilDB->manipulateF($update, $types, $values);
10972 $ilDB = $DIC[
'ilDB'];
10976 $IN_questions =
$ilDB->in(
'q1.question_id', array_keys(
$questions),
false,
'integer');
10979 SELECT count(q1.question_id) cnt 10981 FROM qpl_questions q1 10983 INNER JOIN qpl_questions q2 10984 ON q2.question_id = q1.original_id 10986 WHERE $IN_questions 10987 AND q1.obj_fi = q2.obj_fi 10992 $row =
$ilDB->fetchAssoc($rset);
10994 return $row[
'cnt'] > 0;
11006 $ilDB = $DIC[
'ilDB'];
11009 "SELECT test_fi,MAX(pass) AS pass FROM tst_active" .
11010 " JOIN tst_pass_result ON (tst_pass_result.active_fi = tst_active.active_id)" .
11011 " WHERE user_fi=%s" .
11012 " GROUP BY test_fi",
11013 array(
'integer',
'integer'),
11014 array($a_user_id, 1)
11018 $obj_id = self::_getObjectIDFromTestID($row[
"test_fi"]);
11019 $all[$obj_id] = (bool) $row[
"pass"];
11030 return $this->online;
11035 $this->online = (bool) $a_online;
11056 $this->print_best_solution_with_result = (bool) $status;
11086 $this->activation_visibility = (bool) $a_value;
11096 return (
bool) $this->activation_limited;
11101 $this->activation_limited = (bool) $a_value;
11113 $this->_highscore_enabled = (bool) $a_enabled;
11123 return (
bool) $this->_highscore_enabled;
11135 $this->_highscore_anon = (bool) $a_anon;
11149 return (
bool) $this->_highscore_anon;
11176 $this->_highscore_achieved_ts = (bool) $a_achieved_ts;
11186 return (
bool) $this->_highscore_achieved_ts;
11196 $this->_highscore_score = (bool) $a_score;
11206 return (
bool) $this->_highscore_score;
11216 $this->_highscore_percentage = (bool) $a_percentage;
11226 return (
bool) $this->_highscore_percentage;
11236 $this->_highscore_hints = (bool) $a_hints;
11246 return (
bool) $this->_highscore_hints;
11256 $this->_highscore_wtime = (bool) $a_wtime;
11266 return (
bool) $this->_highscore_wtime;
11276 $this->_highscore_own_table = (bool) $a_own_table;
11286 return (
bool) $this->_highscore_own_table;
11296 $this->_highscore_top_table = (bool) $a_top_table;
11306 return (
bool) $this->_highscore_top_table;
11317 $this->_highscore_top_num = (int) $a_top_num;
11330 $retval = $a_retval;
11331 if ((
int) $this->_highscore_top_num != 0) {
11332 $retval = $this->_highscore_top_num;
11345 return self::HIGHSCORE_SHOW_ALL_TABLES;
11349 return self::HIGHSCORE_SHOW_TOP_TABLE;
11354 return self::HIGHSCORE_SHOW_OWN_TABLE;
11365 case self::HIGHSCORE_SHOW_ALL_TABLES:
11370 case self::HIGHSCORE_SHOW_TOP_TABLE:
11375 case self::HIGHSCORE_SHOW_OWN_TABLE:
11386 switch ($specific_answer_feedback) {
11388 $this->specific_answer_feedback = 1;
11391 $this->specific_answer_feedback = 0;
11398 switch ($this->specific_answer_feedback) {
11434 require_once(
'Modules/TestQuestionPool/classes/class.assQuestion.php');
11442 $obligationPossible = call_user_func(array($classConcreteQuestion,
'isObligationPossible'), $questionId);
11444 return $obligationPossible;
11456 $ilDB = $DIC[
'ilDB'];
11458 $rset =
$ilDB->queryF(
'SELECT obligatory FROM tst_test_question WHERE question_fi = %s', array(
'integer'), array($question_id));
11460 if ($row =
$ilDB->fetchAssoc($rset)) {
11461 return (
bool) $row[
'obligatory'];
11482 $ilDB = $DIC[
'ilDB'];
11484 $rset =
$ilDB->queryF(
11485 'SELECT obligations_answered FROM tst_pass_result WHERE active_fi = %s AND pass = %s',
11486 array(
'integer',
'integer'),
11487 array($active_id,
$pass)
11490 if ($row =
$ilDB->fetchAssoc($rset)) {
11491 return (
bool) $row[
'obligations_answered'];
11494 return !self::hasObligations(
$test_id);
11508 $ilDB = $DIC[
'ilDB'];
11510 $rset =
$ilDB->queryF(
11511 'SELECT count(*) cnt FROM tst_test_question WHERE test_fi = %s AND obligatory = 1',
11516 $row =
$ilDB->fetchAssoc($rset);
11518 return (
bool) $row[
'cnt'] > 0;
11561 #region Examview / PDF Examview 11624 return (strlen($this->activation_starting_time)) ? $this->activation_starting_time : null;
11629 return (strlen($this->activation_ending_time)) ? $this->activation_ending_time : null;
11641 $ilDB = $DIC[
'ilDB'];
11644 $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",
11649 $times[$row[
'active_fi']] = $row[
'started'];
11657 $ilDB = $DIC[
'ilDB'];
11661 "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",
11666 $times[$row[
'active_fi']] = $row[
'additionaltime'];
11674 $ilDB = $DIC[
'ilDB'];
11677 "SELECT additionaltime FROM tst_addtime WHERE active_fi = %s",
11681 if (
$result->numRows() > 0) {
11683 return $row[
'additionaltime'];
11692 require_once
'Modules/Test/classes/class.ilTestParticipantData.php';
11700 $participantData->setActiveIdsFilter(array($active_id));
11703 $participantData->load($this->
getTestId());
11705 foreach ($participantData->getActiveIds() as $active_id) {
11706 $result = $DIC->database()->queryF(
11707 "SELECT active_fi FROM tst_addtime WHERE active_fi = %s",
11712 if (
$result->numRows() > 0) {
11713 $DIC->database()->manipulateF(
11714 "DELETE FROM tst_addtime WHERE active_fi = %s",
11720 $DIC->database()->manipulateF(
11721 "UPDATE tst_active SET tries = %s, submitted = %s, submittimestamp = %s WHERE active_id = %s",
11722 array(
'integer',
'integer',
'timestamp',
'integer'),
11723 array(0, 0, null, $active_id)
11726 $DIC->database()->manipulateF(
11727 "INSERT INTO tst_addtime (active_fi, additionaltime, tstamp) VALUES (%s, %s, %s)",
11728 array(
'integer',
'integer',
'integer'),
11729 array($active_id, $minutes, time())
11732 require_once
'Modules/Test/classes/class.ilObjAssessmentFolder.php';
11758 public function getMaxPassOfTest()
11764 $ilDB = $DIC[
'ilDB'];
11767 SELECT MAX(tst_pass_result.pass) + 1 max_res 11768 FROM tst_pass_result 11769 INNER JOIN tst_active ON tst_active.active_id = tst_pass_result.active_fi 11770 WHERE test_fi = ' .
$ilDB->quote($this->
getTestId(),
'integer') .
' 11774 return (
int)
$data[
'max_res'];
11785 $ilDB = $DIC[
'ilDB'];
11787 $exam_id_query =
'SELECT exam_id FROM tst_pass_result WHERE active_fi = %s AND pass = %s';
11788 $exam_id_result =
$ilDB->queryF($exam_id_query, array(
'integer',
'integer' ), array( $active_id,
$pass ));
11789 if (
$ilDB->numRows($exam_id_result) == 1) {
11790 $exam_id_row =
$ilDB->fetchAssoc($exam_id_result);
11792 if ($exam_id_row[
'exam_id'] != null) {
11793 return $exam_id_row[
'exam_id'];
11811 $inst_id =
$ilSetting->get(
'inst_id', null);
11813 if ($test_obj_id === null) {
11814 $obj_id = self::_getObjectIDFromActiveID($active_id);
11816 $obj_id = $test_obj_id;
11819 $examId =
'I' . $inst_id .
'_T' . $obj_id .
'_A' . $active_id .
'_P' .
$pass;
11871 $this->char_selector_availability = (int) $availability;
11887 $this->char_selector_definition = $definition;
11929 $ilDB = $DIC[
'ilDB'];
11931 $query =
"SELECT question_set_type FROM tst_tests WHERE obj_fi = %s";
11937 while ($row =
$ilDB->fetchAssoc(
$res)) {
11983 return self::lookupQuestionSetType($a_obj_id) == self::QUESTION_SET_TYPE_RANDOM;
11990 return $lng->
txt(
'tst_question_set_type_fixed');
11993 return $lng->
txt(
'tst_question_set_type_random');
11996 return $lng->
txt(
'tst_question_set_type_dynamic');
12013 require_once
'class.ilTestScoring.php';
12015 $scoring->setPreserveManualScores($preserve_manscoring);
12016 $scoring->recalculateSolutions();
12021 require_once
'Modules/Test/classes/class.ilObjTestDynamicQuestionSetConfig.php';
12023 $questionChangeListeners = array(
12027 return $questionChangeListeners;
12033 $ilDB = $DIC[
'ilDB'];
12038 INNER JOIN tst_tests 12039 ON test_id = test_fi 12047 while ($row =
$ilDB->fetchAssoc(
$res)) {
12048 $objIds[] = (int) $row[
'obj_fi'];
12080 if (!self::isSkillManagementGloballyActivated()) {
12091 if (self::$isSkillManagementGloballyActivated === null) {
12092 include_once
'Services/Skill/classes/class.ilSkillManagementSettings.php';
12095 self::$isSkillManagementGloballyActivated = $skmgSet->isActivated();
12098 return self::$isSkillManagementGloballyActivated;
12161 $ilDB = $DIC[
'ilDB'];
12162 $lng = $DIC[
'lng'];
12163 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
12169 $activeId = $testOBJ->getActiveIdOfUser($userId);
12171 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12174 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12177 $testSession = $testSessionFactory->getSession($activeId);
12182 if ($a_force_new_run) {
12195 $ilDB = $DIC[
'ilDB'];
12196 $lng = $DIC[
'lng'];
12197 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
12204 $activeId = $testOBJ->getActiveIdOfUser($userId);
12206 require_once
'Modules/Test/classes/class.ilTestSessionFactory.php';
12209 $testSessionFactory->reset();
12211 require_once
'Modules/Test/classes/class.ilTestSequenceFactory.php';
12214 $testSession = $testSessionFactory->getSession($activeId);
12237 public function adjustTestSequence()
12243 $ilDB = $DIC[
'ilDB'];
12246 SELECT COUNT(test_question_id) cnt 12247 FROM tst_test_question 12254 $row =
$ilDB->fetchAssoc($questRes);
12255 $questCount = $row[
'cnt'];
12260 FROM tst_active tac 12261 INNER JOIN tst_sequence tseq 12262 ON tseq.active_fi = tac.active_id 12263 WHERE tac.test_fi = %s 12266 $partRes =
$ilDB->queryF(
12272 while ($row =
$ilDB->fetchAssoc($partRes)) {
12273 $sequence = @unserialize($row[
'sequence']);
12276 $sequence = array();
12279 $sequence = array_filter($sequence,
function ($value) use ($questCount) {
12280 return $value <= $questCount;
12283 $num_seq = count($sequence);
12284 if ($questCount > $num_seq) {
12285 $diff = $questCount - $num_seq;
12286 for (
$i = 1;
$i <= $diff;
$i++) {
12287 $sequence[$num_seq +
$i - 1] = $num_seq +
$i;
12291 $new_sequence = serialize($sequence);
12293 $ilDB->update(
'tst_sequence', array(
12294 'sequence' => array(
'clob', $new_sequence)
12296 'active_fi' => array(
'integer', $row[
'active_fi']),
12297 'pass' => array(
'integer', $row[
'pass'])
12301 $new_sequence = serialize($questCount > 0 ? range(1, $questCount) : array());
12305 FROM tst_active tac 12306 INNER JOIN tst_sequence tseq 12307 ON tseq.active_fi = tac.active_id 12308 WHERE tac.test_fi = %s 12311 $part_rest =
$ilDB->queryF(
12317 while ($row =
$ilDB->fetchAssoc($part_rest)) {
12318 $ilDB->update(
'tst_sequence', array(
12319 'sequence' => array(
'clob', $new_sequence)
12321 'active_fi' => array(
'integer', $row[
'active_fi']),
12322 '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.
isBlockPassesAfterPassedEnabled()
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
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.
logManualFeedback($active_id, $question_id, $feedback)
Creates a log for the manual feedback.
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 isManScoringDone($activeId)
reads the flag wether manscoring is done for the given test active or not from the global settings (s...
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
insertManualFeedback($active_id, $question_id, $pass, $feedback, $finalized, $feedback_old)
Inserts a manual feedback into the DB.
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()
saveManualFeedback($active_id, $question_id, $pass, $feedback, $finalized=false, $is_single_feedback=false)
Saves the manual feedback for a question in a test.
static _isPassed($user_id, $a_obj_id)
Returns TRUE if the user with the user id $user_id passed the test with the object id $a_obj_id...
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
getHtmlQuestionContentPurifier()
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.
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.
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 feedback comment for a question in a test if it is finalized.
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)
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)
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
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.
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.
$blockPassesAfterPassedEnabled
isQuestionSetConfigured()
setBlockPassesAfterPassedEnabled($blockPassesAfterPassedEnabled)
$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.
__construct(Container $dic, ilPlugin $plugin)
static getCompleteManualFeedback(int $question_id)
Retrieves the manual feedback for a question in a test.
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
static _getInstanceByType(string $type)
Factory method for creating purifier instances.
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
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
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
static getSingleManualFeedback($active_id, $question_id, $pass)
Retrieves the manual feedback for a question in a test.
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
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.