From 3482ea90a6e296aa2161e507f10a98355f746259 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Mon, 9 Jul 2018 11:05:57 +0800 Subject: [PATCH] MDL-62849 files lib: Add method to return all files. Added a function which returns all the files from all directories in the draftarea. --- lib/filelib.php | 28 ++++++++++++++++++++++ lib/form/filemanager.php | 4 ++-- lib/tests/filelib_test.php | 49 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/lib/filelib.php b/lib/filelib.php index a8c844a2b1c..2d189a3963a 100644 --- a/lib/filelib.php +++ b/lib/filelib.php @@ -757,6 +757,34 @@ function file_get_drafarea_files($draftitemid, $filepath = '/') { return $data; } +/** + * Returns all of the files in the draftarea. + * + * @param int $draftitemid The draft item ID + * @param string $filepath path for the uploaded files. + * @return array An array of files associated with this draft item id. + */ +function file_get_all_files_in_draftarea(int $draftitemid, string $filepath = '/') : array { + $files = []; + $draftfiles = file_get_drafarea_files($draftitemid, $filepath); + file_get_drafarea_folders($draftitemid, $filepath, $draftfiles); + + if (!empty($draftfiles)) { + foreach ($draftfiles->list as $draftfile) { + if ($draftfile->type == 'file') { + $files[] = $draftfile; + } + } + + if (isset($draftfiles->children)) { + foreach ($draftfiles->children as $draftfile) { + $files = array_merge($files, file_get_all_files_in_draftarea($draftitemid, $draftfile->filepath)); + } + } + } + return $files; +} + /** * Returns draft area itemid for a given element. * diff --git a/lib/form/filemanager.php b/lib/form/filemanager.php index 71686d01b67..26c2271e0d4 100644 --- a/lib/form/filemanager.php +++ b/lib/form/filemanager.php @@ -333,7 +333,7 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element implements temp return; } - $draftfiles = file_get_drafarea_files($value); + $draftfiles = file_get_all_files_in_draftarea($value); $wrongfiles = array(); if (empty($draftfiles)) { @@ -341,7 +341,7 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element implements temp return; } - foreach ($draftfiles->list as $file) { + foreach ($draftfiles as $file) { if (!$filetypesutil->is_allowed_file_type($file->filename, $whitelist)) { $wrongfiles[] = $file->filename; } diff --git a/lib/tests/filelib_test.php b/lib/tests/filelib_test.php index 01d03bdbd0e..a6ff45fe042 100644 --- a/lib/tests/filelib_test.php +++ b/lib/tests/filelib_test.php @@ -1424,6 +1424,55 @@ EOF; $this->assertContains($file->get_filename(), $expected); } } + + /** + * Test that all files in the draftarea are returned. + */ + public function test_file_get_all_files_in_draftarea() { + $this->resetAfterTest(); + $this->setAdminUser(); + + $filerecord = ['filename' => 'basepic.jpg']; + $file = self::create_draft_file($filerecord); + + $secondrecord = [ + 'filename' => 'infolder.jpg', + 'filepath' => '/assignment/', + 'itemid' => $file->get_itemid() + ]; + $file = self::create_draft_file($secondrecord); + + $thirdrecord = [ + 'filename' => 'deeperfolder.jpg', + 'filepath' => '/assignment/pics/', + 'itemid' => $file->get_itemid() + ]; + $file = self::create_draft_file($thirdrecord); + + $fourthrecord = [ + 'filename' => 'differentimage.jpg', + 'filepath' => '/secondfolder/', + 'itemid' => $file->get_itemid() + ]; + $file = self::create_draft_file($fourthrecord); + + // This record has the same name as the last record, but it's in a different folder. + // Just checking this is also returned. + $fifthrecord = [ + 'filename' => 'differentimage.jpg', + 'filepath' => '/assignment/pics/', + 'itemid' => $file->get_itemid() + ]; + $file = self::create_draft_file($fifthrecord); + + $allfiles = file_get_all_files_in_draftarea($file->get_itemid()); + $this->assertCount(5, $allfiles); + $this->assertEquals($filerecord['filename'], $allfiles[0]->filename); + $this->assertEquals($secondrecord['filename'], $allfiles[1]->filename); + $this->assertEquals($thirdrecord['filename'], $allfiles[2]->filename); + $this->assertEquals($fourthrecord['filename'], $allfiles[3]->filename); + $this->assertEquals($fifthrecord['filename'], $allfiles[4]->filename); + } } /**