4 require_once
'./Modules/TestQuestionPool/classes/class.assQuestion.php';
5 require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
6 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjQuestionScoringAdjustable.php';
7 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjFileHandlingQuestionType.php';
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'),
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;
588 $max_filesize = sprintf(
"%d Bytes",
$size);
589 } elseif (
$size < 1024*1024) {
590 $max_filesize = sprintf(
"%.1f KB",
$size/1024);
592 $max_filesize = sprintf(
"%.1f MB",
$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);
616 $umf_parts=preg_split(
"/(\d+)([K|G|M])/", $umf, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
617 $pms_parts=preg_split(
"/(\d+)([K|G|M])/", $pms, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
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;
getPreviewFileUploadPathWeb($userId)
Returns the filesystem path for file uploads.
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
getId()
Gets the id of the assQuestion object.
getAllowedExtensions()
Get allowed file extensions.
savePreviewData(ilAssQuestionPreviewSession $previewSession)
static _getOriginalId($question_id)
Returns the original id of a question.
setSuggestedSolution($solution_id="", $subquestion_index=0, $is_import=false)
Sets a suggested solution for the question.
Class for file upload question exports.
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
setAllowedExtensions($a_value)
Set allowed file extensions.
forceExistingIntermediateSolution($activeId, $passIndex, $considerDummyRecordCreation)
deleteUploadedFiles($files, $test_id, $active_id, $authorized)
Delete uploaded files.
static getNumExistingSolutionRecords($activeId, $pass, $questionId)
returns the number of existing solution records for the given test active / pass and given question i...
__set($key, $value)
Object setter.
static virusHandling($a_file, $a_orig_name="", $a_clean=true)
scan file for viruses and clean files if possible
static _getParticipantId($active_id)
Get user id for active id.
hasFileUploads($test_id)
Checks if file uploads exist for a given test and the original id of the question.
getPoints()
Returns the maximum available points for the question.
reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
{}
getBestSolution($active_id, $pass)
Returns the best solution for a given pass of a participant.
$completion_by_submission
Abstract basic class which is to be extended by the concrete assessment question type classes...
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{}
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
intermediateSolutionExists($active_id, $pass)
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
deleteDummySolutionRecord($activeId, $passIndex)
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
getSolutionValues($active_id, $pass=null, $authorized=true)
Loads solutions of a given user from the database an returns it.
setId($id=-1)
Sets the id of the assQuestion object.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
Interface ilObjFileHandlingQuestionType.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second. ...
isComplete()
Returns true, if the question is complete for use.
getParticipantsSolution()
deletePreviewFileUploads($userId, $userSolution, $files)
fromXML(&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
Creates a question from a QTI file.
setNrOfTries($a_nr_of_tries)
const REUSE_FILES_TBL_POSTVAR
copyObject($target_questionpool_id, $title="")
Copies an assFileUpload object.
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
getFileUploadPathWeb($test_id, $active_id, $question_id=null)
Returns the file upload path for web accessible files of a question.
static _getObjectIDFromActiveID($active_id)
Returns the ILIAS test object id for a given active id.
isFileReuseHandlingRequired()
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...
Class for file upload questions.
getMaxSize()
Get max file size.
handleSubmission($active_id, $pass, $obligationsAnswered, $authorized)
This method is called after an user submitted one or more files.
getObjId()
Get the object id of the container object.
getAllowedExtensionsArray()
Get allowed file extensions.
static _getMaximumPoints($question_id)
Returns the maximum points, a learner can reach answering the question.
Class for file upload question imports.
Base Exception for all Exceptions relating to Modules/Test.
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assFileUpload.
saveToDb($original_id="")
Saves a assFileUpload object to a database.
setParticipantsSolution($participantSolution)
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
removeSolutionRecordById($solutionId)
static _getLogLanguage()
retrieve the log language for assessment logging
setAuthor($author="")
Sets the authors name of the assQuestion object.
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
const DELETE_FILES_TBL_POSTVAR
updateCurrentSolutionsAuthorization($activeId, $pass, $authorized, $keepTime=false)
deliverFileUploadZIPFile($test_id, $test_title)
Generates a ZIP file containing all file uploads for a given test and the original id of the question...
getUserSolutionPreferingIntermediate($active_id, $pass=null)
Get the user solution preferring the intermediate solution.
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
getMaxFilesizeAsString()
Return the maximum allowed file size as string.
checkUpload()
Check file upload.
calculateReachedPointsForSolution($userSolution)
getPreviewFileUploads(ilAssQuestionPreviewSession $previewSession)
getQuestionType()
Returns the question type of the question.
setMaxSize($a_value)
Set max file size.
removeIntermediateSolution($active_id, $pass)
Remove an intermediate soluton (overridden to remove unused fies)
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
static removeTrailingPathSeparators($path)
getUploadedFilesForWeb($active_id, $pass)
Returns the web accessible uploaded files for an active user in a given pass.
Create styles array
The data for the language used.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
setPoints($a_points)
Sets the maximum available points for the question.
saveQuestionDataToDb($original_id="")
buildTestPresentationConfig()
Get the test question configuration Overridden from parent to disable the form change detection Other...
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...
getPreviewFileUploadPath($userId)
Returns the filesystem path for file uploads.
getFileUploadPath($test_id, $active_id, $question_id=null)
Returns the filesystem path for file uploads.
getAnswerTableName()
Returns the name of the answer table in the database.
setQuestion($question="")
Sets the question string of the question object.
Interface ilObjQuestionScoringAdjustable.
removeCurrentSolution($active_id, $pass, $authorized=true)
ensureCurrentTestPass($active_id, $pass)
getTestPresentationConfig()
Get the test question configuration (initialised once)
setOriginalId($original_id)
getAdditionalTableName()
Returns the name of the additional question data table in the database.
loadFromDb($question_id)
Loads a assFileUpload object from a database.
getUploadedFiles($active_id, $pass=null, $authorized=true)
Returns the uploaded files for an active user in a given pass.
isFileDeletionSubmitAvailable()
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
__construct( $title="", $comment="", $author="", $owner=-1, $question="")
assFileUpload constructor
getMaxFilesizeInBytes()
Return the maximum allowed file size in bytes.
setCompletionBySubmission($bool)
Enabled/Disable completion by submission.
setTitle($title="")
Sets the title string of the assQuestion object.
setObjId($obj_id=0)
Set the object id of the container object.
setComment($comment="")
Sets the comment string of the assQuestion object.
__get($value)
Object getter.
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...
static getValidFilename($a_filename)
Get valid filename.
deleteAnswers($question_id)
Deletes datasets from answers tables.
static deliverFile( $a_file, $a_filename, $a_mime='', $isInline=false, $removeAfterDelivery=false, $a_exit_after=true)
deliver file for download via browser.
isNonEmptyItemListPostSubmission($postSubmissionFieldname)
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
isCompletionBySubmissionEnabled()
Checks whether completion by submission is enabled or not.
isAnswered($active_id, $pass=null)
returns boolean wether the question is answered during test pass or not
getSolutionRecordById($solutionId)
isFileReuseSubmitAvailable()