ILIAS  release_4-4 Revision
ilTestArchiver Class Reference

Class ilTestArchiver. More...

+ Collaboration diagram for ilTestArchiver:

Public Member Functions

 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
 

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 629 of file class.ilTestArchiver.php.

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

Referenced by createPassMaterialsDirectory(), and getPassDataDirectory().

630  {
631  $line = $this->determinePassDataPath( $date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation );
632 
633  $this->archive_data_index[] = $line;
634  $output_contents = '';
635 
636  foreach ($this->archive_data_index as $line_data)
637  {
638  if($line_data['identifier'] == "|")
639  {
640  continue;
641  }
642  $output_contents .= implode('|', $line_data) . "\n";
643  }
644 
645  file_put_contents($this->getTestArchive() . self::DIR_SEP . self::DATA_INDEX_FILENAME, $output_contents);
646  $this->readArchiveDataIndex();
647  return;
648  }
determinePassDataPath($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
Determines the pass data path.
readArchiveDataIndex()
Reads the archive data index.
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
+ 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 419 of file class.ilTestArchiver.php.

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

420  {
421  $this->updateTestArchive();
423 
424  $zip_output_path = $this->getZipExportDirectory();
425  $zip_output_filename = 'test_archive_obj_'.$this->test_obj_id . '_' . time() . '_.zip';
426 
427  ilUtil::zip($this->getTestArchive(), $zip_output_path . self::DIR_SEP . $zip_output_filename, true);
428  return;
429  }
getZipExportDirectory()
Return the export directory, where zips are placed.
static zip($a_dir, $a_file, $compress_content=false)
zips given directory/file into given zip.file
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
updateTestArchive()
Replaces the test-log with the current one.
+ 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

PhpAssignmentInConditionInspection

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

References $file.

Referenced by handInTestResult(), and handInTestResultsOverview().

699  {
700  $filecount = 0;
701 
703  if ($handle = opendir( $directory ))
704  {
705  while (($file = readdir( $handle )) !== false)
706  {
707  if (!in_array( $file, array( '.', '..' ) ) && !is_dir( $directory . $file ))
708  {
709  if ($pattern && strpos($file, $pattern) === 0 )
710  {
711  $filecount++;
712  }
713  }
714  }
715  }
716  return $filecount;
717  }
print $file
+ Here is the caller graph for this function:

◆ createArchiveForTest()

ilTestArchiver::createArchiveForTest ( )
protected

Creates the directory for the test archive.

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

References getTestArchive().

Referenced by ensureTestArchiveIsAvailable().

310  {
311  mkdir( $this->getTestArchive(), 0777, true );
312  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
+ 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 461 of file class.ilTestArchiver.php.

References $pass, and getPassDataDirectory().

Referenced by ensurePassDataDirectoryIsAvailable().

462  {
463  mkdir($this->getPassDataDirectory($active_fi, $pass), 0777, true);
464  return;
465  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
+ 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 541 of file class.ilTestArchiver.php.

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

Referenced by ensurePassMaterialsDirectoryIsAvailable().

542  {
543  // Data are taken from the current user as the implementation expects the first interaction of the pass
544  // takes place from the usage/behaviour of the current user.
545  global $ilUser;
546 
547  $this->appendToArchiveDataIndex(date('Y'), $active_fi, $pass, $ilUser->getFirstname(), $ilUser->getLastname(), $ilUser->getMatriculation());
548  mkdir($this->getPassMaterialsDirectory($active_fi, $pass) , 0777, true );
549  }
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.
global $ilUser
Definition: imgupload.php:15
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createZipExportDirectory()

ilTestArchiver::createZipExportDirectory ( )
protected

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

References getZipExportDirectory().

Referenced by ensureZipExportDirectoryExists().

399  {
400  mkdir($this->getZipExportDirectory(), 0777, true);
401  }
getZipExportDirectory()
Return the export directory, where zips are placed.
+ 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 662 of file class.ilTestArchiver.php.

References $pass.

Referenced by appendToArchiveDataIndex().

663  {
664  $date = date_create_from_format(DATE_ISO8601, $date);
665  $line = array(
666  'identifier' => $active_fi . '|' . $pass,
667  'yyyy' => date_format( $date, 'Y' ),
668  'mm' => date_format( $date, 'm' ),
669  'dd' => date_format( $date, 'd' ),
670  'directory' => $active_fi . '_' . $pass . '_' . $user_firstname . '_' . $user_lastname . '_' . $matriculation
671  );
672  return $line;
673  }
+ 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 502 of file class.ilTestArchiver.php.

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

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

503  {
504  if (!$this->hasPassDataDirectory( $active_fi, $pass ))
505  {
506  $this->createPassDataDirectory( $active_fi, $pass );
507  }
508  return;
509  }
createPassDataDirectory($active_fi, $pass)
Creates pass data directory.
hasPassDataDirectory($active_fi, $pass)
Checks if the directory for pass data is available.
+ 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 574 of file class.ilTestArchiver.php.

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

575  {
576  if (!$this->hasPassMaterialsDirectory( $active_fi, $pass ))
577  {
578  $this->createPassMaterialsDirectory( $active_fi, $pass );
579  }
580  }
hasPassMaterialsDirectory($active_fi, $pass)
Returns if the pass materials directory exists for a given pass.
createPassMaterialsDirectory($active_fi, $pass)
Creates pass materials directory.
+ 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 333 of file class.ilTestArchiver.php.

References createArchiveForTest(), and hasTestArchive().

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

334  {
335  if (!$this->hasTestArchive())
336  {
337  $this->createArchiveForTest();
338  }
339  return;
340  }
createArchiveForTest()
Creates the directory for the test archive.
hasTestArchive()
Returns if the archive directory structure for the test the object is created for exists...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ensureZipExportDirectoryExists()

ilTestArchiver::ensureZipExportDirectoryExists ( )

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

References createZipExportDirectory(), and hasZipExportDirectory().

Referenced by compressTestArchive().

381  {
382  if (!$this->hasZipExportDirectory())
383  {
384  $this->createZipExportDirectory();
385  }
386  }
hasZipExportDirectory()
Returns if the export directory for zips exists.
+ Here is the call graph for this function:
+ 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 475 of file class.ilTestArchiver.php.

References $ilUser, $pass, appendToArchiveDataIndex(), and getTestArchive().

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

476  {
477  foreach ($this->archive_data_index as $data_index_entry)
478  {
479  if ( $data_index_entry != null && $data_index_entry['identifier'] == $active_fi.'|'.$pass )
480  {
481  array_shift($data_index_entry);
482  return $this->getTestArchive() . self::DIR_SEP . implode(self::DIR_SEP, $data_index_entry);
483  }
484  }
485  global $ilUser;
486  $this->appendToArchiveDataIndex(date(DATE_ISO8601), $active_fi, $pass, $ilUser->getFirstname(), $ilUser->getLastname(), $ilUser->getMatriculation());
487  $data_index_entry = $this->getPassDataDirectory($active_fi, $pass);
488  @array_shift($data_index_entry);
489  return $this->getTestArchive() . self::DIR_SEP . implode(self::DIR_SEP, $data_index_entry);
490  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
appendToArchiveDataIndex($date, $active_fi, $pass, $user_firstname, $user_lastname, $matriculation)
Appends a line to the archive data index.
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
global $ilUser
Definition: imgupload.php:15
+ 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 559 of file class.ilTestArchiver.php.

References $pass.

Referenced by createPassMaterialsDirectory(), and hasPassMaterialsDirectory().

560  {
561  $pass_data_directory = $this->getPassMaterialsDirectory($active_fi, $pass);
562  return $pass_data_directory . self::DIR_SEP . self::PASS_MATERIALS_PATH_COMPONENT;
563  }
getPassMaterialsDirectory($active_fi, $pass)
Returns the pass materials directory.
+ 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 319 of file class.ilTestArchiver.php.

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

320  {
321  $test_archive_directory = $this->external_directory_path . self::DIR_SEP . $this->client_id . self::DIR_SEP . 'tst_data'
322  . self::DIR_SEP . 'archive' . self::DIR_SEP . 'tst_'.$this->test_obj_id;
323  return $test_archive_directory;
324  }
+ Here is the caller graph for this function:

◆ getZipExportDirectory()

ilTestArchiver::getZipExportDirectory ( )

Return the export directory, where zips are placed.

Returns
string

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

References $test_obj_id.

Referenced by compressTestArchive(), createZipExportDirectory(), hasZipExportDirectory(), and ilTestExportGUI\listExportFiles().

409  {
410  return $this->external_directory_path . self::DIR_SEP . $this->client_id . self::DIR_SEP . 'tst_data'
411  . self::DIR_SEP . self::EXPORT_DIRECTORY . self::DIR_SEP . 'tst_' . $this->test_obj_id;
412  }
+ 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 221 of file class.ilTestArchiver.php.

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

222  {
224 
225  $best_solution_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_BEST_SOLUTION_PATH_COMPONENT;
226  if ( !is_dir( $best_solution_path ) )
227  {
228  mkdir( $best_solution_path , 0777, true);
229  }
230 
231  $materials_path = $best_solution_path . self::DIR_SEP . self::TEST_MATERIALS_PATH_COMPONENT;
232  if ( !is_dir( $materials_path ) )
233  {
234  mkdir( $materials_path , 0777, true);
235  }
236 
237  $question_materials_path = $materials_path . self::DIR_SEP . self::QUESTION_PATH_COMPONENT_PREFIX . $question_fi;
238  if ( !is_dir( $question_materials_path ) )
239  {
240  mkdir( $question_materials_path , 0777, true);
241  }
242 
243  copy( $file_path, $question_materials_path . self::DIR_SEP . $orginial_filename );
244 
245  $this->logArchivingProcess(
246  date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
247  . $question_materials_path . self::DIR_SEP . $orginial_filename);
248  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 176 of file class.ilTestArchiver.php.

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

177  {
179  $this->ensurePassDataDirectoryIsAvailable( $active_fi, $pass );
180  $new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP . $original_filename;
181  copy( $file_path, $new_path );
182  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $new_path );
183  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
ensurePassDataDirectoryIsAvailable($active_fi, $pass)
Ensures the availability of the participant data directory.
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 146 of file class.ilTestArchiver.php.

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

147  {
149  $this->ensurePassDataDirectoryIsAvailable( $active_fi, $pass );
150 
151  $pass_question_directory = $this->getPassDataDirectory( $active_fi, $pass )
152  . self::DIR_SEP . self::QUESTION_PATH_COMPONENT_PREFIX . $question_fi;
153  if ( !is_dir( $pass_question_directory ) )
154  {
155  mkdir( $pass_question_directory , 0777, true );
156  }
157 
158  copy( $file_path, $pass_question_directory . self::DIR_SEP. $original_filename );
159 
160  $this->logArchivingProcess(
161  date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
162  . $pass_question_directory . self::DIR_SEP. $original_filename
163  );
164  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
ensurePassDataDirectoryIsAvailable($active_fi, $pass)
Ensures the availability of the participant data directory.
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 120 of file class.ilTestArchiver.php.

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

121  {
123  $this->ensurePassDataDirectoryIsAvailable( $active_fi, $pass );
124 
125  $pdf_new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
126  . self::PDF_SUBMISSION_FILENAME;
127  copy( $pdf_path, $pdf_new_path );
128 # /home/mbecker/public_html/ilias/trunk-primary/extern/default/tst_data/archive/tst_350/2013/09/19/80_1_root_user_/test_submission.pdf
129  $html_new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
130  . self::HTML_SUBMISSION_FILENAME;
131  file_put_contents($html_new_path, $html_string);
132 
133  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $pdf_new_path );
134  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $html_new_path );
135  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
ensurePassDataDirectoryIsAvailable($active_fi, $pass)
Ensures the availability of the participant data directory.
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 191 of file class.ilTestArchiver.php.

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

192  {
194 
195  $best_solution_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_BEST_SOLUTION_PATH_COMPONENT;
196  if ( !is_dir( $best_solution_path ) )
197  {
198  mkdir( $best_solution_path , 0777, true );
199  }
200 
201  file_put_contents( $best_solution_path . self::DIR_SEP . self::HTML_BEST_SOLUTION_FILENAME, $html_string );
202 
203  copy( $pdf_path, $best_solution_path . self::DIR_SEP . self::PDF_BEST_SOLUTION_FILENAME );
204 
205  $this->logArchivingProcess(
206  date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
207  . $best_solution_path . self::DIR_SEP . self::HTML_BEST_SOLUTION_FILENAME);
208 
209  $this->logArchivingProcess(
210  date(self::LOG_DTSGROUP_FORMAT) . self::LOG_ADDITION_STRING
211  . $best_solution_path . self::DIR_SEP . self::PDF_BEST_SOLUTION_FILENAME);
212  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 259 of file class.ilTestArchiver.php.

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

Referenced by ilTestScoring\recalculatePasses().

260  {
262  $this->ensurePassDataDirectoryIsAvailable( $active_fi, $pass );
263  $new_path = $this->getPassDataDirectory($active_fi, $pass) . self::DIR_SEP
264  . self::TEST_RESULT_FILENAME . ($this->countFilesInDirectory( $this->getPassDataDirectory($active_fi, $pass), self::TEST_RESULT_FILENAME ))
265  . self::TEST_RESULT_POSTFIX;
266  copy( $pdf_path, $new_path );
267  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $new_path );
268  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
countFilesInDirectory($directory, $pattern=null)
Returns the count of files in a directory, eventually matching the given, optional, pattern.
ensurePassDataDirectoryIsAvailable($active_fi, $pass)
Ensures the availability of the participant data directory.
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ Here is the call graph for this function:
+ Here is the caller 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 276 of file class.ilTestArchiver.php.

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

277  {
279  $new_pdf_path = $this->getTestArchive() . self::DIR_SEP
280  . self::TEST_OVERVIEW_PDF_FILENAME
281  . $this->countFilesInDirectory($this->getTestArchive(), self::TEST_OVERVIEW_PDF_FILENAME) . self::TEST_OVERVIEW_PDF_POSTFIX;
282  copy( $pdf_path, $new_pdf_path );
283  $html_path = $this->getTestArchive() . self::DIR_SEP . self::TEST_OVERVIEW_HTML_FILENAME
284  . $this->countFilesInDirectory($this->getTestArchive(), self::TEST_OVERVIEW_HTML_FILENAME) . self::TEST_OVERVIEW_HTML_POSTFIX;
285  file_put_contents($html_path, $html_string);
286 
287  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $new_pdf_path );
288  $this->logArchivingProcess( date( self::LOG_DTSGROUP_FORMAT ) . self::LOG_ADDITION_STRING . $html_path );
289  }
countFilesInDirectory($directory, $pattern=null)
Returns the count of files in a directory, eventually matching the given, optional, pattern.
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
ensureTestArchiveIsAvailable()
Ensures the availability of the test archive directory.
logArchivingProcess($message)
Logs to the archive log.
+ 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 447 of file class.ilTestArchiver.php.

References $pass, and getPassDataDirectory().

Referenced by ensurePassDataDirectoryIsAvailable().

448  {
449  $pass_data_dir = $this->getPassDataDirectory($active_fi, $pass);
450  return is_dir($this->getPassDataDirectory($active_fi, $pass));
451  }
getPassDataDirectory($active_fi, $pass)
Returns the pass data directory.
+ 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.

PhpUsageOfSilenceOperatorInspection

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

References $pass, and getPassMaterialsDirectory().

Referenced by ensurePassMaterialsDirectoryIsAvailable().

524  {
526  if ( @is_dir( $this->getPassMaterialsDirectory($active_fi, $pass)) )
527  {
528  return true;
529  }
530  return false;
531  }
getPassMaterialsDirectory($active_fi, $pass)
Returns the pass materials directory.
+ 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 301 of file class.ilTestArchiver.php.

References getTestArchive().

Referenced by ensureTestArchiveIsAvailable().

302  {
303  return is_dir($this->getTestArchive());
304  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
+ 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 393 of file class.ilTestArchiver.php.

References getZipExportDirectory().

Referenced by ensureZipExportDirectoryExists().

394  {
395  return is_dir($this->getZipExportDirectory());
396  }
getZipExportDirectory()
Return the export directory, where zips are placed.
+ 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 682 of file class.ilTestArchiver.php.

References getTestArchive().

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

683  {
684  $archive = $this->getTestArchive() . self::DIR_SEP . self::ARCHIVE_LOG;
685  file_put_contents($archive, file_get_contents($archive) . "\n" . $message);
686 
687  return;
688  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
+ 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>

PhpUsageOfSilenceOperatorInspection

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

References getTestArchive().

Referenced by appendToArchiveDataIndex().

590  {
595  $data_index_file = $this->getTestArchive() . self::DIR_SEP . self::DATA_INDEX_FILENAME;
596 
597  $contents = array();
598 
600  if ( @file_exists( $data_index_file ) )
601  {
602  $lines = explode( "\n", file_get_contents( $data_index_file ) );
603  foreach ($lines as $line)
604  {
605  $line_items = explode('|', $line);
606  $line_data['identifier'] = $line_items[0] . '|' . $line_items[1];
607  $line_data['yyyy'] = $line_items[2];
608  $line_data['mm'] = $line_items[3];
609  $line_data['dd'] = $line_items[4];
610  $line_data['directory'] = $line_items[5];
611  $contents[] = $line_data;
612  }
613  }
614  return $contents;
615  }
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ updateTestArchive()

ilTestArchiver::updateTestArchive ( )

Replaces the test-log with the current one.

Returns
void

PhpAssignmentInConditionInspection

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

References $filename, $query, $result, $row, $test, ilDB\fetchAssoc(), ilTestPDFGenerator\generatePDF(), getTestArchive(), ilTestPDFGenerator\PDF_OUTPUT_FILE, ilDB\query(), and ilDB\quote().

Referenced by compressTestArchive().

348  {
349  $query = 'SELECT * FROM ass_log WHERE obj_fi = ' . $this->ilDB->quote($this->test_obj_id, 'integer');
350  $result = $this->ilDB->query($query);
351 
352  $outfile_lines = '';
354  while ($row = $this->ilDB->fetchAssoc($result))
355  {
356  $outfile_lines .= "\r\n" . implode("\t", $row);
357  }
358  file_put_contents($this->getTestArchive() . self::DIR_SEP . self::TEST_LOG_FILENAME, $outfile_lines);
359 
360  // Generate test pass overview
361  $test = new ilObjTest($this->test_obj_id, false);
362  $gui = new ilObjTestGUI();
363  $gui->object = $test;
364  $array_of_actives = array();
365  $participants = $test->getParticipants();
366 
367  foreach($participants as $key => $value)
368  {
369  $array_of_actives[] = $key;
370  }
371  $output_template = $gui->createUserResults(true, false, true, $array_of_actives);
372 
373  require_once 'class.ilTestPDFGenerator.php';
374  $filename = $this->getTestArchive() . self::DIR_SEP . 'participant_pass_overview.pdf';
376 
377  return;
378  }
Class ilObjTestGUI.
$result
query($sql, $a_handle_error=true)
Query.
fetchAssoc($a_set)
Fetch row as associative array from result set.
quote($a_query, $a_type=null)
Wrapper for quote method.
$filename
Definition: buildRTE.php:89
getTestArchive()
Returns the (theoretical) path to the archive directory of the test, this object is created for...
Database Wrapper.
Definition: class.ilDB.php:28
static generatePDF($pdf_output, $output_mode, $filename=null)
$test
Definition: Utf8Test.php:85
+ 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.

◆ $test_obj_id

ilTestArchiver::$test_obj_id
protected

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

Referenced by getZipExportDirectory().

◆ ARCHIVE_LOG

const ilTestArchiver::ARCHIVE_LOG = 'archive.log'

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

◆ DATA_INDEX_FILENAME

const ilTestArchiver::DATA_INDEX_FILENAME = 'data_index.csv'

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

◆ 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.

◆ 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.

◆ 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.

◆ 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'

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

◆ 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.

◆ 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.

◆ 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.

◆ 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: