4require_once
'./Modules/TestQuestionPool/classes/class.assQuestion.php';
5require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
6require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjQuestionScoringAdjustable.php';
7require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjFileHandlingQuestionType.php';
91 array( $this->
getId() )
95 ) .
" (question_fi, maxsize, allowedextensions, compl_by_submission) VALUES (%s, %s, %s, %s)",
96 array(
"integer",
"float",
"text",
"integer" ),
121 $this->
setId($question_id);
132 include_once(
"./Services/RTE/classes/class.ilRTE.php");
144 parent::loadFromDb($question_id);
152 if ($this->
id <= 0) {
157 $this_id = $this->
getId();
161 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
165 if ((
int) $testObjId > 0) {
166 $clone->setObjId($testObjId);
187 $clone->copyPageOfQuestion($this_id);
189 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
191 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
201 if ($this->
id <= 0) {
207 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
210 $source_questionpool_id = $this->
getObjId();
211 $clone->setObjId($target_questionpool_id);
222 $clone->onCopy($source_questionpool_id,
$original_id, $clone->getObjId(), $clone->getId());
229 if ($this->
id <= 0) {
234 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
237 $sourceParentId = $this->
getObjId();
243 $clone->setObjId($targetParentId);
245 if ($targetQuestionTitle) {
246 $clone->setTitle($targetQuestionTitle);
251 $clone->copyPageOfQuestion($sourceQuestionId);
253 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
255 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
282 if ($returndetails) {
283 throw new ilTestException(
'return details not implemented for ' . __METHOD__);
288 if (is_null(
$pass)) {
311 $this->lng->loadLanguageModule(
"form");
313 $_FILES[
"upload"][
"name"] = rtrim($_FILES[
"upload"][
"name"],
'/');
316 $filename_arr = pathinfo($_FILES[
"upload"][
"name"]);
317 $suffix = $filename_arr[
"extension"];
318 $mimetype = $_FILES[
"upload"][
"type"];
319 $size_bytes = $_FILES[
"upload"][
"size"];
320 $temp_name = $_FILES[
"upload"][
"tmp_name"];
321 $error = $_FILES[
"upload"][
"error"];
331 case UPLOAD_ERR_INI_SIZE:
336 case UPLOAD_ERR_FORM_SIZE:
341 case UPLOAD_ERR_PARTIAL:
346 case UPLOAD_ERR_NO_FILE:
351 case UPLOAD_ERR_NO_TMP_DIR:
356 case UPLOAD_ERR_CANT_WRITE:
361 case UPLOAD_ERR_EXTENSION:
370 if (!strlen($suffix)) {
382 if (strlen($temp_name)) {
384 if ($vir[0] ==
false) {
385 ilUtil::sendFailure($this->lng->txt(
"form_msg_file_virus_found") .
"<br />" . $vir[1],
true);
397 if (is_null($question_id)) {
398 $question_id = $this->
getId();
400 return CLIENT_WEB_DIR .
"/assessment/tst_$test_id/$active_id/$question_id/files/";
408 return CLIENT_WEB_DIR .
"/assessment/qst_preview/$userId/{$this->getId()}/fileuploads/";
418 if (is_null($question_id)) {
419 $question_id = $this->
getId();
421 include_once
"./Services/Utilities/classes/class.ilUtil.php";
431 include_once
"./Services/Utilities/classes/class.ilUtil.php";
445 if (is_null(
$pass)) {
450 "SELECT * FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s AND authorized = %s AND value1 IS NOT NULL ORDER BY tstamp",
451 array(
"integer",
"integer",
"integer",
'integer'),
452 array($active_id, $this->
getId(),
$pass, (
int) $authorized)
458 array_push($found,
$data);
480 "SELECT test_fi FROM tst_active WHERE active_id = %s",
488 foreach ($found as $idx =>
$data) {
489 $found[$idx][
'webpath'] =
$path;
506 foreach (
$files as $solution_id) {
508 "SELECT * FROM tst_solutions WHERE solution_id = %s AND authorized = %s",
509 array(
"integer",
'integer'),
510 array($solution_id, (
int) $authorized)
515 $active_id =
$data[
'active_fi'];
519 foreach (
$files as $solution_id) {
520 $affectedRows =
$ilDB->manipulateF(
521 "DELETE FROM tst_solutions WHERE solution_id = %s AND authorized = %s",
522 array(
"integer",
'integer'),
523 array($solution_id, $authorized)
535 protected function deleteUnusedFiles(
$test_id, $active_id,
$pass)
540 $solutions = array_merge(
547 $used_files = array();
548 foreach ($solutions as $solution) {
549 $used_files[] = $solution[
'value1'];
555 if (is_dir($uploadPath) && is_readable($uploadPath)) {
556 $iter = new \RegexIterator(
new \DirectoryIterator($uploadPath),
'/^file_' . $active_id .
'_' .
$pass .
'_(.*)/');
557 foreach ($iter as
$file) {
559 if (
$file->isFile() && !in_array(
$file->getFilename(), $used_files)) {
560 unlink(
$file->getPathname());
570 if (isset($userSolution[
$name])) {
571 unset($userSolution[
$name]);
576 return $userSolution;
589 } elseif (
$size < 1024*1024) {
595 return $max_filesize;
609 $umf = get_cfg_var(
"upload_max_filesize");
611 $pms = get_cfg_var(
"post_max_size");
614 $multiplier_a=array(
"K"=>1024,
"M"=>1024*1024,
"G"=>1024*1024*1024);
619 if (count($umf_parts) == 2) {
620 $umf = $umf_parts[0]*$multiplier_a[$umf_parts[1]];
622 if (count($pms_parts) == 2) {
623 $pms = $pms_parts[0]*$multiplier_a[$pms_parts[1]];
627 $max_filesize = min($umf, $pms);
629 if (!$max_filesize) {
630 $max_filesize=max($umf, $pms);
632 return $max_filesize;
654 $entered_values =
false;
656 $this->
getProcessLocker()->executeUserSolutionUpdateLockOperation(
function () use (&$entered_values, $uploadHandlingRequired,
$test_id, $active_id,
$pass, $authorized) {
657 if ($authorized ==
false) {
663 foreach (
$_POST[self::DELETE_FILES_TBL_POSTVAR] as $solution_id) {
671 foreach (
$_POST[self::REUSE_FILES_TBL_POSTVAR] as $solutionId) {
685 if ($uploadHandlingRequired) {
690 $solutionFileVersioningUploadTS = time();
691 $filename_arr = pathinfo($_FILES[
"upload"][
"name"]);
692 $extension = $filename_arr[
"extension"];
693 $newfile =
"file_" . $active_id .
"_" .
$pass .
"_" . $solutionFileVersioningUploadTS .
"." . $extension;
695 include_once
'Services/Utilities/classes/class.ilFileUtils.php';
699 ilUtil::moveUploadedFile($_FILES[
"upload"][
"tmp_name"], $_FILES[
"upload"][
"name"], $this->
getFileUploadPath(
$test_id, $active_id) . $newfile);
707 $solutionFileVersioningUploadTS
710 $entered_values =
true;
726 if ($entered_values) {
727 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
732 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
753 if (!count($solution)) {
757 foreach ($solution as
$row) {
758 if (!empty(
$row[
'value1'])) {
762 $solution = $cleaned;
781 $result = parent::removeIntermediateSolution($active_id,
$pass);
799 if (!is_array($userSolution)) {
800 $userSolution = array();
823 $filename_arr = pathinfo($_FILES[
"upload"][
"name"]);
824 $extension = $filename_arr[
"extension"];
825 $newfile =
"file_" . md5($_FILES[
"upload"][
"name"]) .
"_" .
$version .
"." . $extension;
828 $userSolution[$newfile] = array(
829 'solution_id' => $newfile,
830 'value1' => $newfile,
831 'value2' => $_FILES[
'upload'][
'name'],
879 include_once
'Modules/Test/classes/class.ilObjTestAccess.php';
880 include_once
'Services/Tracking/classes/class.ilLPStatusWrapper.php';
895 return "assFileUpload";
905 return "qpl_qst_fileupload";
933 $text = parent::getRTETextWithMediaObjects();
946 foreach ($solutions as $solution) {
947 $worksheet->setCell($startrow +
$i, 0, $this->lng->txt(
"result"));
949 if (strlen($solution[
"value1"])) {
950 $worksheet->setCell($startrow +
$i, 1, $solution[
"value1"]);
951 $worksheet->setCell($startrow +
$i, 2, $solution[
"value2"]);
956 return $startrow +
$i + 1;
971 public function fromXML(&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
973 include_once
"./Modules/TestQuestionPool/classes/import/qti12/class.assFileUploadImport.php";
975 $import->fromXML($item, $questionpool_id, $tst_id, $tst_object, $question_counter, $import_mapping);
984 public function toXML($a_include_header =
true, $a_include_binary =
true, $a_shuffle =
false, $test_output =
false, $force_image_references =
false)
986 include_once
"./Modules/TestQuestionPool/classes/export/qti12/class.assFileUploadExport.php";
988 return $export->toXML($a_include_header, $a_include_binary, $a_shuffle, $test_output, $force_image_references);
998 $user_solution = array();
999 return $user_solution;
1019 $this->maxsize = $a_value;
1029 if (strlen($this->allowedextensions)) {
1030 return array_filter(array_map(
'trim', explode(
",", $this->allowedextensions)));
1052 $this->allowedextensions = strtolower(trim($a_value));
1064 case "allowedextensions":
1067 case 'completion_by_submission':
1071 return parent::__get($value);
1085 case "allowedextensions":
1088 case 'completion_by_submission':
1092 parent::__set(
$key, $value);
1108 SELECT tst_solutions.solution_id
1109 FROM tst_solutions, tst_active, qpl_questions
1110 WHERE tst_solutions.active_fi = tst_active.active_id
1111 AND tst_solutions.question_fi = qpl_questions.question_id
1112 AND tst_solutions.question_fi = %s AND tst_active.test_fi = %s";
1115 array(
"integer",
"integer"),
1134 require_once
'Modules/TestQuestionPool/classes/class.ilAssFileUploadUploadsExporter.php';
1138 $exporter->setTestTitle($test_title);
1139 $exporter->setQuestion($this);
1144 $exporter->getFinalZipFilePath(),
1145 $exporter->getDispoZipFileName(),
1146 $exporter->getZipFileMimeType(),
1176 $this->completion_by_submission = (bool) $bool;
1195 return $numExistingSolutionRecords > 0;
1230 return parent::buildTestPresentationConfig()
1232 ->setFormChangeDetectionEnabled(
false);
1242 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssFileUploadFileTableDeleteButton.php';
1283 if (!isset($_FILES[
'upload'])) {
1287 if (!isset($_FILES[
'upload'][
'tmp_name'])) {
1291 return strlen($_FILES[
'upload'][
'tmp_name']) > 0;
sprintf('%.4f', $callTime)
An exception for terminatinating execution or to throw for unit testing.
Class for file upload question exports.
Class for file upload question imports.
Class for file upload questions.
fromXML(&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
Creates a question from a QTI file.
__set($key, $value)
Object setter.
isCompletionBySubmissionEnabled()
Checks whether completion by submission is enabled or not.
deleteAnswers($question_id)
Deletes datasets from answers tables.
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
setMaxSize($a_value)
Set max file size.
getUserSolutionPreferingIntermediate($active_id, $pass=null)
Get the user solution preferring the intermediate solution.
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
hasFileUploads($test_id)
Checks if file uploads exist for a given test and the original id of the question.
deleteUploadedFiles($files, $test_id, $active_id, $authorized)
Delete uploaded files.
$completion_by_submission
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
getPreviewFileUploadPathWeb($userId)
Returns the filesystem path for file uploads.
getFileUploadPathWeb($test_id, $active_id, $question_id=null)
Returns the file upload path for web accessible files of a question.
deletePreviewFileUploads($userId, $userSolution, $files)
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assFileUpload.
saveToDb($original_id="")
Saves a assFileUpload object to a database.
getUploadedFiles($active_id, $pass=null, $authorized=true)
Returns the uploaded files for an active user in a given pass.
copyObject($target_questionpool_id, $title="")
Copies an assFileUpload object.
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
removeIntermediateSolution($active_id, $pass)
Remove an intermediate soluton (overridden to remove unused fies)
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
calculateReachedPointsForSolution($userSolution)
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{Creates an Excel worksheet for the detailed cumulated results of this question.object}
reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
{Reworks the allready saved working data if neccessary.}
const REUSE_FILES_TBL_POSTVAR
isFileDeletionSubmitAvailable()
handleSubmission($active_id, $pass, $obligationsAnswered, $authorized)
This method is called after an user submitted one or more files.
getBestSolution($active_id, $pass)
Returns the best solution for a given pass of a participant.
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
getPreviewFileUploadPath($userId)
Returns the filesystem path for file uploads.
isComplete()
Returns true, if the question is complete for use.
getAllowedExtensions()
Get allowed file extensions.
getMaxSize()
Get max file size.
getMaxFilesizeAsString()
Return the maximum allowed file size as string.
setAllowedExtensions($a_value)
Set allowed file extensions.
getAnswerTableName()
Returns the name of the answer table in the database.
isAnswered($active_id, $pass=null)
returns boolean wether the question is answered during test pass or not
setCompletionBySubmission($bool)
Enabled/Disable completion by submission.
__construct( $title="", $comment="", $author="", $owner=-1, $question="")
assFileUpload constructor
isFileReuseSubmitAvailable()
getFileUploadPath($test_id, $active_id, $question_id=null)
Returns the filesystem path for file uploads.
toXML($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
Returns a QTI xml representation of the question and sets the internal domxml variable with the DOM X...
isFileReuseHandlingRequired()
savePreviewData(ilAssQuestionPreviewSession $previewSession)
loadFromDb($question_id)
Loads a assFileUpload object from a database.
deliverFileUploadZIPFile($test_id, $test_title)
Generates a ZIP file containing all file uploads for a given test and the original id of the question...
getPreviewFileUploads(ilAssQuestionPreviewSession $previewSession)
__get($value)
Object getter.
getAllowedExtensionsArray()
Get allowed file extensions.
getQuestionType()
Returns the question type of the question.
getUploadedFilesForWeb($active_id, $pass)
Returns the web accessible uploaded files for an active user in a given pass.
getMaxFilesizeInBytes()
Return the maximum allowed file size in bytes.
checkUpload()
Check file upload.
const DELETE_FILES_TBL_POSTVAR
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
buildTestPresentationConfig()
Get the test question configuration Overridden from parent to disable the form change detection Other...
getAdditionalTableName()
Returns the name of the additional question data table in the database.
Abstract basic class which is to be extended by the concrete assessment question type classes.
isNonEmptyItemListPostSubmission($postSubmissionFieldname)
getSolutionValues($active_id, $pass=null, $authorized=true)
Loads solutions of a given user from the database an returns it.
static _getOriginalId($question_id)
Returns the original id of a question.
setId($id=-1)
Sets the id of the assQuestion object.
setOriginalId($original_id)
setObjId($obj_id=0)
Set the object id of the container object.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
setSuggestedSolution($solution_id="", $subquestion_index=0, $is_import=false)
Sets a suggested solution for the question.
static _getMaximumPoints($question_id)
Returns the maximum points, a learner can reach answering the question.
saveQuestionDataToDb($original_id="")
deleteDummySolutionRecord($activeId, $passIndex)
getId()
Gets the id of the assQuestion object.
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
getObjId()
Get the object id of the container object.
setTitle($title="")
Sets the title string of the assQuestion object.
getSolutionRecordById($solutionId)
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second.
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
removeCurrentSolution($active_id, $pass, $authorized=true)
removeSolutionRecordById($solutionId)
static getNumExistingSolutionRecords($activeId, $pass, $questionId)
returns the number of existing solution records for the given test active / pass and given question i...
setAuthor($author="")
Sets the authors name of the assQuestion object.
getPoints()
Returns the maximum available points for the question.
ensureCurrentTestPass($active_id, $pass)
intermediateSolutionExists($active_id, $pass)
getTestPresentationConfig()
Get the test question configuration (initialised once)
forceExistingIntermediateSolution($activeId, $passIndex, $considerDummyRecordCreation)
static _setReachedPoints($active_id, $question_id, $points, $maxpoints, $pass, $manualscoring, $obligationsEnabled)
Sets the points, a learner has reached answering the question Additionally objective results are upda...
updateCurrentSolutionsAuthorization($activeId, $pass, $authorized, $keepTime=false)
setPoints($a_points)
Sets the maximum available points for the question.
setComment($comment="")
Sets the comment string of the assQuestion object.
setNrOfTries($a_nr_of_tries)
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
setQuestion($question="")
Sets the question string of the question object.
getParticipantsSolution()
setParticipantsSolution($participantSolution)
static getValidFilename($a_filename)
Get valid filename.
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _getLogLanguage()
retrieve the log language for assessment logging
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
static _getParticipantId($active_id)
Get user id for active id.
static _getObjectIDFromActiveID($active_id)
Returns the ILIAS test object id for a given active id.
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...
Base Exception for all Exceptions relating to Modules/Test.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static virusHandling($a_file, $a_orig_name="", $a_clean=true)
scan file for viruses and clean files if possible
static deliverFile( $a_file, $a_filename, $a_mime='', $isInline=false, $removeAfterDelivery=false, $a_exit_after=true)
deliver file for download via browser.
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
static removeTrailingPathSeparators($path)
Interface ilObjFileHandlingQuestionType.
Interface ilObjQuestionScoringAdjustable.
if(!file_exists("$old.txt")) if( $old===$new) if(file_exists("$new.txt")) $file
echo;exit;}function LogoutNotification($SessionID){ global $ilDB;$q="SELECT session_id, data FROM usr_session WHERE expires > (\w+)\|/" PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE