ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
assFileUpload Class Reference

Class for file upload questions. More...

+ Inheritance diagram for assFileUpload:
+ Collaboration diagram for assFileUpload:

Public Member Functions

 isComplete ()
 Returns true, if the question is complete for use. More...
 
 saveToDb ($original_id='')
 Saves a assFileUpload object to a database. More...
 
 saveAdditionalQuestionDataToDb ()
 Saves a record to the question types additional data table. More...
 
 loadFromDb ($question_id)
 Loads a assFileUpload object from a database. More...
 
 duplicate (bool $for_test=true, string $title='', string $author='', int $owner=-1, $testObjId=null)
 Duplicates an assFileUpload. More...
 
 copyObject ($target_questionpool_id, $title='')
 Copies an assFileUpload object. More...
 
 createNewOriginalFromThisDuplicate ($targetParentId, $targetQuestionTitle='')
 
 getMaximumPoints ()
 Returns the maximum points, a learner can reach answering the question. More...
 
 calculateReachedPoints ($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
 Returns the points, a learner has reached answering the question. More...
 
 checkUpload ()
 Check file upload. More...
 
 getFileUploadPath ($test_id, $active_id, $question_id=null)
 Returns the filesystem path for file uploads. More...
 
 getFileUploadPathWeb ($test_id, $active_id, $question_id=null)
 Returns the file upload path for web accessible files of a question. More...
 
 getUploadedFiles ($active_id, $pass=null, $authorized=true)
 Returns the uploaded files for an active user in a given pass. More...
 
 getPreviewFileUploads (ilAssQuestionPreviewSession $previewSession)
 
 getUploadedFilesForWeb ($active_id, $pass)
 Returns the web accessible uploaded files for an active user in a given pass. More...
 
 getMaxFilesizeAsString ()
 
 determineMaxFilesize ()
 
 saveWorkingData ($active_id, $pass=null, $authorized=true)
 public More...
 
 getUserSolutionPreferingIntermediate ($active_id, $pass=null)
 
 removeIntermediateSolution (int $active_id, int $pass)
 
 getQuestionType ()
 
 getAdditionalTableName ()
 
 getAnswerTableName ()
 
 deleteAnswers ($question_id)
 
 getRTETextWithMediaObjects ()
 Collects all text in the question which could contain media objects which were created with the Rich Text Editor. More...
 
 setExportDetailsXLSX (ilAssExcelFormatHelper $worksheet, int $startrow, int $col, int $active_id, int $pass)
 {} More...
 
 fromXML ($item, int $questionpool_id, ?int $tst_id, &$tst_object, int &$question_counter, array $import_mapping, array &$solutionhints=[])
 Creates a question from a QTI file. More...
 
 toXML ($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
 
 getBestSolution ($active_id, $pass)
 
 getMaxSize ()
 
 setMaxSize (?int $value)
 
 getAllowedExtensionsArray ()
 
 getAllowedExtensions ()
 
 setAllowedExtensions (string $a_value)
 
 hasFileUploads (int $test_id)
 
 deliverFileUploadZIPFile (int $ref_id, int $test_id, string $test_title)
 
 isCompletionBySubmissionEnabled ()
 
 setCompletionBySubmission (bool $bool)
 
 buildTestPresentationConfig ()
 
- Public Member Functions inherited from assQuestion
 __construct (string $title="", string $comment="", string $author="", int $owner=-1, string $question="")
 assQuestion constructor More...
 
 getShuffler ()
 
 setShuffler (Transformation $shuffler)
 
 setProcessLocker (ilAssQuestionProcessLocker $processLocker)
 
 getProcessLocker ()
 
 fromXML ($item, int $questionpool_id, ?int $tst_id, &$tst_object, int &$question_counter, array $import_mapping, array &$solutionhints=[])
 Receives parameters from a QTI parser and creates a valid ILIAS question object. More...
 
 toXML (bool $a_include_header=true, bool $a_include_binary=true, bool $a_shuffle=false, bool $test_output=false, bool $force_image_references=false)
 Returns a QTI xml representation of the question. More...
 
 isComplete ()
 Returns true, if a question is complete for use. More...
 
 setTitle (string $title="")
 
 setId (int $id=-1)
 
 setTestId (int $id=-1)
 
 setComment (string $comment="")
 
 setShuffle (?bool $shuffle=true)
 
 setAuthor (string $author="")
 
 setOwner (int $owner=-1)
 
 getTitle ()
 
 getTitleForHTMLOutput ()
 
 getTitleFilenameCompliant ()
 
 getId ()
 
 getShuffle ()
 
 getTestId ()
 
 getComment ()
 
 getDescriptionForHTMLOutput ()
 
 getThumbSize ()
 
 setThumbSize (int $a_size)
 
 getMinimumThumbSize ()
 
 getMaximumThumbSize ()
 
 getAuthor ()
 
 getAuthorForHTMLOutput ()
 
 getOwner ()
 
 getObjId ()
 
 setObjId (int $obj_id=0)
 
 getLifecycle ()
 
 setLifecycle (ilAssQuestionLifecycle $lifecycle)
 
 setExternalId (?string $external_id)
 
 getExternalId ()
 
 getSuggestedSolutionOutput ()
 
 getSuggestedSolutions ()
 
 getReachedPoints (int $active_id, int $pass)
 
 getMaximumPoints ()
 
 getAdjustedReachedPoints (int $active_id, int $pass, bool $authorizedSolution=true)
 returns the reached points ... More...
 
 calculateResultsFromSolution (int $active_id, int $pass, bool $obligationsEnabled=false)
 Calculates the question results from a previously saved question solution. More...
 
 persistWorkingState (int $active_id, $pass, bool $obligationsEnabled=false, bool $authorized=true)
 persists the working state for current testactive and testpass More...
 
 persistPreviewState (ilAssQuestionPreviewSession $previewSession)
 persists the preview state for current user and question More...
 
 validateSolutionSubmit ()
 
 saveWorkingData (int $active_id, int $pass, bool $authorized=true)
 Saves the learners input of the question to the database. More...
 
 getSuggestedSolutionPath ()
 
 getImagePath ($question_id=null, $object_id=null)
 Returns the image path for web accessable images of a question. More...
 
 getSuggestedSolutionPathWeb ()
 
 getImagePathWeb ()
 Returns the web image path for web accessable images of a question. More...
 
 getTestOutputSolutions (int $activeId, int $pass)
 
 getUserSolutionPreferingIntermediate (int $active_id, $pass=null)
 
 getSolutionValues ($active_id, $pass=null, bool $authorized=true)
 Loads solutions of a given user from the database an returns it. More...
 
 getAdditionalTableName ()
 
 getAnswerTableName ()
 
 deleteAnswers (int $question_id)
 
 deleteAdditionalTableData (int $question_id)
 
 delete (int $question_id)
 
 getTotalAnswers ()
 
 copyXHTMLMediaObjectsOfQuestion (int $a_q_id)
 
 syncXHTMLMediaObjectsOfQuestion ()
 
 createPageObject ()
 
 copyPageOfQuestion (int $a_q_id)
 
 getPageOfQuestion ()
 
 setOriginalId (?int $original_id)
 
 getOriginalId ()
 
 fixSvgToPng (string $imageFilenameContainingString)
 
 fixUnavailableSkinImageSources (string $html)
 
 loadFromDb (int $question_id)
 
 createNewQuestion (bool $a_create_page=true)
 Creates a new question without an owner when a new question is created This assures that an ID is given to the question if a file upload or something else occurs. More...
 
 saveQuestionDataToDb (int $original_id=-1)
 
 saveToDb ()
 
 deleteSuggestedSolutions ()
 
 getSuggestedSolution (int $subquestion_index=0)
 
 resolveInternalLink (string $internal_link)
 
 resolveSuggestedSolutionLinks ()
 
 syncWithOriginal ()
 
 getPoints ()
 
 setPoints (float $points)
 
 getSolutionMaxPass (int $active_id)
 
 calculateReachedPoints ($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
 Returns the points, a learner has reached answering the question. More...
 
 deductHintPointsFromReachedPoints (ilAssQuestionPreviewSession $previewSession, $reachedPoints)
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $previewSession)
 
 isPreviewSolutionCorrect (ilAssQuestionPreviewSession $previewSession)
 
 adjustReachedPointsByScoringOptions ($points, $active_id, $pass=null)
 Adjust the given reached points by checks for all special scoring options in the test container. More...
 
 buildHashedImageFilename (string $plain_image_filename, bool $unique=false)
 
 getQuestion ()
 
 getQuestionForHTMLOutput ()
 
 setQuestion (string $question="")
 
 getQuestionType ()
 Returns the question type of the question. More...
 
 getQuestionTypeID ()
 
 syncHints ()
 
 cleanupMediaObjectUsage ()
 
 getInstances ()
 
 getActiveUserData (int $active_id)
 Returns the user id and the test id for a given active id. More...
 
 hasSpecificFeedback ()
 
 setExportDetailsXLSX (ilAssExcelFormatHelper $worksheet, int $startrow, int $col, int $active_id, int $pass)
 
 getNrOfTries ()
 
 setNrOfTries (int $a_nr_of_tries)
 
 setExportImagePath (string $path)
 
 formatSAQuestion ($a_q)
 
 setPreventRteUsage (bool $prevent_rte_usage)
 
 getPreventRteUsage ()
 
 migrateContentForLearningModule (ilAssSelfAssessmentMigrator $migrator)
 
 setSelfAssessmentEditingMode (bool $selfassessmenteditingmode)
 
 getSelfAssessmentEditingMode ()
 
 setDefaultNrOfTries (int $defaultnroftries)
 
 getDefaultNrOfTries ()
 
 syncSkillAssignments (int $srcParentId, int $srcQuestionId, int $trgParentId, int $trgQuestionId)
 
 ensureHintPageObjectExists ($pageObjectId)
 
 isAnswered (int $active_id, int $pass)
 
 getAdditionalContentEditingMode ()
 
 setAdditionalContentEditingMode (?string $additionalContentEditingMode)
 
 isAdditionalContentEditingModePageObject ()
 
 isValidAdditionalContentEditingMode (string $additionalContentEditingMode)
 
 getValidAdditionalContentEditingModes ()
 
 getHtmlUserSolutionPurifier ()
 
 getHtmlQuestionContentPurifier ()
 
 setLastChange ($lastChange)
 
 getLastChange ()
 
 removeIntermediateSolution (int $active_id, int $pass)
 
 removeCurrentSolution (int $active_id, int $pass, bool $authorized=true)
 
 saveCurrentSolution (int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
 
 updateCurrentSolution (int $solutionId, $value1, $value2, bool $authorized=true)
 
 updateCurrentSolutionsAuthorization (int $activeId, int $pass, bool $authorized, bool $keepTime=false)
 
 setStep ($step)
 
 getStep ()
 
 toJSON ()
 
 duplicate (bool $for_test=true, string $title="", string $author="", int $owner=-1, $testObjId=null)
 
 intermediateSolutionExists (int $active_id, int $pass)
 
 authorizedSolutionExists (int $active_id, ?int $pass)
 
 authorizedOrIntermediateSolutionExists (int $active_id, int $pass)
 
 lookupForExistingSolutions (int $activeId, int $pass)
 Lookup if an authorized or intermediate solution exists. More...
 
 isAddableAnswerOptionValue (int $qIndex, string $answerOptionValue)
 
 addAnswerOptionValue (int $qIndex, string $answerOptionValue, float $points)
 
 removeAllExistingSolutions ()
 
 removeExistingSolutions (int $activeId, int $pass)
 
 resetUsersAnswer (int $activeId, int $pass)
 
 removeResultRecord (int $activeId, int $pass)
 
 fetchValuePairsFromIndexedValues (array $indexedValues)
 
 fetchIndexedValuesFromValuePairs (array $valuePairs)
 
 areObligationsToBeConsidered ()
 
 setObligationsToBeConsidered (bool $obligationsToBeConsidered)
 
 updateTimestamp ()
 
 getTestPresentationConfig ()
 
- Public Member Functions inherited from ilObjFileHandlingQuestionType
 getFileUploadPath (int $test_id, int $active_id, int $question_id=null)
 

Static Public Member Functions

static isObligationPossible (int $question_id)
 
- Static Public Member Functions inherited from assQuestion
static setForcePassResultUpdateEnabled (bool $forcePassResultsUpdateEnabled)
 
static isForcePassResultUpdateEnabled ()
 
static _getSuggestedSolutionOutput (int $question_id)
 
static _getReachedPoints (int $active_id, int $question_id, int $pass)
 
static logAction (string $logtext, int $active_id, int $question_id)
 
static isFileAvailable (string $file)
 
static saveOriginalId (int $questionId, int $originalId)
 
static resetOriginalId (int $questionId)
 
static _getInternalLinkHref (string $target="")
 
static instantiateQuestion (int $question_id)
 
static _getSolutionMaxPass (int $question_id, int $active_id)
 Returns the maximum pass a users question solution. More...
 
static _isWriteable (int $question_id, int $user_id)
 
static _setReachedPoints (int $active_id, int $question_id, float $points, float $maxpoints, int $pass, bool $manualscoring, bool $obligationsEnabled, ?int $test_id=null)
 Sets the points, a learner has reached answering the question Additionally objective results are updated. More...
 
static _needsManualScoring (int $question_id)
 
static getFeedbackClassNameByQuestionType (string $questionType)
 
static instantiateQuestionGUI (int $a_question_id)
 
static _questionExistsInTest (int $question_id, int $test_id)
 
static lookupParentObjId (int $questionId)
 
static isObligationPossible (int $questionId)
 
static implodeKeyValues (array $keyValues)
 
static explodeKeyValues (string $keyValues)
 
static convertISO8601FormatH_i_s_ExtendedToSeconds (string $time)
 
static extendedTrim (string $value)
 Trim non-printable characters from the beginning and end of a string. More...
 

Data Fields

const REUSE_FILES_TBL_POSTVAR = 'reusefiles'
 
const DELETE_FILES_TBL_POSTVAR = 'deletefiles'
 
- Data Fields inherited from assQuestion
const TRIM_PATTERN = '/^[\p{C}\p{Z}]+|[\p{C}\p{Z}]+$/u'
 
const ADDITIONAL_CONTENT_EDITING_MODE_RTE = 'default'
 
const ADDITIONAL_CONTENT_EDITING_MODE_IPE = 'pageobject'
 
ilAssQuestionFeedback $feedbackOBJ
 
bool $prevent_rte_usage = false
 
bool $selfassessmenteditingmode = false
 
int $defaultnroftries = 0
 
string $questionActionCmd = 'handleQuestionAction'
 
const KEY_VALUES_IMPLOSION_SEPARATOR = ':'
 

Protected Member Functions

 calculateReachedPointsForSolution ($userSolution)
 
 getPreviewFileUploadPath ($userId)
 Returns the filesystem path for file uploads. More...
 
 getPreviewFileUploadPathWeb ($userId)
 Returns the filesystem path for file uploads. More...
 
 deletePreviewFileUploads ($userId, $userSolution, $files)
 
 getMaxFilesizeInBytes ()
 
 resolveRIDStoDelete ()
 
 removeSolutionRecordById (int $solution_id)
 
 savePreviewData (ilAssQuestionPreviewSession $previewSession)
 
 handleSubmission (int $active_id, int $pass, bool $obligations_answered, bool $authorized)
 
 isFileDeletionAction ()
 
 isFileDeletionSubmitAvailable ()
 
 isFileReuseSubmitAvailable ()
 
 isFileReuseHandlingRequired ()
 
 isFileUploadAvailable ()
 
- Protected Member Functions inherited from assQuestion
 getQuestionAction ()
 
 isNonEmptyItemListPostSubmission (string $postSubmissionFieldname)
 
 log (int $active_id, string $langVar)
 
 savePreviewData (ilAssQuestionPreviewSession $previewSession)
 
 deletePageOfQuestion (int $question_id)
 
 onDuplicate (int $originalParentId, int $originalQuestionId, int $duplicateParentId, int $duplicateQuestionId)
 
 beforeSyncWithOriginal (int $origQuestionId, int $dupQuestionId, int $origParentObjId, int $dupParentObjId)
 
 afterSyncWithOriginal (int $origQuestionId, int $dupQuestionId, int $origParentObjId, int $dupParentObjId)
 
 onCopy (int $sourceParentId, int $sourceQuestionId, int $targetParentId, int $targetQuestionId)
 
 duplicateComments (int $parent_source_id, int $source_id, int $parent_target_id, int $target_id)
 
 deleteComments ()
 
 getNotesManager ()
 
 getNotesDataService ()
 
 getNotesRepo ()
 
 syncSuggestedSolutions (int $target_question_id, int $target_obj_id)
 
 duplicateSuggestedSolutionFiles (int $parent_id, int $question_id)
 Duplicates the files of a suggested solution if the question is duplicated. More...
 
 syncSuggestedSolutionFiles (int $target_question_id, int $target_obj_id)
 
 copySuggestedSolutionFiles (int $source_questionpool_id, int $source_question_id)
 
 copySuggestedSolutions (int $target_question_id)
 
 ensureNonNegativePoints ($points)
 
 purifyAndPrepareTextAreaOutput (string $content)
 
 getRTETextWithMediaObjects ()
 
 getSelfAssessmentFormatter ()
 
 lmMigrateQuestionTypeGenericContent (ilAssSelfAssessmentMigrator $migrator)
 
 lmMigrateQuestionTypeSpecificContent (ilAssSelfAssessmentMigrator $migrator)
 
 duplicateQuestionHints (int $originalQuestionId, int $duplicateQuestionId)
 
 duplicateSkillAssignments (int $srcParentId, int $srcQuestionId, int $trgParentId, int $trgQuestionId)
 
 buildQuestionDataQuery ()
 
 getCurrentSolutionResultSet (int $active_id, int $pass, bool $authorized=true)
 
 removeSolutionRecordById (int $solutionId)
 
 getSolutionRecordById (int $solutionId)
 
 deleteDummySolutionRecord (int $activeId, int $passIndex)
 
 isDummySolutionRecord (array $solutionRecord)
 
 deleteSolutionRecordByValues (int $activeId, int $passIndex, bool $authorized, array $matchValues)
 
 duplicateIntermediateSolutionAuthorized (int $activeId, int $passIndex)
 
 forceExistingIntermediateSolution (int $activeId, int $passIndex, bool $considerDummyRecordCreation)
 
 lookupMaxStep (int $active_id, int $pass)
 
 buildTestPresentationConfig ()
 build basic test question configuration instance More...
 
 getSuggestedSolutionsRepo ()
 
 loadSuggestedSolutions ()
 

Protected Attributes

const HAS_SPECIFIC_FEEDBACK = false
 
int $maxsize = null
 
string $allowedextensions = ''
 
 $completion_by_submission = false
 
- Protected Attributes inherited from assQuestion
const HAS_SPECIFIC_FEEDBACK = true
 
ILIAS TestQuestionPool QuestionInfoService $questioninfo
 
ILIAS Test TestParticipantInfoService $testParticipantInfo
 
ILIAS HTTP Services $http
 
ILIAS Refinery Factory $refinery
 
ILIAS TestQuestionPool QuestionFilesService $questionFilesService
 
ILIAS DI LoggingServices $ilLog
 
int $id
 
string $title
 
string $comment
 
string $owner
 
string $author
 
int $thumb_size
 
string $question
 The question text. More...
 
float $points
 The maximum available points for the question. More...
 
bool $shuffle
 Indicates whether the answers will be shuffled or not. More...
 
int $test_id
 The database id of a test in which the question is contained. More...
 
int $obj_id = 0
 Object id of the container object. More...
 
 $ilias
 
ilGlobalPageTemplate $tpl
 
ilLanguage $lng
 
ilDBInterface $db
 
Container $dic
 
array $suggested_solutions
 
int $original_id = null
 
 $page
 
string $external_id = null
 
ilAssQuestionProcessLocker $processLocker
 
 $step
 
 $lastChange
 
Transformation $shuffler
 
ilTestQuestionConfig $testQuestionConfig
 
ilAssQuestionLifecycle $lifecycle
 
ilObjUser $current_user
 
SkillUsageService $skillUsageService
 
assQuestionSuggestedSolutionsDatabaseRepository $suggestedsolution_repo = null
 

Private Attributes

ILIAS ResourceStorage Services $irss
 
ILIAS FileDelivery Services $file_delivery
 
ILIAS FileUpload FileUpload $file_upload
 
string $current_cmd
 

Additional Inherited Members

- Static Protected Member Functions inherited from assQuestion
static getNumExistingSolutionRecords (int $activeId, int $pass, int $questionId)
 
- Static Protected Attributes inherited from assQuestion
static $forcePassResultsUpdateEnabled = false
 
static $imageSourceFixReplaceMap
 

Detailed Description

Class for file upload questions.

Author
Helmut Schottmüller helmu.nosp@m.t.sc.nosp@m.hottm.nosp@m.uell.nosp@m.er@ma.nosp@m.c.co.nosp@m.m
Björn Heyser bheys.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Maximilian Becker mbeck.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Version
$Id$

Definition at line 35 of file class.assFileUpload.php.

Member Function Documentation

◆ buildTestPresentationConfig()

assFileUpload::buildTestPresentationConfig ( )

Definition at line 1114 of file class.assFileUpload.php.

References ilTestQuestionConfig\setFormChangeDetectionEnabled().

1115  {
1116  return parent::buildTestPresentationConfig()
1118  }
setFormChangeDetectionEnabled($enableFormChangeDetection)
Set if the detection of form changes is enabled.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
+ Here is the call graph for this function:

◆ calculateReachedPoints()

assFileUpload::calculateReachedPoints (   $active_id,
  $pass = null,
  $authorizedSolution = true,
  $returndetails = false 
)

Returns the points, a learner has reached answering the question.

The points are calculated from the given answers.

public

Parameters
integer$active_id
integer$pass
boolean$returndetails(deprecated !!)
Returns
integer/array $points/$details (array $details is deprecated !!)

Definition at line 320 of file class.assFileUpload.php.

References $data, $DIC, assQuestion\getCurrentSolutionResultSet(), assQuestion\getPoints(), assQuestion\getSolutionMaxPass(), isCompletionBySubmissionEnabled(), and assQuestion\isDummySolutionRecord().

320  : float
321  {
322  if ($returndetails) {
323  throw new ilTestException('return details not implemented for ' . __METHOD__);
324  }
325 
326  if ($this->isCompletionBySubmissionEnabled()) {
327  if (is_null($pass)) {
328  $pass = $this->getSolutionMaxPass($active_id);
329  }
330 
331  global $DIC;
332 
333  $result = $this->getCurrentSolutionResultSet($active_id, $pass, $authorizedSolution);
334 
335  while ($data = $DIC->database()->fetchAssoc($result)) {
336  if ($this->isDummySolutionRecord($data)) {
337  continue;
338  }
339 
340  return $this->getPoints();
341  }
342  }
343 
344  return 0.0;
345  }
isDummySolutionRecord(array $solutionRecord)
Base Exception for all Exceptions relating to Modules/Test.
global $DIC
Definition: feed.php:28
getSolutionMaxPass(int $active_id)
getCurrentSolutionResultSet(int $active_id, int $pass, bool $authorized=true)
+ Here is the call graph for this function:

◆ calculateReachedPointsForSolution()

assFileUpload::calculateReachedPointsForSolution (   $userSolution)
protected

Definition at line 347 of file class.assFileUpload.php.

References assQuestion\getPoints(), and isCompletionBySubmissionEnabled().

348  {
349  if ($this->isCompletionBySubmissionEnabled() &&
350  is_array($userSolution) &&
351  count($userSolution)) {
352  return $this->getPoints();
353  }
354 
355  return 0;
356  }
+ Here is the call graph for this function:

◆ checkUpload()

assFileUpload::checkUpload ( )

Check file upload.

Returns
boolean Input ok, true/false

Definition at line 363 of file class.assFileUpload.php.

References getAllowedExtensionsArray(), getMaxFilesizeInBytes(), and ILIAS\Repository\lng().

Referenced by savePreviewData(), and saveWorkingData().

363  : bool
364  {
365  $this->lng->loadLanguageModule('form');
366 
367  foreach (
368  $this->file_upload->getResults() as $upload_result
369  ) { // only one supported at the moment, but we check all
370  if (!$upload_result->isOK()) {
371  $this->tpl->setOnScreenMessage('failure', $upload_result->getStatus()->getMessage(), true);
372  return false;
373  }
374 
375  // check file size
376  $size_bytes = $upload_result->getSize();
377  if ($size_bytes > $this->getMaxFilesizeInBytes()) {
378  $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_msg_file_size_exceeds'), true);
379  return false;
380  }
381 
382  // check suffixes
383  if (count($this->getAllowedExtensionsArray())) {
384  $filename_arr = pathinfo($upload_result->getName());
385  $suffix = $filename_arr['extension'] ?? '';
386  $mimetype = $upload_result->getMimeType();
387  if ($suffix === '') {
388  $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_msg_file_missing_file_ext'), true);
389  return false;
390  }
391 
392  if (!in_array(strtolower($suffix), $this->getAllowedExtensionsArray(), true)) {
393  $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_msg_file_wrong_file_type'), true);
394  return false;
395  }
396  }
397  // virus handling already done in upload-service
398  }
399  return true;
400  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ copyObject()

assFileUpload::copyObject (   $target_questionpool_id,
  $title = '' 
)

Copies an assFileUpload object.

Definition at line 244 of file class.assFileUpload.php.

References assQuestion\$original_id, assQuestion\$title, assQuestion\getId(), and assQuestion\getObjId().

244  : int
245  {
246  if ($this->getId() <= 0) {
247  throw new RuntimeException('The question has not been saved. It cannot be duplicated');
248  }
249  // duplicate the question in database
250  $clone = $this;
251  $original_id = $this->questioninfo->getOriginalId($this->id);
252  $clone->id = -1;
253  $source_questionpool_id = $this->getObjId();
254  $clone->setObjId($target_questionpool_id);
255  if ($title) {
256  $clone->setTitle($title);
257  }
258  $clone->saveToDb();
259 
260  // copy question page content
261  $clone->copyPageOfQuestion($original_id);
262  // copy XHTML media objects
263  $clone->copyXHTMLMediaObjectsOfQuestion($original_id);
264 
265  $clone->onCopy($source_questionpool_id, $original_id, $clone->getObjId(), $clone->getId());
266 
267  return $clone->id;
268  }
+ Here is the call graph for this function:

◆ createNewOriginalFromThisDuplicate()

assFileUpload::createNewOriginalFromThisDuplicate (   $targetParentId,
  $targetQuestionTitle = '' 
)

Definition at line 270 of file class.assFileUpload.php.

References assQuestion\$id, assQuestion\getId(), and assQuestion\getObjId().

270  : int
271  {
272  if ($this->getId() <= 0) {
273  throw new RuntimeException('The question has not been saved. It cannot be duplicated');
274  }
275 
276  $sourceQuestionId = $this->id;
277  $sourceParentId = $this->getObjId();
278 
279  // duplicate the question in database
280  $clone = $this;
281  $clone->id = -1;
282 
283  $clone->setObjId($targetParentId);
284 
285  if ($targetQuestionTitle) {
286  $clone->setTitle($targetQuestionTitle);
287  }
288 
289  $clone->saveToDb();
290  // copy question page content
291  $clone->copyPageOfQuestion($sourceQuestionId);
292  // copy XHTML media objects
293  $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
294 
295  $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
296 
297  return $clone->id;
298  }
+ Here is the call graph for this function:

◆ deleteAnswers()

assFileUpload::deleteAnswers (   $question_id)
Parameters
integer$question_idThe question id which should be deleted in the answers table

Definition at line 968 of file class.assFileUpload.php.

968  : void
969  {
970  }

◆ deletePreviewFileUploads()

assFileUpload::deletePreviewFileUploads (   $userId,
  $userSolution,
  $files 
)
protected

Definition at line 597 of file class.assFileUpload.php.

References getPreviewFileUploadPath().

Referenced by savePreviewData().

598  {
599  foreach ($files as $name) {
600  if (isset($userSolution[$name])) {
601  unset($userSolution[$name]);
602  @unlink($this->getPreviewFileUploadPath($userId) . $name);
603  }
604  }
605 
606  return $userSolution;
607  }
getPreviewFileUploadPath($userId)
Returns the filesystem path for file uploads.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ deliverFileUploadZIPFile()

assFileUpload::deliverFileUploadZIPFile ( int  $ref_id,
int  $test_id,
string  $test_title 
)

Implements ilObjFileHandlingQuestionType.

Definition at line 1083 of file class.assFileUpload.php.

References ILIAS\Repository\lng().

1083  : void
1084  {
1085  $exporter = new ilAssFileUploadUploadsExporter(
1086  $this->db,
1087  $this->lng,
1088  $ref_id,
1089  $test_id
1090  );
1091 
1092  $exporter->setTestTitle($test_title);
1093  $exporter->setQuestion($this);
1094 
1095  $exporter->buildAndDownload();
1096  }
$ref_id
Definition: ltiauth.php:67
int $test_id
The database id of a test in which the question is contained.
+ Here is the call graph for this function:

◆ determineMaxFilesize()

assFileUpload::determineMaxFilesize ( )

Definition at line 633 of file class.assFileUpload.php.

Referenced by getMaxFilesizeInBytes().

633  : int
634  {
635  $upload_max_filesize = ini_get('upload_max_filesize');
636  $post_max_size = ini_get('post_max_size');
637 
638  //convert from short-string representation to "real" bytes
639  $multiplier_a = [ "K" => 1024, "M" => 1024 * 1024, "G" => 1024 * 1024 * 1024 ];
640  $umf_parts = preg_split(
641  "/(\d+)([K|G|M])/",
642  $upload_max_filesize,
643  -1,
644  PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
645  );
646  $pms_parts = preg_split(
647  "/(\d+)([K|G|M])/",
648  $post_max_size,
649  -1,
650  PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
651  );
652 
653  if (count($umf_parts) === 2) {
654  $upload_max_filesize = $umf_parts[0] * $multiplier_a[$umf_parts[1]];
655  }
656 
657  if (count($pms_parts) === 2) {
658  $post_max_size = $pms_parts[0] * $multiplier_a[$pms_parts[1]];
659  }
660 
661  // use the smaller one as limit
662  $max_filesize = min($upload_max_filesize, $post_max_size);
663 
664  if (!$max_filesize) {
665  $max_filesize = max($upload_max_filesize, $post_max_size);
666  return $max_filesize;
667  }
668 
669  return $max_filesize;
670  }
+ Here is the caller graph for this function:

◆ duplicate()

assFileUpload::duplicate ( bool  $for_test = true,
string  $title = '',
string  $author = '',
int  $owner = -1,
  $testObjId = null 
)

Duplicates an assFileUpload.

Definition at line 191 of file class.assFileUpload.php.

References assQuestion\$author, assQuestion\$original_id, assQuestion\$owner, assQuestion\$title, assQuestion\getId(), and assQuestion\getObjId().

197  : int {
198  if ($this->id <= 0) {
199  // The question has not been saved. It cannot be duplicated
200  return -1;
201  }
202  // duplicate the question in database
203  $this_id = $this->getId();
204  $thisObjId = $this->getObjId();
205 
206  $clone = $this;
207  $original_id = $this->questioninfo->getOriginalId($this->id);
208  $clone->id = -1;
209 
210  if ((int) $testObjId > 0) {
211  $clone->setObjId($testObjId);
212  }
213 
214  if ($title) {
215  $clone->setTitle($title);
216  }
217 
218  if ($author) {
219  $clone->setAuthor($author);
220  }
221  if ($owner) {
222  $clone->setOwner($owner);
223  }
224 
225  if ($for_test) {
226  $clone->saveToDb($original_id);
227  } else {
228  $clone->saveToDb();
229  }
230 
231  // copy question page content
232  $clone->copyPageOfQuestion($this_id);
233  // copy XHTML media objects
234  $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
235 
236  $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
237 
238  return $clone->id;
239  }
+ Here is the call graph for this function:

◆ fromXML()

assFileUpload::fromXML (   $item,
int  $questionpool_id,
?int  $tst_id,
$tst_object,
int &  $question_counter,
array  $import_mapping,
array &  $solutionhints = [] 
)

Creates a question from a QTI file.

Receives parameters from a QTI parser and creates a valid ILIAS question object

Parameters
ilQTIItem$itemThe QTI item object
integer$questionpool_idThe id of the parent questionpool
integer$tst_idThe id of the parent test if the question is part of a test
object$tst_objectA reference to the parent test object
integer$question_counterA reference to a question counter to count the questions of an imported question pool
array$import_mappingAn array containing references to included ILIAS objects

Definition at line 1015 of file class.assFileUpload.php.

1015  : array
1016  {
1017  $import = new assFileUploadImport($this);
1018  return $import->fromXML($item, $questionpool_id, $tst_id, $tst_object, $question_counter, $import_mapping);
1019  }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...

◆ getAdditionalTableName()

assFileUpload::getAdditionalTableName ( )

Definition at line 955 of file class.assFileUpload.php.

Referenced by loadFromDb(), and saveAdditionalQuestionDataToDb().

955  : string
956  {
957  return 'qpl_qst_fileupload';
958  }
+ Here is the caller graph for this function:

◆ getAllowedExtensions()

assFileUpload::getAllowedExtensions ( )

Definition at line 1052 of file class.assFileUpload.php.

References $allowedextensions.

Referenced by saveAdditionalQuestionDataToDb().

1052  : string
1053  {
1054  return $this->allowedextensions;
1055  }
+ Here is the caller graph for this function:

◆ getAllowedExtensionsArray()

assFileUpload::getAllowedExtensionsArray ( )

Definition at line 1043 of file class.assFileUpload.php.

Referenced by checkUpload().

1043  : array
1044  {
1045  if ($this->allowedextensions === '') {
1046  return [];
1047  }
1048 
1049  return array_filter(array_map('trim', explode(',', $this->allowedextensions)));
1050  }
+ Here is the caller graph for this function:

◆ getAnswerTableName()

assFileUpload::getAnswerTableName ( )

Definition at line 960 of file class.assFileUpload.php.

960  : string
961  {
962  return '';
963  }

◆ getBestSolution()

assFileUpload::getBestSolution (   $active_id,
  $pass 
)

Definition at line 1027 of file class.assFileUpload.php.

1027  : array
1028  {
1029  $user_solution = [];
1030  return $user_solution;
1031  }

◆ getFileUploadPath()

assFileUpload::getFileUploadPath (   $test_id,
  $active_id,
  $question_id = null 
)

Returns the filesystem path for file uploads.

Definition at line 405 of file class.assFileUpload.php.

References CLIENT_WEB_DIR, and assQuestion\getId().

Referenced by getUploadedFilesForWeb().

405  : string
406  {
407  if (is_null($question_id)) {
408  $question_id = $this->getId();
409  }
410  return CLIENT_WEB_DIR . "/assessment/tst_{$test_id}/{$active_id}/{$question_id}/files/";
411  }
const CLIENT_WEB_DIR
Definition: constants.php:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getFileUploadPathWeb()

assFileUpload::getFileUploadPathWeb (   $test_id,
  $active_id,
  $question_id = null 
)

Returns the file upload path for web accessible files of a question.

public

Definition at line 426 of file class.assFileUpload.php.

References CLIENT_WEB_DIR, assQuestion\getId(), and ilFileUtils\removeTrailingPathSeparators().

Referenced by getUploadedFilesForWeb().

427  {
428  if (is_null($question_id)) {
429  $question_id = $this->getId();
430  }
432  . "/assessment/tst_{$test_id}/{$active_id}/{$question_id}/files/";
433  return str_replace(
434  ilFileUtils::removeTrailingPathSeparators(ILIAS_ABSOLUTE_PATH),
436  $webdir
437  );
438  }
static removeTrailingPathSeparators(string $path)
const CLIENT_WEB_DIR
Definition: constants.php:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getMaxFilesizeAsString()

assFileUpload::getMaxFilesizeAsString ( )

Definition at line 609 of file class.assFileUpload.php.

References getMaxFilesizeInBytes().

609  : string
610  {
611  $size = $this->getMaxFilesizeInBytes();
612  if ($size < 1024) {
613  return sprintf('%d Bytes', $size);
614  }
615 
616  if ($size < 1024 * 1024) {
617  return sprintf('%.1f KB', $size / 1024);
618  }
619 
620  return sprintf('%.1f MB', $size / 1024 / 1024);
621  }
+ Here is the call graph for this function:

◆ getMaxFilesizeInBytes()

assFileUpload::getMaxFilesizeInBytes ( )
protected

Definition at line 623 of file class.assFileUpload.php.

References determineMaxFilesize(), and getMaxSize().

Referenced by checkUpload(), and getMaxFilesizeAsString().

623  : int
624  {
625  if ($this->getMaxSize() > 0) {
626  return $this->getMaxSize();
627  }
628 
629  return $this->determineMaxFilesize();
630  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getMaximumPoints()

assFileUpload::getMaximumPoints ( )

Returns the maximum points, a learner can reach answering the question.

See also
$points

Definition at line 305 of file class.assFileUpload.php.

References assQuestion\getPoints().

Referenced by isComplete().

305  : float
306  {
307  return $this->getPoints();
308  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getMaxSize()

assFileUpload::getMaxSize ( )

Definition at line 1033 of file class.assFileUpload.php.

References $maxsize.

Referenced by getMaxFilesizeInBytes(), and saveAdditionalQuestionDataToDb().

1033  : ?int
1034  {
1035  return $this->maxsize;
1036  }
+ Here is the caller graph for this function:

◆ getPreviewFileUploadPath()

assFileUpload::getPreviewFileUploadPath (   $userId)
protected

Returns the filesystem path for file uploads.

Definition at line 416 of file class.assFileUpload.php.

References CLIENT_WEB_DIR.

Referenced by deletePreviewFileUploads(), and savePreviewData().

416  : string
417  {
418  return CLIENT_WEB_DIR . "/assessment/qst_preview/{$userId}/{$this->getId()}/fileuploads/";
419  }
const CLIENT_WEB_DIR
Definition: constants.php:47
+ Here is the caller graph for this function:

◆ getPreviewFileUploadPathWeb()

assFileUpload::getPreviewFileUploadPathWeb (   $userId)
protected

Returns the filesystem path for file uploads.

Definition at line 443 of file class.assFileUpload.php.

References CLIENT_WEB_DIR, and ilFileUtils\removeTrailingPathSeparators().

Referenced by savePreviewData().

444  {
446  . "/assessment/qst_preview/{$userId}/{$this->getId()}/fileuploads/";
447  return str_replace(
448  ilFileUtils::removeTrailingPathSeparators(ILIAS_ABSOLUTE_PATH),
450  $webdir
451  );
452  }
static removeTrailingPathSeparators(string $path)
const CLIENT_WEB_DIR
Definition: constants.php:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getPreviewFileUploads()

assFileUpload::getPreviewFileUploads ( ilAssQuestionPreviewSession  $previewSession)

Definition at line 485 of file class.assFileUpload.php.

References ilAssQuestionPreviewSession\getParticipantsSolution().

485  : array
486  {
487  if ($previewSession->getParticipantsSolution() === false || $previewSession->getParticipantsSolution() === null) {
488  return [];
489  }
490 
491  return $previewSession->getParticipantsSolution();
492  }
+ Here is the call graph for this function:

◆ getQuestionType()

assFileUpload::getQuestionType ( )

Definition at line 950 of file class.assFileUpload.php.

950  : string
951  {
952  return 'assFileUpload';
953  }

◆ getRTETextWithMediaObjects()

assFileUpload::getRTETextWithMediaObjects ( )

Collects all text in the question which could contain media objects which were created with the Rich Text Editor.

Definition at line 976 of file class.assFileUpload.php.

976  : string
977  {
978  return parent::getRTETextWithMediaObjects();
979  }

◆ getUploadedFiles()

assFileUpload::getUploadedFiles (   $active_id,
  $pass = null,
  $authorized = true 
)

Returns the uploaded files for an active user in a given pass.

Returns
array Results

Definition at line 459 of file class.assFileUpload.php.

References $data, $DIC, $ilDB, assQuestion\getId(), and assQuestion\getSolutionMaxPass().

Referenced by getUploadedFilesForWeb(), and handleSubmission().

459  : array
460  {
461  global $DIC;
462  $ilDB = $DIC['ilDB'];
463 
464  if (is_null($pass)) {
465  $pass = $this->getSolutionMaxPass($active_id);
466  }
467  // fau: testNav - check existing value1 because the intermediate solution will have a dummy entry
468  $result = $ilDB->queryF(
469  'SELECT * FROM tst_solutions WHERE active_fi = %s '
470  . 'AND question_fi = %s AND pass = %s AND authorized = %s '
471  . 'AND value1 IS NOT NULL ORDER BY tstamp',
472  ['integer', 'integer', 'integer', 'integer'],
473  [$active_id, $this->getId(), $pass, (int) $authorized]
474  );
475  // fau.
476  $found = [];
477 
478  while ($data = $ilDB->fetchAssoc($result)) {
479  array_push($found, $data);
480  }
481 
482  return $found;
483  }
global $DIC
Definition: feed.php:28
getSolutionMaxPass(int $active_id)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getUploadedFilesForWeb()

assFileUpload::getUploadedFilesForWeb (   $active_id,
  $pass 
)

Returns the web accessible uploaded files for an active user in a given pass.

Returns
array Results

Definition at line 499 of file class.assFileUpload.php.

References $data, $path, assQuestion\$step, assQuestion\$test_id, $url, getFileUploadPath(), getFileUploadPathWeb(), assQuestion\getSolutionValues(), assQuestion\getStep(), getUploadedFiles(), and assQuestion\setStep().

499  : array
500  {
501  $found = $this->getUploadedFiles($active_id, $pass);
502  $result = $this->db->queryF(
503  'SELECT test_fi FROM tst_active WHERE active_id = %s',
504  ['integer'],
505  [$active_id]
506  );
507  if ($result->numRows() == 1) {
508  $row = $this->db->fetchAssoc($result);
509  $test_id = $row['test_fi'];
510  $path = $this->getFileUploadPathWeb($test_id, $active_id);
511  foreach ($found as $idx => $data) {
512  // depending on whether the files are already stored in the IRSS or not, the files are compiled differently here.
513  // this can be removed with ILIAs 10 and switched exclusively to the IRSS variant.
514  // We recommend then to revise the whole handling of files
515 
516  if ($data['value2'] === 'rid') {
517  $rid = $this->irss->manage()->find($data['value1']);
518  if ($rid === null) {
519  continue;
520  }
521  $revision = $this->irss->manage()->getCurrentRevision($rid);
522  $stream = $this->irss->consume()->stream($rid)->getStream();
523  $url = $this->file_delivery->buildTokenURL(
524  $stream,
525  $revision->getTitle(),
526  Disposition::ATTACHMENT,
527  $this->current_user->getId(),
528  1
529  );
530 
531  $path = (string) $url;
532  $found[$idx]['webpath'] = $path;
533  $found[$idx]['value2'] = $revision->getTitle();
534  } else {
535  $found[$idx]['webpath'] = $path;
536  }
537  }
538  }
539  return $found;
540  }
getFileUploadPathWeb($test_id, $active_id, $question_id=null)
Returns the file upload path for web accessible files of a question.
$path
Definition: ltiservices.php:32
$url
Definition: ltiregstart.php:35
int $test_id
The database id of a test in which the question is contained.
getUploadedFiles($active_id, $pass=null, $authorized=true)
Returns the uploaded files for an active user in a given pass.
+ Here is the call graph for this function:

◆ getUserSolutionPreferingIntermediate()

assFileUpload::getUserSolutionPreferingIntermediate (   $active_id,
  $pass = null 
)
Parameters
int$active_id
int | null$pass

Definition at line 840 of file class.assFileUpload.php.

References assQuestion\getSolutionValues().

840  : array
841  {
842  $solution = $this->getSolutionValues($active_id, $pass, false);
843 
844  if (!count($solution)) {
845  $solution = $this->getSolutionValues($active_id, $pass, true);
846  } else {
847  $cleaned = [];
848  foreach ($solution as $row) {
849  if (!empty($row['value1'])) {
850  $cleaned[] = $row;
851  }
852  }
853  $solution = $cleaned;
854  }
855 
856  return $solution;
857  }
getSolutionValues($active_id, $pass=null, bool $authorized=true)
Loads solutions of a given user from the database an returns it.
+ Here is the call graph for this function:

◆ handleSubmission()

assFileUpload::handleSubmission ( int  $active_id,
int  $pass,
bool  $obligations_answered,
bool  $authorized 
)
protected

Definition at line 930 of file class.assFileUpload.php.

References assQuestion\$points, ilObjTest\_getObjectIDFromActiveID(), ilObjTestAccess\_getParticipantId(), assQuestion\_setReachedPoints(), ilLPStatusWrapper\_updateStatus(), assQuestion\getId(), getUploadedFiles(), and isCompletionBySubmissionEnabled().

930  : void
931  {
932  if (!$authorized
934  || !$this->getUploadedFiles($active_id, $pass, $authorized)) {
935  return;
936  }
937 
938  $maxpoints = $this->questioninfo->getMaximumPoints($this->getId());
939 
940  $points = $maxpoints;
941 
942  assQuestion::_setReachedPoints($active_id, $this->getId(), $points, $maxpoints, $pass, true, $obligations_answered);
943 
945  ilObjTest::_getObjectIDFromActiveID((int) $active_id),
946  ilObjTestAccess::_getParticipantId((int) $active_id)
947  );
948  }
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.
float $points
The maximum available points for the question.
getUploadedFiles($active_id, $pass=null, $authorized=true)
Returns the uploaded files for an active user in a given pass.
static _setReachedPoints(int $active_id, int $question_id, float $points, float $maxpoints, int $pass, bool $manualscoring, bool $obligationsEnabled, ?int $test_id=null)
Sets the points, a learner has reached answering the question Additionally objective results are upda...
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
+ Here is the call graph for this function:

◆ hasFileUploads()

assFileUpload::hasFileUploads ( int  $test_id)

Implements ilObjFileHandlingQuestionType.

Definition at line 1062 of file class.assFileUpload.php.

References assQuestion\getId().

1062  : bool
1063  {
1064  $query = '
1065  SELECT tst_solutions.solution_id
1066  FROM tst_solutions, tst_active, qpl_questions
1067  WHERE tst_solutions.active_fi = tst_active.active_id
1068  AND tst_solutions.question_fi = qpl_questions.question_id
1069  AND tst_solutions.question_fi = %s AND tst_active.test_fi = %s
1070  AND tst_solutions.value1 is not null';
1071  $result = $this->db->queryF(
1072  $query,
1073  ['integer', 'integer'],
1074  [$this->getId(), $test_id]
1075  );
1076  if ($result->numRows() > 0) {
1077  return true;
1078  }
1079 
1080  return false;
1081  }
int $test_id
The database id of a test in which the question is contained.
+ Here is the call graph for this function:

◆ isComplete()

assFileUpload::isComplete ( )

Returns true, if the question is complete for use.

Returns
boolean True, if the question is complete for use, otherwise false

Definition at line 90 of file class.assFileUpload.php.

References getMaximumPoints().

90  : bool
91  {
92  if (
93  strlen($this->title)
94  && ($this->author)
95  && ($this->question)
96  && ($this->getMaximumPoints() >= 0)
97  && is_numeric($this->getMaximumPoints())) {
98  return true;
99  }
100  return false;
101  }
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
+ Here is the call graph for this function:

◆ isCompletionBySubmissionEnabled()

assFileUpload::isCompletionBySubmissionEnabled ( )

Definition at line 1098 of file class.assFileUpload.php.

References $completion_by_submission.

Referenced by calculateReachedPoints(), calculateReachedPointsForSolution(), handleSubmission(), and saveAdditionalQuestionDataToDb().

1098  : bool
1099  {
1101  }
+ Here is the caller graph for this function:

◆ isFileDeletionAction()

assFileUpload::isFileDeletionAction ( )
protected

Definition at line 1120 of file class.assFileUpload.php.

References assFileUploadGUI\DELETE_FILES_ACTION, and assQuestion\getQuestionAction().

Referenced by resolveRIDStoDelete(), savePreviewData(), and saveWorkingData().

1120  : bool
1121  {
1123  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isFileDeletionSubmitAvailable()

assFileUpload::isFileDeletionSubmitAvailable ( )
protected

Definition at line 1125 of file class.assFileUpload.php.

References assQuestion\isNonEmptyItemListPostSubmission().

Referenced by resolveRIDStoDelete(), savePreviewData(), and saveWorkingData().

1125  : bool
1126  {
1127  return $this->isNonEmptyItemListPostSubmission(self::DELETE_FILES_TBL_POSTVAR);
1128  }
isNonEmptyItemListPostSubmission(string $postSubmissionFieldname)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isFileReuseHandlingRequired()

assFileUpload::isFileReuseHandlingRequired ( )
protected

Definition at line 1135 of file class.assFileUpload.php.

References assQuestion\getTestPresentationConfig(), and isFileReuseSubmitAvailable().

Referenced by saveWorkingData().

1135  : bool
1136  {
1137  if (!$this->getTestPresentationConfig()->isPreviousPassSolutionReuseAllowed()) {
1138  return false;
1139  }
1140 
1141  if (!$this->isFileReuseSubmitAvailable()) {
1142  return false;
1143  }
1144 
1145  return true;
1146  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isFileReuseSubmitAvailable()

assFileUpload::isFileReuseSubmitAvailable ( )
protected

Definition at line 1130 of file class.assFileUpload.php.

References assQuestion\isNonEmptyItemListPostSubmission().

Referenced by isFileReuseHandlingRequired().

1130  : bool
1131  {
1132  return $this->isNonEmptyItemListPostSubmission(self::REUSE_FILES_TBL_POSTVAR);
1133  }
isNonEmptyItemListPostSubmission(string $postSubmissionFieldname)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isFileUploadAvailable()

assFileUpload::isFileUploadAvailable ( )
protected
Exceptions
IllegalStateException

Definition at line 1151 of file class.assFileUpload.php.

Referenced by savePreviewData(), and saveWorkingData().

1151  : bool
1152  {
1153  if (!$this->file_upload->hasBeenProcessed()) {
1154  $this->file_upload->process();
1155  }
1156  return $this->file_upload->hasUploads();
1157  }
+ Here is the caller graph for this function:

◆ isObligationPossible()

static assFileUpload::isObligationPossible ( int  $question_id)
static

Definition at line 1109 of file class.assFileUpload.php.

1109  : bool
1110  {
1111  return true;
1112  }

◆ loadFromDb()

assFileUpload::loadFromDb (   $question_id)

Loads a assFileUpload object from a database.

Parameters
integer$question_idA unique key which defines the question in the database

Definition at line 145 of file class.assFileUpload.php.

References $data, $DIC, Vendor\Package\$e, $ilDB, ilRTE\_replaceMediaObjectImageSrc(), getAdditionalTableName(), ilAssQuestionLifecycle\getDraftInstance(), ilAssQuestionLifecycle\getInstance(), assQuestion\setAdditionalContentEditingMode(), setAllowedExtensions(), assQuestion\setAuthor(), assQuestion\setComment(), setCompletionBySubmission(), assQuestion\setId(), assQuestion\setLifecycle(), setMaxSize(), assQuestion\setNrOfTries(), assQuestion\setObjId(), assQuestion\setOriginalId(), assQuestion\setOwner(), assQuestion\setPoints(), assQuestion\setQuestion(), and assQuestion\setTitle().

145  : void
146  {
147  global $DIC;
148  $ilDB = $DIC['ilDB'];
149  $result = $ilDB->queryF(
150  'SELECT qpl_questions.*, ' . $this->getAdditionalTableName()
151  . '.* FROM qpl_questions LEFT JOIN ' . $this->getAdditionalTableName()
152  . ' ON ' . $this->getAdditionalTableName()
153  . '.question_fi = qpl_questions.question_id WHERE qpl_questions.question_id = %s',
154  ['integer'],
155  [$question_id]
156  );
157  if ($result->numRows() == 1) {
158  $data = $ilDB->fetchAssoc($result);
159  $this->setId($question_id);
160  $this->setTitle((string) $data['title']);
161  $this->setComment((string) $data['description']);
162  $this->setNrOfTries($data['nr_of_tries']);
163  $this->setOriginalId($data['original_id']);
164  $this->setObjId($data['obj_fi']);
165  $this->setAuthor($data['author']);
166  $this->setOwner($data['owner']);
167  $this->setPoints($data['points']);
168 
169  $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc((string) $data['question_text'], 1));
170  $this->setMaxSize(($data['maxsize'] ?? null) ? (int) $data['maxsize'] : null);
171  $this->setAllowedExtensions($data['allowedextensions'] ?? '');
172  $this->setCompletionBySubmission($data['compl_by_submission'] == 1 ? true : false);
173 
174  try {
178  }
179 
180  try {
181  $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
182  } catch (ilTestQuestionPoolException $e) {
183  }
184  }
185  parent::loadFromDb($question_id);
186  }
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
setNrOfTries(int $a_nr_of_tries)
setOwner(int $owner=-1)
setMaxSize(?int $value)
setComment(string $comment="")
global $DIC
Definition: feed.php:28
setCompletionBySubmission(bool $bool)
setPoints(float $points)
setObjId(int $obj_id=0)
setId(int $id=-1)
setOriginalId(?int $original_id)
setTitle(string $title="")
setLifecycle(ilAssQuestionLifecycle $lifecycle)
setAuthor(string $author="")
setAdditionalContentEditingMode(?string $additionalContentEditingMode)
setAllowedExtensions(string $a_value)
setQuestion(string $question="")
+ Here is the call graph for this function:

◆ removeIntermediateSolution()

assFileUpload::removeIntermediateSolution ( int  $active_id,
int  $pass 
)

Definition at line 860 of file class.assFileUpload.php.

References assQuestion\$test_id.

860  : void
861  {
862  parent::removeIntermediateSolution($active_id, $pass);
863 
864  $test_id = $this->testParticipantInfo->lookupTestIdByActiveId($active_id);
865  if ($test_id !== -1) {
866  // TODO: This can be removed with ILIAS 10
867  $this->deleteUnusedFiles([], $test_id, $active_id, $pass);
868  }
869  }
int $test_id
The database id of a test in which the question is contained.

◆ removeSolutionRecordById()

assFileUpload::removeSolutionRecordById ( int  $solution_id)
protected

Definition at line 831 of file class.assFileUpload.php.

Referenced by saveWorkingData().

831  : int
832  {
833  return parent::removeSolutionRecordById($solution_id);
834  }
+ Here is the caller graph for this function:

◆ resolveRIDStoDelete()

assFileUpload::resolveRIDStoDelete ( )
protected

Definition at line 812 of file class.assFileUpload.php.

References Vendor\Package\$d, $res, isFileDeletionAction(), and isFileDeletionSubmitAvailable().

Referenced by saveWorkingData().

812  : array
813  {
814  $rids_to_delete = [];
815  if ($this->isFileDeletionAction() && $this->isFileDeletionSubmitAvailable()) {
816  $res = $this->db->query(
817  "SELECT value1 FROM tst_solutions WHERE value2 = 'rid' AND " . $this->db->in(
818  'solution_id',
819  $_POST[self::DELETE_FILES_TBL_POSTVAR],
820  false,
821  'integer'
822  )
823  );
824  while ($d = $this->db->fetchAssoc($res)) {
825  $rids_to_delete[] = $d['value1'];
826  }
827  }
828  return $rids_to_delete;
829  }
$res
Definition: ltiservices.php:69
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ saveAdditionalQuestionDataToDb()

assFileUpload::saveAdditionalQuestionDataToDb ( )

Saves a record to the question types additional data table.

Returns
mixed

Implements ilObjQuestionScoringAdjustable.

Definition at line 118 of file class.assFileUpload.php.

References $DIC, $ilDB, getAdditionalTableName(), getAllowedExtensions(), assQuestion\getId(), getMaxSize(), and isCompletionBySubmissionEnabled().

Referenced by saveToDb().

119  {
120  global $DIC;
121  $ilDB = $DIC['ilDB'];
122  $ilDB->manipulateF(
123  'DELETE FROM ' . $this->getAdditionalTableName() . ' WHERE question_fi = %s',
124  ['integer'],
125  [$this->getId()]
126  );
127  $ilDB->manipulateF(
128  'INSERT INTO ' . $this->getAdditionalTableName(
129  ) . ' (question_fi, maxsize, allowedextensions, compl_by_submission) VALUES (%s, %s, %s, %s)',
130  ['integer', 'float', 'text', 'integer' ],
131  [
132  $this->getId(),
133  $this->getMaxSize(),
134  (strlen($this->getAllowedExtensions())) ? $this->getAllowedExtensions() : null,
135  (int) $this->isCompletionBySubmissionEnabled()
136  ]
137  );
138  }
global $DIC
Definition: feed.php:28
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ savePreviewData()

assFileUpload::savePreviewData ( ilAssQuestionPreviewSession  $previewSession)
protected

Definition at line 872 of file class.assFileUpload.php.

References Vendor\Package\$e, $version, checkUpload(), deletePreviewFileUploads(), ilAssQuestionPreviewSession\getParticipantsSolution(), getPreviewFileUploadPath(), getPreviewFileUploadPathWeb(), ilAssQuestionPreviewSession\getUserId(), isFileDeletionAction(), isFileDeletionSubmitAvailable(), isFileUploadAvailable(), ILIAS\Repository\lng(), ilFileUtils\makeDirParents(), ilFileUtils\moveUploadedFile(), and ilAssQuestionPreviewSession\setParticipantsSolution().

872  : void
873  {
874  $userSolution = $previewSession->getParticipantsSolution();
875 
876  if (!is_array($userSolution)) {
877  $userSolution = [];
878  }
879 
880  // hey: prevPassSolutions - readability spree - get a chance to understand the code
881  if ($this->isFileDeletionAction()) {
882  // hey.
883  // hey: prevPassSolutions - readability spree - get a chance to understand the code
884  if ($this->isFileDeletionSubmitAvailable()) {
885  // hey.
886  $userSolution = $this->deletePreviewFileUploads($previewSession->getUserId(), $userSolution, $_POST['deletefiles']);
887  } else {
888  $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true);
889  }
890  } else {
891  // hey: prevPassSolutions - readability spree - get a chance to understand the code
892  try {
893  $fileUploadAvailable = $this->current_cmd !== 'instantResponse'
894  && $this->isFileUploadAvailable();
895  } catch (IllegalStateException $e) {
896  $this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
897  return;
898  }
899  if ($fileUploadAvailable) {
900  // hey.
901  if ($this->checkUpload()) {
902  if (!@file_exists($this->getPreviewFileUploadPath($previewSession->getUserId()))) {
904  }
905 
906  $version = time();
907  $filename_arr = pathinfo($_FILES['upload']['name']);
908  $extension = $filename_arr['extension'];
909  $newfile = 'file_' . md5($_FILES['upload']['name']) . '_' . $version . '.' . $extension;
911  $_FILES['upload']['tmp_name'],
912  $_FILES['upload']['name'],
913  $this->getPreviewFileUploadPath($previewSession->getUserId()) . $newfile
914  );
915 
916  $userSolution[$newfile] = [
917  'solution_id' => $newfile,
918  'value1' => $newfile,
919  'value2' => $_FILES['upload']['name'],
920  'tstamp' => $version,
921  'webpath' => $this->getPreviewFileUploadPathWeb($previewSession->getUserId())
922  ];
923  }
924  }
925  }
926 
927  $previewSession->setParticipantsSolution($userSolution);
928  }
getPreviewFileUploadPathWeb($userId)
Returns the filesystem path for file uploads.
deletePreviewFileUploads($userId, $userSolution, $files)
static makeDirParents(string $a_dir)
Create a new directory and all parent directories.
checkUpload()
Check file upload.
static moveUploadedFile(string $a_file, string $a_name, string $a_target, bool $a_raise_errors=true, string $a_mode="move_uploaded")
move uploaded file
getPreviewFileUploadPath($userId)
Returns the filesystem path for file uploads.
$version
Definition: plugin.php:24
+ Here is the call graph for this function:

◆ saveToDb()

assFileUpload::saveToDb (   $original_id = '')

Saves a assFileUpload object to a database.

Definition at line 106 of file class.assFileUpload.php.

References assQuestion\$original_id, saveAdditionalQuestionDataToDb(), and assQuestion\saveQuestionDataToDb().

106  : void
107  {
108  if ($original_id == '') {
109  $this->saveQuestionDataToDb();
110  } else {
112  }
113 
115  parent::saveToDb();
116  }
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
saveQuestionDataToDb(int $original_id=-1)
+ Here is the call graph for this function:

◆ saveWorkingData()

assFileUpload::saveWorkingData (   $active_id,
  $pass = null,
  $authorized = true 
)

public

Parameters
integer$active_idActive id of the user
integer$passTest pass

Definition at line 677 of file class.assFileUpload.php.

References Vendor\Package\$e, assQuestion\$test_id, ilObjAssessmentFolder\_enabledAssessmentLogging(), ilObjAssessmentFolder\_getLogLanguage(), ilObjTest\_getPass(), checkUpload(), assQuestion\deleteDummySolutionRecord(), assQuestion\forceExistingIntermediateSolution(), assQuestion\getId(), assQuestion\getProcessLocker(), assQuestion\getSolutionRecordById(), assQuestion\intermediateSolutionExists(), isFileDeletionAction(), isFileDeletionSubmitAvailable(), isFileReuseHandlingRequired(), isFileUploadAvailable(), ILIAS\Repository\lng(), assQuestion\logAction(), assQuestion\removeCurrentSolution(), removeSolutionRecordById(), resolveRIDStoDelete(), assQuestion\saveCurrentSolution(), and assQuestion\updateCurrentSolutionsAuthorization().

677  : bool
678  {
679  if ($pass === null || $pass < 0) {
680  $pass = \ilObjTest::_getPass($active_id);
681  }
682 
683  $test_id = $this->testParticipantInfo->lookupTestIdByActiveId($active_id);
684 
685  try {
686  $upload_handling_required = $this->current_cmd !== 'submitSolution'
687  && $this->current_cmd !== 'showInstantResponse'
688  && !$this->isFileDeletionAction()
689  && $this->isFileUploadAvailable()
690  && $this->checkUpload();
691  } catch (IllegalStateException $e) {
692  $this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
693  return false;
694  }
695 
696  $rid = null;
697 
698  if ($upload_handling_required) {
699  // upload new file to storage
700  $upload_results = $this->file_upload->getResults();
701  $upload_result = end($upload_results); // only one supported at the moment
702  $rid = $this->irss->manage()->upload(
703  $upload_result,
705  );
706  }
707 
708  $entered_values = false;
709 
710  // RIDS to delete
711  // Unfortunately, at the moment it is not possible to delete the files from the IRSS, because the process takes
712  // place within the ProcessLocker and the IRSS tables cannot be used. we have to remove them after the lock.
713  // therefore we store the rids to delete in an array for later deletion.
714 
715  $rids_to_delete = $this->resolveRIDStoDelete();
716 
717  $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(
718  function () use (
719  &$entered_values,
720  $upload_handling_required,
721  $test_id,
722  $active_id,
723  $pass,
724  $authorized,
725  $rid
726  ) {
727  if ($authorized === false) {
728  $this->forceExistingIntermediateSolution($active_id, $pass, true);
729  }
730 
731  if ($this->isFileDeletionAction()) {
732  if ($this->isFileDeletionSubmitAvailable()) {
733  foreach ($_POST[self::DELETE_FILES_TBL_POSTVAR] as $solution_id) {
734  $this->removeSolutionRecordById($solution_id);
735  }
736  } else {
737  $this->tpl->setOnScreenMessage('info', $this->lng->txt('no_checkbox'), true);
738  }
739  } else {
740  if ($this->isFileReuseHandlingRequired()) {
741  foreach ($_POST[self::REUSE_FILES_TBL_POSTVAR] as $solutionId) {
742  $solution = $this->getSolutionRecordById($solutionId);
743 
744  $this->saveCurrentSolution(
745  $active_id,
746  $pass,
747  $solution['value1'],
748  $solution['value2'],
749  false,
750  $solution['tstamp']
751  );
752  }
753  }
754 
755  if ($upload_handling_required && $rid !== null) {
756 
757  $revision = $this->irss->manage()->getCurrentRevision($rid);
758 
759  $this->saveCurrentSolution(
760  $active_id,
761  $pass,
762  $rid->serialize(),
763  'rid',
764  false,
765  time()
766  );
767 
768  $entered_values = true;
769  }
770  }
771 
772  if ($authorized === true && $this->intermediateSolutionExists($active_id, $pass)) {
773  // remove the dummy record of the intermediate solution
774  $this->deleteDummySolutionRecord($active_id, $pass);
775 
776  // delete the authorized solution and make the intermediate solution authorized (keeping timestamps)
777  $this->removeCurrentSolution($active_id, $pass, true);
778  $this->updateCurrentSolutionsAuthorization($active_id, $pass, true, true);
779  }
780 
781  }
782  );
783 
784  $this->deleteUnusedFiles(
785  $rids_to_delete,
786  $test_id,
787  $active_id,
788  $pass
789  );
790 
791  if ($entered_values) {
793  assQuestion::logAction($this->lng->txtlng(
794  'assessment',
795  'log_user_entered_values',
797  ), $active_id, $this->getId());
798  }
799  } else {
801  assQuestion::logAction($this->lng->txtlng(
802  'assessment',
803  'log_user_not_entered_values',
805  ), $active_id, $this->getId());
806  }
807  }
808 
809  return true;
810  }
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
updateCurrentSolutionsAuthorization(int $activeId, int $pass, bool $authorized, bool $keepTime=false)
deleteDummySolutionRecord(int $activeId, int $passIndex)
saveCurrentSolution(int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
static logAction(string $logtext, int $active_id, int $question_id)
checkUpload()
Check file upload.
intermediateSolutionExists(int $active_id, int $pass)
int $test_id
The database id of a test in which the question is contained.
removeCurrentSolution(int $active_id, int $pass, bool $authorized=true)
removeSolutionRecordById(int $solution_id)
forceExistingIntermediateSolution(int $activeId, int $passIndex, bool $considerDummyRecordCreation)
getSolutionRecordById(int $solutionId)
+ Here is the call graph for this function:

◆ setAllowedExtensions()

assFileUpload::setAllowedExtensions ( string  $a_value)

Definition at line 1057 of file class.assFileUpload.php.

Referenced by loadFromDb().

1057  : void
1058  {
1059  $this->allowedextensions = strtolower(trim($a_value));
1060  }
+ Here is the caller graph for this function:

◆ setCompletionBySubmission()

assFileUpload::setCompletionBySubmission ( bool  $bool)

Definition at line 1103 of file class.assFileUpload.php.

Referenced by loadFromDb().

1103  : assFileUpload
1104  {
1105  $this->completion_by_submission = (bool) $bool;
1106  return $this;
1107  }
Class for file upload questions.
+ Here is the caller graph for this function:

◆ setExportDetailsXLSX()

assFileUpload::setExportDetailsXLSX ( ilAssExcelFormatHelper  $worksheet,
int  $startrow,
int  $col,
int  $active_id,
int  $pass 
)

{}

Definition at line 984 of file class.assFileUpload.php.

References ilExcel\getColumnCoord(), assQuestion\getSolutionValues(), ILIAS\Repository\lng(), ilExcel\setBold(), and ilAssExcelFormatHelper\setCell().

984  : int
985  {
986  parent::setExportDetailsXLSX($worksheet, $startrow, $col, $active_id, $pass);
987 
988  $i = 1;
989  $solutions = $this->getSolutionValues($active_id, $pass);
990  foreach ($solutions as $solution) {
991  $worksheet->setCell($startrow + $i, $col, $this->lng->txt('result'));
992  $worksheet->setBold($worksheet->getColumnCoord($col) . ($startrow + $i));
993  if (strlen($solution['value1'])) {
994  $worksheet->setCell($startrow + $i, $col + 2, $solution['value1']);
995  $worksheet->setCell($startrow + $i, $col + 3, $solution['value2']);
996  }
997  $i++;
998  }
999 
1000  return $startrow + $i + 1;
1001  }
getSolutionValues($active_id, $pass=null, bool $authorized=true)
Loads solutions of a given user from the database an returns it.
getColumnCoord(int $a_col)
Get column "name" from number.
setCell($a_row, $a_col, $a_value, $datatype=null)
setBold(string $a_coords)
Set cell(s) to bold.
+ Here is the call graph for this function:

◆ setMaxSize()

assFileUpload::setMaxSize ( ?int  $value)

Definition at line 1038 of file class.assFileUpload.php.

Referenced by loadFromDb().

1038  : void
1039  {
1040  $this->maxsize = $value;
1041  }
+ Here is the caller graph for this function:

◆ toXML()

assFileUpload::toXML (   $a_include_header = true,
  $a_include_binary = true,
  $a_shuffle = false,
  $test_output = false,
  $force_image_references = false 
)

Definition at line 1021 of file class.assFileUpload.php.

1021  : string
1022  {
1023  $export = new assFileUploadExport($this);
1024  return $export->toXML($a_include_header, $a_include_binary, $a_shuffle, $test_output, $force_image_references);
1025  }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...

Field Documentation

◆ $allowedextensions

string assFileUpload::$allowedextensions = ''
protected

Definition at line 49 of file class.assFileUpload.php.

Referenced by getAllowedExtensions().

◆ $completion_by_submission

assFileUpload::$completion_by_submission = false
protected

Definition at line 54 of file class.assFileUpload.php.

Referenced by isCompletionBySubmissionEnabled().

◆ $current_cmd

string assFileUpload::$current_cmd
private

Definition at line 51 of file class.assFileUpload.php.

◆ $file_delivery

ILIAS FileDelivery Services assFileUpload::$file_delivery
private

Definition at line 44 of file class.assFileUpload.php.

◆ $file_upload

ILIAS FileUpload FileUpload assFileUpload::$file_upload
private

Definition at line 45 of file class.assFileUpload.php.

◆ $irss

ILIAS ResourceStorage Services assFileUpload::$irss
private

Definition at line 43 of file class.assFileUpload.php.

◆ $maxsize

int assFileUpload::$maxsize = null
protected

Definition at line 47 of file class.assFileUpload.php.

Referenced by getMaxSize().

◆ DELETE_FILES_TBL_POSTVAR

const assFileUpload::DELETE_FILES_TBL_POSTVAR = 'deletefiles'

◆ HAS_SPECIFIC_FEEDBACK

const assFileUpload::HAS_SPECIFIC_FEEDBACK = false
protected

Definition at line 42 of file class.assFileUpload.php.

◆ REUSE_FILES_TBL_POSTVAR

const assFileUpload::REUSE_FILES_TBL_POSTVAR = 'reusefiles'

The documentation for this class was generated from the following file: