Переглянути джерело

Moodle Import - Restore 3.x backups #2734

Angel Fernando Quiroz Campos 6 роки тому
батько
коміт
8f8485a0e8
2 змінених файлів з 66 додано та 47 видалено
  1. 6 9
      main/coursecopy/import_moodle.php
  2. 60 38
      main/inc/lib/MoodleImport.php

+ 6 - 9
main/coursecopy/import_moodle.php

@@ -35,21 +35,18 @@ $form->addButtonImport(get_lang('Import'));
 
 if ($form->validate()) {
     $file = $_FILES['moodle_file'];
+
     $moodleImport = new MoodleImport();
-    $responseImport = $moodleImport->import($file);
 
-    Display::cleanFlashMessages();
+    try {
+        $responseImport = $moodleImport->import($file);
 
-    if ($responseImport) {
         Display::addFlash(
-            Display::return_message(
-                get_lang('MoodleFileImportedSuccessfully'),
-                'success'
-            )
+            Display::return_message(get_lang('MoodleFileImportedSuccessfully'), 'success')
         );
-    } else {
+    } catch (Exception $exception) {
         Display::addFlash(
-            Display::return_message(get_lang('ErrorImportingFile'), 'error')
+            Display::return_message($exception->getMessage(), 'error')
         );
     }
 }

+ 60 - 38
main/inc/lib/MoodleImport.php

@@ -16,49 +16,81 @@ class MoodleImport
      *
      * @param resource $uploadedFile *.* mbz file moodle course backup
      *
+     * @throws Exception
+     *
      * @return bool
      */
     public function import($uploadedFile)
     {
-        $file = $uploadedFile['tmp_name'];
-
-        if (!is_file($file) || !is_readable($file)) {
-            return false;
+        if (UPLOAD_ERR_OK !== $uploadedFile['error']) {
+            throw new Exception(get_lang('UploadError'));
         }
 
-        $package = new PclZip($file);
-        $mainFileKey = 0;
-        $packageContent = $package->listContent();
-        if (!empty($packageContent)) {
-            foreach ($packageContent as $index => $value) {
-                if ($value['filename'] == 'moodle_backup.xml') {
-                    $mainFileKey = $index;
-                    break;
-                }
-            }
+        $cachePath = api_get_path(SYS_ARCHIVE_PATH);
+        $tempPath = $uploadedFile['tmp_name'];
+        $nameParts = explode('.', $uploadedFile['name']);
+        $extension = array_pop($nameParts);
+        $name = basename($tempPath).".$extension";
+
+        if (!move_uploaded_file($tempPath, api_get_path(SYS_ARCHIVE_PATH).$name)) {
+            throw new Exception(get_lang('UploadError'));
         }
 
-        if (!$mainFileKey) {
-            Display::addFlash(
-                Display::return_message(
-                    get_lang('FailedToImportThisIsNotAMoodleFile'),
-                    'error'
-                )
-            );
+        $filePath = $cachePath.$name;
 
-            return false;
+        if (!is_readable($filePath)) {
+            throw new Exception(get_lang('UploadError'));
         }
 
+        $mimeType = mime_content_type($filePath);
+
         $folder = api_get_unique_id();
         $destinationDir = api_get_path(SYS_ARCHIVE_PATH).$folder;
+
+        mkdir($destinationDir, api_get_permissions_for_new_directories(), true);
+
+        switch ($mimeType) {
+            case 'application/x-gzip':
+                $backUpFile = new PharData($filePath);
+
+                if (false === $backUpFile->extractTo($destinationDir)) {
+                    throw new Exception(get_lang('ErrorImportingFile'));
+                }
+
+                if (!file_exists($destinationDir.'/moodle_backup.xml')) {
+                    throw new Exception(get_lang('FailedToImportThisIsNotAMoodleFile'));
+                }
+
+                break;
+            case 'application/zip':
+                $package = new PclZip($filePath);
+                $mainFileKey = 0;
+                $packageContent = $package->listContent();
+
+                if (!empty($packageContent)) {
+                    foreach ($packageContent as $index => $value) {
+                        if ($value['filename'] == 'moodle_backup.xml') {
+                            $mainFileKey = $index;
+                            break;
+                        }
+                    }
+                }
+
+                if (!$mainFileKey) {
+                    throw new Exception(get_lang('FailedToImportThisIsNotAMoodleFile'));
+                }
+
+                $package->extract(PCLZIP_OPT_PATH, $destinationDir);
+
+                break;
+        }
+
         $coursePath = api_get_course_path();
         $sessionId = api_get_session_id();
         $groupId = api_get_group_id();
         $documentPath = api_get_path(SYS_COURSE_PATH).$coursePath.'/document';
         $courseInfo = api_get_course_info();
 
-        mkdir($destinationDir, api_get_permissions_for_new_directories(), true);
-
         create_unexisting_directory(
             $courseInfo,
             api_get_user_id(),
@@ -71,11 +103,6 @@ class MoodleImport
             0
         );
 
-        $package->extract(
-            PCLZIP_OPT_PATH,
-            $destinationDir
-        );
-
         // This process will upload all question resource files
         $filesXml = @file_get_contents($destinationDir.'/files.xml');
         $mainFileModuleValues = $this->getAllQuestionFiles($filesXml);
@@ -128,15 +155,9 @@ class MoodleImport
 
         if (empty($res)) {
             removeDir($destinationDir);
+            unlink($filePath);
 
-            Display::addFlash(
-                Display::return_message(
-                    get_lang('FailedToImportThisIsNotAMoodleFile'),
-                    'error'
-                )
-            );
-
-            return false;
+            throw new Exception(get_lang('FailedToImportThisIsNotAMoodleFile'));
         }
         $activities = $doc->getElementsByTagName('activity');
         foreach ($activities as $activity) {
@@ -345,8 +366,9 @@ class MoodleImport
         }
 
         removeDir($destinationDir);
+        unlink($filePath);
 
-        return $packageContent[$mainFileKey];
+        return true;
     }
 
     /**