Moodle Import - Restore 3.x backups #2734

pull/2789/head
Angel Fernando Quiroz Campos 7 years ago
parent 471c5cc00d
commit 8f8485a0e8
  1. 15
      main/coursecopy/import_moodle.php
  2. 98
      main/inc/lib/MoodleImport.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')
);
}
}

@ -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;
}
/**

Loading…
Cancel
Save