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