ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
ilTestArchiver Class Reference

Class ilTestArchiver. More...

+ Collaboration diagram for ilTestArchiver:

Public Member Functions

 getParticipantData ()
 
 setParticipantData ($participantData)
 
 handInParticipantSubmission ($active_fi, $pass, $pdf_path, $html_string)
 Hands in a participants test submission ("a completed test") for archiving. More...
 
 handInParticipantQuestionMaterial ($active_fi, $pass, $question_fi, $original_filename, $file_path)
 Hands in a particpants question material, such as an upload or other binary content. More...
 
 handInParticipantMisc ($active_fi, $pass, $original_filename, $file_path)
 Hands in a participants file, which is relevant for archiving but an unspecified type. More...
 
 handInTestBestSolution ($html_string, $pdf_path)
 Hands in the best solution for a test. More...
 
 handInBestSolutionQuestionMaterial ($question_fi, $orginial_filename, $file_path)
 Hands in a file related to a question in context of the best solution. More...
 
 handInTestResult ($active_fi, $pass, $pdf_path)
 Hands in an individual test result for a pass. More...
 
 handInTestResultsOverview ($html_string, $pdf_path)
 Hands in a test results overview. More...
 
 updateTestArchive ()
 Replaces the test-log with the current one. More...
 
 ensureZipExportDirectoryExists ()
 
 hasZipExportDirectory ()
 Returns if the export directory for zips exists. More...
 
 getZipExportDirectory ()
 Return the export directory, where zips are placed. More...
 
 compressTestArchive ()
 Generate the test archive for download. More...
 

Data Fields

const DIR_SEP = '/'
 
const HTML_SUBMISSION_FILENAME = 'test_submission.html'
 
const PDF_SUBMISSION_FILENAME = 'test_submission.pdf'
 
const PASS_MATERIALS_PATH_COMPONENT = 'materials'
 
const QUESTION_PATH_COMPONENT_PREFIX = 'q_'
 
const TEST_BEST_SOLUTION_PATH_COMPONENT = 'best_solution'
 
const HTML_BEST_SOLUTION_FILENAME = 'best_solution.html'
 
const PDF_BEST_SOLUTION_FILENAME = 'best_solution.pdf'
 
const TEST_MATERIALS_PATH_COMPONENT = 'materials'
 
const TEST_RESULT_FILENAME = 'test_result_v'
 
const TEST_RESULT_POSTFIX = '.pdf'
 
const TEST_OVERVIEW_PDF_FILENAME = 'results_overview_html_v'
 
const TEST_OVERVIEW_PDF_POSTFIX = '.pdf'
 
const TEST_OVERVIEW_HTML_FILENAME = 'results_overview_pdf_v'
 
const TEST_OVERVIEW_HTML_POSTFIX = '.html'
 
const LOG_DTSGROUP_FORMAT = 'D M j G:i:s T Y'
 
const LOG_ADDITION_STRING = ' Adding '
 
const LOG_CREATION_STRING = ' Creating '
 
const LOG_UPDATE_STRING = ' Updating '
 
const LOG_DELETION_STRING = ' Deleting '
 
const TEST_LOG_FILENAME = 'test.log'
 
const DATA_INDEX_FILENAME = 'data_index.csv'
 
const ARCHIVE_LOG = 'archive.log'
 
const EXPORT_DIRECTORY = 'archive_exports'
 

Protected Member Functions

 hasTestArchive ()
 Returns if the archive directory structure for the test the object is created for exists. More...
 
 createArchiveForTest ()
 Creates the directory for the test archive. More...
 
 getTestArchive ()
 Returns the (theoretical) path to the archive directory of the test, this object is created for. More...
 
 ensureTestArchiveIsAvailable ()
 Ensures the availability of the test archive directory. More...
 
 createZipExportDirectory ()
 
 hasPassDataDirectory ($active_fi, $pass)
 Checks if the directory for pass data is available. More...
 
 createPassDataDirectory ($active_fi, $pass)
 Creates pass data directory. More...
 
 getPassDataDirectory ($active_fi, $pass)
 Returns the pass data directory. More...
 
 ensurePassDataDirectoryIsAvailable ($active_fi, $pass)
 Ensures the availability of the participant data directory. More...
 
 hasPassMaterialsDirectory ($active_fi, $pass)
 Returns if the pass materials directory exists for a given pass. More...
 
 createPassMaterialsDirectory ($active_fi, $pass)
 Creates pass materials directory. More...
 
 getPassMaterialsDirectory ($active_fi, $pass)
 Returns the pass materials directory. More...
 
 ensurePassMaterialsDirectoryIsAvailable ($active_fi, $pass)
 Ensures the availability of the pass materials directory. More...
 
 readArchiveDataIndex ()
 Reads the archive data index. More...
 
 appendToArchiveDataIndex ($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
 Appends a line to the archive data index. More...
 
 determinePassDataPath ($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
 Determines the pass data path. More...
 
 logArchivingProcess ($message)
 Logs to the archive log. More...
 
 countFilesInDirectory ($directory, $pattern=null)
 Returns the count of files in a directory, eventually matching the given, optional, pattern. More...
 

Protected Attributes

 $external_directory_path
 
 $client_id
 
 $test_obj_id
 
 $archive_data_index
 
 $ilDB
 
 $participantData
 

Private Member Functions

 buildPassDataDirectory ($active_fi, $pass)
 

Detailed Description

Class ilTestArchiver.

Helper class to deal with the generation and maintenance of test archives.

Author
Maximilian Becker mbeck.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Version
$Id$

Definition at line 15 of file class.ilTestArchiver.php.

Member Function Documentation

◆ appendToArchiveDataIndex()

ilTestArchiver::appendToArchiveDataIndex (   $date,
  $active_fi,
  $pass,
  $user_firstname,
  $user_lastname,
  $matriculation 
)
protected

Appends a line to the archive data index.

Parameters
$datestring Date for the directories path.
$active_fiinteger ActiveFI of the participant.
$passinteger Pass number of the participant.
$user_firstnamestring User firstname.
$user_lastnamestring User lastname.
$matriculationstring Matriculation number of the user.
Returns
void

Definition at line 693 of file class.ilTestArchiver.php.

694 {
695 $line = $this->determinePassDataPath($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation);
696
697 $this->archive_data_index[] = $line;
698 $output_contents = '';
699
700 foreach ($this->archive_data_index as $line_data) {
701 if ($line_data['identifier'] == "|") {
702 continue;
703 }
704 $output_contents .= implode('|', $line_data) . "\n";
705 }
706
707 file_put_contents($this->getTestArchive() . self::DIR_SEP . self::DATA_INDEX_FILENAME, $output_contents);
708 $this->readArchiveDataIndex();
709 return;
710 }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for.
readArchiveDataIndex()
Reads the archive data index.
determinePassDataPath($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
Determines the pass data path.

References $pass, determinePassDataPath(), getTestArchive(), and readArchiveDataIndex().

Referenced by createPassMaterialsDirectory(), and getPassDataDirectory().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ buildPassDataDirectory()

ilTestArchiver::buildPassDataDirectory (   $active_fi,
  $pass 
)
private

Definition at line 489 of file class.ilTestArchiver.php.

490 {
491 foreach ($this->archive_data_index as $data_index_entry) {
492 if ($data_index_entry != null && $data_index_entry['identifier'] == $active_fi . '|' . $pass) {
493 array_shift($data_index_entry);
494 return $this->getTestArchive() . self::DIR_SEP . implode(self::DIR_SEP, $data_index_entry);
495 }
496 }
497
498 return null;
499 }

References $pass, and getTestArchive().

Referenced by getPassDataDirectory().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ compressTestArchive()

ilTestArchiver::compressTestArchive ( )

Generate the test archive for download.

Returns
void

Definition at line 441 of file class.ilTestArchiver.php.

442 {
443 $this->updateTestArchive();
445
446 $zip_output_path = $this->getZipExportDirectory();
447 $zip_output_filename = 'test_archive_obj_' . $this->test_obj_id . '_' . time() . '_.zip';
448
449 ilUtil::zip($this->getTestArchive(), $zip_output_path . self::DIR_SEP . $zip_output_filename, true);
450 return;
451 }
getZipExportDirectory()
Return the export directory, where zips are placed.
updateTestArchive()
Replaces the test-log with the current one.
static zip($a_dir, $a_file, $compress_content=false)
zips given directory/file into given zip.file

References ensureZipExportDirectoryExists(), getTestArchive(), getZipExportDirectory(), updateTestArchive(), and ilUtil\zip().

+ Here is the call graph for this function:

◆ countFilesInDirectory()

ilTestArchiver::countFilesInDirectory (   $directory,
  $pattern = null 
)
protected

Returns the count of files in a directory, eventually matching the given, optional, pattern.

Parameters
$directory
null | string$pattern
Returns
integer

@noinspection PhpAssignmentInConditionInspection

Definition at line 764 of file class.ilTestArchiver.php.

765 {
766 $filecount = 0;
767
769 if ($handle = opendir($directory)) {
770 while (($file = readdir($handle)) !== false) {
771 if (!in_array($file, array( '.', '..' )) && !is_dir($directory . $file)) {
772 if ($pattern && strpos($file, $pattern) === 0) {
773 $filecount++;
774 }
775 }
776 }
777 }
778 return $filecount;
779 }

Referenced by handInTestResult(), and handInTestResultsOverview().

+ Here is the caller graph for this function:

◆ createArchiveForTest()

ilTestArchiver::createArchiveForTest ( )
protected

Creates the directory for the test archive.

Definition at line 331 of file class.ilTestArchiver.php.

332 {
334 //mkdir( $this->getTestArchive(), 0777, true );
335 }
static makeDirParents($a_dir)
Create a new directory and all parent directories.

References getTestArchive(), and ilUtil\makeDirParents().

Referenced by ensureTestArchiveIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createPassDataDirectory()

ilTestArchiver::createPassDataDirectory (   $active_fi,
  $pass 
)
protected

Creates pass data directory.

Parameters
$active_fiinteger ActiveFI of the participant.
$passinteger Pass number of the test.
Returns
void

Definition at line 483 of file class.ilTestArchiver.php.

484 {
485 mkdir($this->getPassDataDirectory($active_fi, $pass), 0777, true);
486 return;
487 }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.

References $pass, and getPassDataDirectory().

Referenced by ensurePassDataDirectoryIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createPassMaterialsDirectory()

ilTestArchiver::createPassMaterialsDirectory (   $active_fi,
  $pass 
)
protected

Creates pass materials directory.

Parameters
$active_fiinteger ActiveFI of the participant.
$passinteger Pass number of the test.
Returns
void

Definition at line 589 of file class.ilTestArchiver.php.

590 {
591 // Data are taken from the current user as the implementation expects the first interaction of the pass
592 // takes place from the usage/behaviour of the current user.
593
594 if ($this->getParticipantData()) {
595 $usrData = $this->getParticipantData()->getUserDataByActiveId($active_fi);
596 $user = new ilObjUser();
597 $user->setFirstname($usrData['firstname']);
598 $user->setLastname($usrData['lastname']);
599 $user->setMatriculation($usrData['matriculation']);
600 $user->setFirstname($usrData['firstname']);
601 } else {
602 global $DIC;
603 $ilUser = $DIC['ilUser'];
604 $user = $ilUser;
605 }
606
608 date('Y'),
609 $active_fi,
610 $pass,
611 $user->getFirstname(),
612 $user->getLastname(),
613 $user->getMatriculation()
614 );
615 mkdir($this->getPassMaterialsDirectory($active_fi, $pass), 0777, true);
616 }
getPassMaterialsDirectory($active_fi, $pass)
Returns the pass materials directory.
appendToArchiveDataIndex($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
Appends a line to the archive data index.
$ilUser
Definition: imgupload.php:18
$DIC
Definition: xapitoken.php:46

References $DIC, $ilUser, $pass, appendToArchiveDataIndex(), getParticipantData(), and getPassMaterialsDirectory().

Referenced by ensurePassMaterialsDirectoryIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createZipExportDirectory()

ilTestArchiver::createZipExportDirectory ( )
protected

Definition at line 420 of file class.ilTestArchiver.php.

421 {
422 mkdir($this->getZipExportDirectory(), 0777, true);
423 }

References getZipExportDirectory().

Referenced by ensureZipExportDirectoryExists().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ determinePassDataPath()

ilTestArchiver::determinePassDataPath (   $date,
  $active_fi,
  $pass,
  $user_firstname,
  $user_lastname,
  $matriculation 
)
protected

Determines the pass data path.

Parameters
$date
$active_fi
$pass
$user_firstname
$user_lastname
$matriculation
Returns
array

Definition at line 724 of file class.ilTestArchiver.php.

725 {
726 $date = date_create_from_format(DATE_ISO8601, $date);
727 $line = array(
728 'identifier' => $active_fi . '|' . $pass,
729 'yyyy' => date_format($date, 'Y'),
730 'mm' => date_format($date, 'm'),
731 'dd' => date_format($date, 'd'),
732 'directory' => $active_fi . '_' . $pass . '_' . $user_firstname . '_' . $user_lastname . '_' . $matriculation
733 );
734 return $line;
735 }

References $pass.

Referenced by appendToArchiveDataIndex().

+ Here is the caller graph for this function:

◆ ensurePassDataDirectoryIsAvailable()

ilTestArchiver::ensurePassDataDirectoryIsAvailable (   $active_fi,
  $pass 
)
protected

Ensures the availability of the participant data directory.

Checks if the directory exists and creates it if necessary.

Parameters
$active_fiinteger Active-FI of the test participant
$passinteger Pass-number of the actual test
Returns
void

Definition at line 552 of file class.ilTestArchiver.php.

553 {
554 if (!$this->hasPassDataDirectory($active_fi, $pass)) {
555 $this->createPassDataDirectory($active_fi, $pass);
556 }
557 return;
558 }
hasPassDataDirectory($active_fi, $pass)
Checks if the directory for pass data is available.
createPassDataDirectory($active_fi, $pass)
Creates pass data directory.

References $pass, createPassDataDirectory(), and hasPassDataDirectory().

Referenced by handInParticipantMisc(), handInParticipantQuestionMaterial(), handInParticipantSubmission(), and handInTestResult().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ensurePassMaterialsDirectoryIsAvailable()

ilTestArchiver::ensurePassMaterialsDirectoryIsAvailable (   $active_fi,
  $pass 
)
protected

Ensures the availability of the pass materials directory.

Checks if the directory exists and creates it if necessary.

Parameters
$active_fiinteger Active-FI of the test participant
$passinteger Pass-number of the actual test

Definition at line 641 of file class.ilTestArchiver.php.

642 {
643 if (!$this->hasPassMaterialsDirectory($active_fi, $pass)) {
644 $this->createPassMaterialsDirectory($active_fi, $pass);
645 }
646 }
hasPassMaterialsDirectory($active_fi, $pass)
Returns if the pass materials directory exists for a given pass.
createPassMaterialsDirectory($active_fi, $pass)
Creates pass materials directory.

References $pass, createPassMaterialsDirectory(), and hasPassMaterialsDirectory().

+ Here is the call graph for this function:

◆ ensureTestArchiveIsAvailable()

ilTestArchiver::ensureTestArchiveIsAvailable ( )
protected

Ensures the availability of the test archive directory.

Checks if the directory exists and creates it if necessary.

Returns
void

Definition at line 356 of file class.ilTestArchiver.php.

357 {
358 if (!$this->hasTestArchive()) {
359 $this->createArchiveForTest();
360 }
361 return;
362 }
hasTestArchive()
Returns if the archive directory structure for the test the object is created for exists.
createArchiveForTest()
Creates the directory for the test archive.

References createArchiveForTest(), and hasTestArchive().

Referenced by handInBestSolutionQuestionMaterial(), handInParticipantMisc(), handInParticipantQuestionMaterial(), handInParticipantSubmission(), handInTestBestSolution(), handInTestResult(), and handInTestResultsOverview().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ensureZipExportDirectoryExists()

ilTestArchiver::ensureZipExportDirectoryExists ( )

Definition at line 403 of file class.ilTestArchiver.php.

404 {
405 if (!$this->hasZipExportDirectory()) {
407 }
408 }
hasZipExportDirectory()
Returns if the export directory for zips exists.

References createZipExportDirectory(), and hasZipExportDirectory().

Referenced by compressTestArchive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getParticipantData()

ilTestArchiver::getParticipantData ( )
Returns
ilTestParticipantData

Definition at line 117 of file class.ilTestArchiver.php.

118 {
120 }

References $participantData.

Referenced by createPassMaterialsDirectory(), and getPassDataDirectory().

+ Here is the caller graph for this function:

◆ getPassDataDirectory()

ilTestArchiver::getPassDataDirectory (   $active_fi,
  $pass 
)
protected

Returns the pass data directory.

Parameters
$active_fiinteger ActiveFI of the participant.
$passinteger Pass number of the test.
Returns
string $pass_data_directory Path to the pass data directory.

Definition at line 509 of file class.ilTestArchiver.php.

510 {
511 $passDataDir = $this->buildPassDataDirectory($active_fi, $pass);
512
513 if (!$passDataDir) {
514 if ($this->getParticipantData()) {
515 $usrData = $this->getParticipantData()->getUserDataByActiveId($active_fi);
516 $user = new ilObjUser();
517 $user->setFirstname($usrData['firstname']);
518 $user->setLastname($usrData['lastname']);
519 $user->setMatriculation($usrData['matriculation']);
520 $user->setFirstname($usrData['firstname']);
521 } else {
522 global $DIC;
523 $ilUser = $DIC['ilUser'];
524 $user = $ilUser;
525 }
526
528 date(DATE_ISO8601),
529 $active_fi,
530 $pass,
531 $user->getFirstname(),
532 $user->getLastname(),
533 $user->getMatriculation()
534 );
535
536 $passDataDir = $this->buildPassDataDirectory($active_fi, $pass);
537 }
538
539 return $passDataDir;
540 }
buildPassDataDirectory($active_fi, $pass)

References $DIC, $ilUser, $pass, appendToArchiveDataIndex(), buildPassDataDirectory(), and getParticipantData().

Referenced by createPassDataDirectory(), handInParticipantMisc(), handInParticipantQuestionMaterial(), handInParticipantSubmission(), handInTestResult(), and hasPassDataDirectory().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getPassMaterialsDirectory()

ilTestArchiver::getPassMaterialsDirectory (   $active_fi,
  $pass 
)
protected

Returns the pass materials directory.

Parameters
$active_fiinteger ActiveFI of the participant.
$passinteger Pass number.
Returns
string $pass_materials_directory Path to the pass materials directory.

Definition at line 626 of file class.ilTestArchiver.php.

627 {
628 $pass_data_directory = $this->getPassMaterialsDirectory($active_fi, $pass);
629 return $pass_data_directory . self::DIR_SEP . self::PASS_MATERIALS_PATH_COMPONENT;
630 }

References $pass, getPassMaterialsDirectory(), and PASS_MATERIALS_PATH_COMPONENT.

Referenced by createPassMaterialsDirectory(), getPassMaterialsDirectory(), and hasPassMaterialsDirectory().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getTestArchive()

ilTestArchiver::getTestArchive ( )
protected

Returns the (theoretical) path to the archive directory of the test, this object is created for.

Returns
string $test_archive Path to this tests archive directory.

Definition at line 342 of file class.ilTestArchiver.php.

343 {
344 $test_archive_directory = $this->external_directory_path . self::DIR_SEP . $this->client_id . self::DIR_SEP . 'tst_data'
345 . self::DIR_SEP . 'archive' . self::DIR_SEP . 'tst_' . $this->test_obj_id;
346 return $test_archive_directory;
347 }

References $test_obj_id.

Referenced by appendToArchiveDataIndex(), buildPassDataDirectory(), compressTestArchive(), createArchiveForTest(), handInBestSolutionQuestionMaterial(), handInTestBestSolution(), handInTestResultsOverview(), hasTestArchive(), logArchivingProcess(), readArchiveDataIndex(), and updateTestArchive().

+ Here is the caller graph for this function:

◆ getZipExportDirectory()

ilTestArchiver::getZipExportDirectory ( )

Return the export directory, where zips are placed.

Returns
string

Definition at line 430 of file class.ilTestArchiver.php.

431 {
432 return $this->external_directory_path . self::DIR_SEP . $this->client_id . self::DIR_SEP . 'tst_data'
433 . self::DIR_SEP . self::EXPORT_DIRECTORY . self::DIR_SEP . 'tst_' . $this->test_obj_id;
434 }

References $test_obj_id.

Referenced by compressTestArchive(), createZipExportDirectory(), and hasZipExportDirectory().

+ Here is the caller graph for this function:

◆ handInBestSolutionQuestionMaterial()

ilTestArchiver::handInBestSolutionQuestionMaterial (   $question_fi,
  $orginial_filename,
  $file_path 
)

Hands in a file related to a question in context of the best solution.

Parameters
$question_fiinteger QuestionFI of the question, material is to be stored for.
$orginial_filenamestring Original filename of the material to be stored.
$file_pathstring Path to the material to be stored.

Definition at line 245 of file class.ilTestArchiver.php.

246 {
248
249 $best_solution_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_BEST_SOLUTION_PATH_COMPONENT;
250 if (!is_dir($best_solution_path)) {
251 mkdir($best_solution_path, 0777, true);
252 }
253
254 $materials_path = $best_solution_path . self::DIR_SEP . self::TEST_MATERIALS_PATH_COMPONENT;
255 if (!is_dir($materials_path)) {
256 mkdir($materials_path, 0777, true);
257 }
258
259 $question_materials_path = $materials_path . self::DIR_SEP . self::QUESTION_PATH_COMPONENT_PREFIX . $question_fi;
260 if (!is_dir($question_materials_path)) {
261 mkdir($question_materials_path, 0777, true);
262 }
263
264 copy($file_path, $question_materials_path . self::DIR_SEP . $orginial_filename);
265
266 $this->logArchivingProcess(
267 date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
268 . $question_materials_path . self::DIR_SEP . $orginial_filename
269 );
270 }
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
const TEST_BEST_SOLUTION_PATH_COMPONENT
logArchivingProcess($message)
Logs to the archive log.

References ensureTestArchiveIsAvailable(), getTestArchive(), logArchivingProcess(), TEST_BEST_SOLUTION_PATH_COMPONENT, and TEST_MATERIALS_PATH_COMPONENT.

+ Here is the call graph for this function:

◆ handInParticipantMisc()

ilTestArchiver::handInParticipantMisc (   $active_fi,
  $pass,
  $original_filename,
  $file_path 
)

Hands in a participants file, which is relevant for archiving but an unspecified type.

Examples for such are signature files, remarks, feedback or the like.

Parameters
$active_fiinteger Active-FI of the test participant
$passinteger Pass-number of the actual test
$original_filenamestring Original filename of the material to be stored.
$file_pathstring Location of the file to be archived

Definition at line 199 of file class.ilTestArchiver.php.

200 {
202 $this->ensurePassDataDirectoryIsAvailable($active_fi, $pass);
203 $new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP . $original_filename;
204 copy($file_path, $new_path);
205 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $new_path);
206 }
ensurePassDataDirectoryIsAvailable($active_fi, $pass)
Ensures the availability of the participant data directory.

References $pass, ensurePassDataDirectoryIsAvailable(), ensureTestArchiveIsAvailable(), getPassDataDirectory(), and logArchivingProcess().

+ Here is the call graph for this function:

◆ handInParticipantQuestionMaterial()

ilTestArchiver::handInParticipantQuestionMaterial (   $active_fi,
  $pass,
  $question_fi,
  $original_filename,
  $file_path 
)

Hands in a particpants question material, such as an upload or other binary content.

Parameters
$active_fiinteger Active-FI of the test participant
$passinteger Pass-number of the actual test
$question_fiinteger Question-FI of the question, the file is to be stored for.
$original_filenamestring Original filename of the material to be stored.
$file_pathstring Location of the file to be archived

Definition at line 170 of file class.ilTestArchiver.php.

171 {
173 $this->ensurePassDataDirectoryIsAvailable($active_fi, $pass);
174
175 $pass_question_directory = $this->getPassDataDirectory($active_fi, $pass)
176 . self::DIR_SEP . self::QUESTION_PATH_COMPONENT_PREFIX . $question_fi;
177 if (!is_dir($pass_question_directory)) {
178 mkdir($pass_question_directory, 0777, true);
179 }
180
181 copy($file_path, $pass_question_directory . self::DIR_SEP . $original_filename);
182
183 $this->logArchivingProcess(
184 date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
185 . $pass_question_directory . self::DIR_SEP . $original_filename
186 );
187 }

References $pass, ensurePassDataDirectoryIsAvailable(), ensureTestArchiveIsAvailable(), getPassDataDirectory(), and logArchivingProcess().

+ Here is the call graph for this function:

◆ handInParticipantSubmission()

ilTestArchiver::handInParticipantSubmission (   $active_fi,
  $pass,
  $pdf_path,
  $html_string 
)

Hands in a participants test submission ("a completed test") for archiving.

The archive takes an html-string and a path to a PDF-file and saves it according to the archives general structure. The test is identified by active_fi and pass number, allowing to store relevant files even for anonymous tests.

Parameters
$active_fiinteger Active-FI of the test participant
$passinteger Pass-number of the actual test
$html_stringstring HTML-string of the test submission
$pdf_pathstring Path to a pdf representation of the test submission.

Definition at line 144 of file class.ilTestArchiver.php.

145 {
147 $this->ensurePassDataDirectoryIsAvailable($active_fi, $pass);
148
149 $pdf_new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
151 copy($pdf_path, $pdf_new_path);
152 # /home/mbecker/public_html/ilias/trunk-primary/extern/default/tst_data/archive/tst_350/2013/09/19/80_1_root_user_/test_submission.pdf
153 $html_new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
155 file_put_contents($html_new_path, $html_string);
156
157 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $pdf_new_path);
158 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $html_new_path);
159 }

References $pass, ensurePassDataDirectoryIsAvailable(), ensureTestArchiveIsAvailable(), getPassDataDirectory(), HTML_SUBMISSION_FILENAME, logArchivingProcess(), and PDF_SUBMISSION_FILENAME.

+ Here is the call graph for this function:

◆ handInTestBestSolution()

ilTestArchiver::handInTestBestSolution (   $html_string,
  $pdf_path 
)

Hands in the best solution for a test.

Parameters
$html_stringstring HTML-string of the test submission
$pdf_pathstring Path to a pdf representation of the test submission.

Definition at line 214 of file class.ilTestArchiver.php.

215 {
217
218 $best_solution_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_BEST_SOLUTION_PATH_COMPONENT;
219 if (!is_dir($best_solution_path)) {
220 mkdir($best_solution_path, 0777, true);
221 }
222
223 file_put_contents($best_solution_path . self::DIR_SEP . self::HTML_BEST_SOLUTION_FILENAME, $html_string);
224
225 copy($pdf_path, $best_solution_path . self::DIR_SEP . self::PDF_BEST_SOLUTION_FILENAME);
226
227 $this->logArchivingProcess(
228 date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
229 . $best_solution_path . self::DIR_SEP . self::HTML_BEST_SOLUTION_FILENAME
230 );
231
232 $this->logArchivingProcess(
233 date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
234 . $best_solution_path . self::DIR_SEP . self::PDF_BEST_SOLUTION_FILENAME
235 );
236 }

References ensureTestArchiveIsAvailable(), getTestArchive(), logArchivingProcess(), and TEST_BEST_SOLUTION_PATH_COMPONENT.

+ Here is the call graph for this function:

◆ handInTestResult()

ilTestArchiver::handInTestResult (   $active_fi,
  $pass,
  $pdf_path 
)

Hands in an individual test result for a pass.

Parameters
$active_fiinteger ActiveFI of the participant.
$passinteger Pass of the test.
$pdf_pathstring Path to the PDF containing the result.
Returns
void

Definition at line 281 of file class.ilTestArchiver.php.

282 {
284 $this->ensurePassDataDirectoryIsAvailable($active_fi, $pass);
285 $new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
286 . self::TEST_RESULT_FILENAME . ($this->countFilesInDirectory($this->getPassDataDirectory($active_fi, $pass), self::TEST_RESULT_FILENAME))
287 . self::TEST_RESULT_POSTFIX;
288 copy($pdf_path, $new_path);
289 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $new_path);
290 }
countFilesInDirectory($directory, $pattern=null)
Returns the count of files in a directory, eventually matching the given, optional,...

References $pass, countFilesInDirectory(), ensurePassDataDirectoryIsAvailable(), ensureTestArchiveIsAvailable(), getPassDataDirectory(), and logArchivingProcess().

+ Here is the call graph for this function:

◆ handInTestResultsOverview()

ilTestArchiver::handInTestResultsOverview (   $html_string,
  $pdf_path 
)

Hands in a test results overview.

Parameters
$html_stringstring HTML of the test results overview.
$pdf_pathstring Path

Definition at line 298 of file class.ilTestArchiver.php.

299 {
301 $new_pdf_path = $this->getTestArchive() . self::DIR_SEP
302 . self::TEST_OVERVIEW_PDF_FILENAME
303 . $this->countFilesInDirectory($this->getTestArchive(), self::TEST_OVERVIEW_PDF_FILENAME) . self::TEST_OVERVIEW_PDF_POSTFIX;
304 copy($pdf_path, $new_pdf_path);
305 $html_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_OVERVIEW_HTML_FILENAME
306 . $this->countFilesInDirectory($this->getTestArchive(), self::TEST_OVERVIEW_HTML_FILENAME) . self::TEST_OVERVIEW_HTML_POSTFIX;
307 file_put_contents($html_path, $html_string);
308
309 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $new_pdf_path);
310 $this->logArchivingProcess(date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING . $html_path);
311 }

References countFilesInDirectory(), ensureTestArchiveIsAvailable(), getTestArchive(), logArchivingProcess(), TEST_OVERVIEW_HTML_POSTFIX, and TEST_OVERVIEW_PDF_POSTFIX.

+ Here is the call graph for this function:

◆ hasPassDataDirectory()

ilTestArchiver::hasPassDataDirectory (   $active_fi,
  $pass 
)
protected

Checks if the directory for pass data is available.

Parameters
$active_fiinteger ActiveFI of the pass.
$passinteger Pass-number of the pass.
Returns
bool $hasPassDataDirectory True, if the pass data directory exists.

Definition at line 469 of file class.ilTestArchiver.php.

470 {
471 $pass_data_dir = $this->getPassDataDirectory($active_fi, $pass);
472 return is_dir($this->getPassDataDirectory($active_fi, $pass));
473 }

References $pass, and getPassDataDirectory().

Referenced by ensurePassDataDirectoryIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasPassMaterialsDirectory()

ilTestArchiver::hasPassMaterialsDirectory (   $active_fi,
  $pass 
)
protected

Returns if the pass materials directory exists for a given pass.

Parameters
$active_fiinteger ActiveFI for the participant.
$passinteger Pass number.
Returns
bool $hasPassmaterialsDirectory True, if the directory exists.

@noinspection PhpUsageOfSilenceOperatorInspection

Definition at line 572 of file class.ilTestArchiver.php.

573 {
575 if (@is_dir($this->getPassMaterialsDirectory($active_fi, $pass))) {
576 return true;
577 }
578 return false;
579 }

References $pass, and getPassMaterialsDirectory().

Referenced by ensurePassMaterialsDirectoryIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasTestArchive()

ilTestArchiver::hasTestArchive ( )
protected

Returns if the archive directory structure for the test the object is created for exists.

Returns
bool $hasTestArchive True, if the archive directory structure exists.

Definition at line 323 of file class.ilTestArchiver.php.

324 {
325 return is_dir($this->getTestArchive());
326 }

References getTestArchive().

Referenced by ensureTestArchiveIsAvailable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasZipExportDirectory()

ilTestArchiver::hasZipExportDirectory ( )

Returns if the export directory for zips exists.

Returns
bool

Definition at line 415 of file class.ilTestArchiver.php.

416 {
417 return is_dir($this->getZipExportDirectory());
418 }

References getZipExportDirectory().

Referenced by ensureZipExportDirectoryExists().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ logArchivingProcess()

ilTestArchiver::logArchivingProcess (   $message)
protected

Logs to the archive log.

Parameters
$messagestring Complete log message.
Returns
void

Definition at line 744 of file class.ilTestArchiver.php.

745 {
746 $archive = $this->getTestArchive() . self::DIR_SEP . self::ARCHIVE_LOG;
747 if (file_exists($archive)) {
748 $content = file_get_contents($archive) . "\n" . $message;
749 } else {
750 $content = $message;
751 }
752
753 file_put_contents($archive, $content);
754 }
$message
Definition: xapiexit.php:14

References $message, ARCHIVE_LOG, and getTestArchive().

Referenced by handInBestSolutionQuestionMaterial(), handInParticipantMisc(), handInParticipantQuestionMaterial(), handInParticipantSubmission(), handInTestBestSolution(), handInTestResult(), and handInTestResultsOverview().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ readArchiveDataIndex()

ilTestArchiver::readArchiveDataIndex ( )
protected

Reads the archive data index.

Returns
array[array] $archive_data_index Archive data index.

The Archive Data Index is a csv-file containing the following columns <active_fi>|<pass>|<yyyy>|<mm>||<directory>

@noinspection PhpUsageOfSilenceOperatorInspection

Definition at line 655 of file class.ilTestArchiver.php.

656 {
661 $data_index_file = $this->getTestArchive() . self::DIR_SEP . self::DATA_INDEX_FILENAME;
662
663 $contents = array();
664
666 if (@file_exists($data_index_file)) {
667 $lines = explode("\n", file_get_contents($data_index_file));
668 foreach ($lines as $line) {
669 $line_items = explode('|', $line);
670 $line_data['identifier'] = $line_items[0] . '|' . $line_items[1];
671 $line_data['yyyy'] = $line_items[2];
672 $line_data['mm'] = $line_items[3];
673 $line_data['dd'] = $line_items[4];
674 $line_data['directory'] = $line_items[5];
675 $contents[] = $line_data;
676 }
677 }
678 return $contents;
679 }

References DATA_INDEX_FILENAME, and getTestArchive().

Referenced by appendToArchiveDataIndex().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setParticipantData()

ilTestArchiver::setParticipantData (   $participantData)
Parameters
ilTestParticipantData$participantData

Definition at line 125 of file class.ilTestArchiver.php.

126 {
127 $this->participantData = $participantData;
128 }

References $participantData.

◆ updateTestArchive()

ilTestArchiver::updateTestArchive ( )

Replaces the test-log with the current one.

Returns
void

@noinspection PhpAssignmentInConditionInspection

Definition at line 369 of file class.ilTestArchiver.php.

370 {
371 $query = 'SELECT * FROM ass_log WHERE obj_fi = ' . $this->ilDB->quote($this->test_obj_id, 'integer');
372 $result = $this->ilDB->query($query);
373
374 $outfile_lines = '';
376 while ($row = $this->ilDB->fetchAssoc($result)) {
377 $outfile_lines .= "\r\n" . implode("\t", $row);
378 }
379 file_put_contents($this->getTestArchive() . self::DIR_SEP . self::TEST_LOG_FILENAME, $outfile_lines);
380
381 // Generate test pass overview
382 $test = new ilObjTest($this->test_obj_id, false);
383 require_once 'Modules/Test/classes/class.ilParticipantsTestResultsGUI.php';
384 $gui = new ilParticipantsTestResultsGUI();
385 $gui->setTestObj($test);
386 require_once 'Modules/Test/classes/class.ilTestObjectiveOrientedContainer.php';
387 $objectiveOrientedContainer = new ilTestObjectiveOrientedContainer();
388 $gui->setObjectiveParent($objectiveOrientedContainer);
389 $array_of_actives = array();
390 $participants = $test->getParticipants();
391
392 foreach ($participants as $key => $value) {
393 $array_of_actives[] = $key;
394 }
395 $output_template = $gui->createUserResults(true, false, true, $array_of_actives);
396
397 $filename = realpath($this->getTestArchive()) . self::DIR_SEP . 'participant_pass_overview.pdf';
399
400 return;
401 }
$result
$test
Definition: Utf8Test.php:84
$filename
Definition: buildRTE.php:89
static generatePDF($pdf_output, $output_mode, $filename=null, $purpose=null)
const PDF_USER_RESULT
PDF Purposes.
$query

References $filename, $query, $result, $test, ilTestPDFGenerator\generatePDF(), getTestArchive(), ilTestPDFGenerator\PDF_OUTPUT_FILE, and PDF_USER_RESULT.

Referenced by compressTestArchive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ $archive_data_index

ilTestArchiver::$archive_data_index
protected

Definition at line 83 of file class.ilTestArchiver.php.

◆ $client_id

ilTestArchiver::$client_id
protected

Definition at line 81 of file class.ilTestArchiver.php.

◆ $external_directory_path

ilTestArchiver::$external_directory_path
protected

Definition at line 80 of file class.ilTestArchiver.php.

◆ $ilDB

ilTestArchiver::$ilDB
protected

Definition at line 85 of file class.ilTestArchiver.php.

◆ $participantData

ilTestArchiver::$participantData
protected

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

Referenced by getParticipantData(), and setParticipantData().

◆ $test_obj_id

ilTestArchiver::$test_obj_id
protected

Definition at line 82 of file class.ilTestArchiver.php.

Referenced by getTestArchive(), and getZipExportDirectory().

◆ ARCHIVE_LOG

const ilTestArchiver::ARCHIVE_LOG = 'archive.log'

Definition at line 48 of file class.ilTestArchiver.php.

Referenced by logArchivingProcess().

◆ DATA_INDEX_FILENAME

const ilTestArchiver::DATA_INDEX_FILENAME = 'data_index.csv'

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

Referenced by readArchiveDataIndex().

◆ DIR_SEP

const ilTestArchiver::DIR_SEP = '/'

◆ EXPORT_DIRECTORY

const ilTestArchiver::EXPORT_DIRECTORY = 'archive_exports'

Definition at line 50 of file class.ilTestArchiver.php.

◆ HTML_BEST_SOLUTION_FILENAME

const ilTestArchiver::HTML_BEST_SOLUTION_FILENAME = 'best_solution.html'

Definition at line 27 of file class.ilTestArchiver.php.

◆ HTML_SUBMISSION_FILENAME

const ilTestArchiver::HTML_SUBMISSION_FILENAME = 'test_submission.html'

Definition at line 21 of file class.ilTestArchiver.php.

Referenced by handInParticipantSubmission().

◆ LOG_ADDITION_STRING

const ilTestArchiver::LOG_ADDITION_STRING = ' Adding '

Definition at line 41 of file class.ilTestArchiver.php.

◆ LOG_CREATION_STRING

const ilTestArchiver::LOG_CREATION_STRING = ' Creating '

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

◆ LOG_DELETION_STRING

const ilTestArchiver::LOG_DELETION_STRING = ' Deleting '

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

◆ LOG_DTSGROUP_FORMAT

const ilTestArchiver::LOG_DTSGROUP_FORMAT = 'D M j G:i:s T Y'

Definition at line 40 of file class.ilTestArchiver.php.

◆ LOG_UPDATE_STRING

const ilTestArchiver::LOG_UPDATE_STRING = ' Updating '

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

◆ PASS_MATERIALS_PATH_COMPONENT

const ilTestArchiver::PASS_MATERIALS_PATH_COMPONENT = 'materials'

Definition at line 23 of file class.ilTestArchiver.php.

Referenced by getPassMaterialsDirectory().

◆ PDF_BEST_SOLUTION_FILENAME

const ilTestArchiver::PDF_BEST_SOLUTION_FILENAME = 'best_solution.pdf'

Definition at line 28 of file class.ilTestArchiver.php.

◆ PDF_SUBMISSION_FILENAME

const ilTestArchiver::PDF_SUBMISSION_FILENAME = 'test_submission.pdf'

Definition at line 22 of file class.ilTestArchiver.php.

Referenced by handInParticipantSubmission().

◆ QUESTION_PATH_COMPONENT_PREFIX

const ilTestArchiver::QUESTION_PATH_COMPONENT_PREFIX = 'q_'

Definition at line 24 of file class.ilTestArchiver.php.

◆ TEST_BEST_SOLUTION_PATH_COMPONENT

const ilTestArchiver::TEST_BEST_SOLUTION_PATH_COMPONENT = 'best_solution'

◆ TEST_LOG_FILENAME

const ilTestArchiver::TEST_LOG_FILENAME = 'test.log'

Definition at line 46 of file class.ilTestArchiver.php.

◆ TEST_MATERIALS_PATH_COMPONENT

const ilTestArchiver::TEST_MATERIALS_PATH_COMPONENT = 'materials'

Definition at line 29 of file class.ilTestArchiver.php.

Referenced by handInBestSolutionQuestionMaterial().

◆ TEST_OVERVIEW_HTML_FILENAME

const ilTestArchiver::TEST_OVERVIEW_HTML_FILENAME = 'results_overview_pdf_v'

Definition at line 37 of file class.ilTestArchiver.php.

◆ TEST_OVERVIEW_HTML_POSTFIX

const ilTestArchiver::TEST_OVERVIEW_HTML_POSTFIX = '.html'

Definition at line 38 of file class.ilTestArchiver.php.

Referenced by handInTestResultsOverview().

◆ TEST_OVERVIEW_PDF_FILENAME

const ilTestArchiver::TEST_OVERVIEW_PDF_FILENAME = 'results_overview_html_v'

Definition at line 34 of file class.ilTestArchiver.php.

◆ TEST_OVERVIEW_PDF_POSTFIX

const ilTestArchiver::TEST_OVERVIEW_PDF_POSTFIX = '.pdf'

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

Referenced by handInTestResultsOverview().

◆ TEST_RESULT_FILENAME

const ilTestArchiver::TEST_RESULT_FILENAME = 'test_result_v'

Definition at line 31 of file class.ilTestArchiver.php.

◆ TEST_RESULT_POSTFIX

const ilTestArchiver::TEST_RESULT_POSTFIX = '.pdf'

Definition at line 32 of file class.ilTestArchiver.php.


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