From 7c2e9f49ba0a277845ddab00a1047ff17f04fe09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Loguercio?= Date: Thu, 7 Jul 2016 20:12:12 -0500 Subject: [PATCH] WIP - MoodleImport 90% --- main/coursecopy/import_moodle.php | 4 +- main/inc/lib/MoodleImport.lib.php | 198 +++++++++++++++++++++++++++++- 2 files changed, 196 insertions(+), 6 deletions(-) diff --git a/main/coursecopy/import_moodle.php b/main/coursecopy/import_moodle.php index edbabd2cac..14b351051a 100644 --- a/main/coursecopy/import_moodle.php +++ b/main/coursecopy/import_moodle.php @@ -39,9 +39,9 @@ $form->addFile('moodle_file', get_lang('MoodleFile')); $form->addButtonImport(get_lang('Import')); if ($form->validate()) { - $file = $_FILES['moodle_file']['tmp_name']; + $file = $_FILES['moodle_file']; $moodleImport = new MoodleImport(); - var_dump($moodleImport->readMoodleFile($file)); + $moodleImport->readMoodleFile($file); } $templateName = get_lang('ImportFromMoodle'); diff --git a/main/inc/lib/MoodleImport.lib.php b/main/inc/lib/MoodleImport.lib.php index 4e89b690d3..96f23ebc48 100644 --- a/main/inc/lib/MoodleImport.lib.php +++ b/main/inc/lib/MoodleImport.lib.php @@ -11,15 +11,205 @@ class MoodleImport { /** - * @param resource $file *.* mbz file moodle course backup + * Read and validate the moodleFile + * + * @param resource $uploadedFile *.* mbz file moodle course backup * @return bool */ - public function readMoodleFile($file) + public function readMoodleFile($uploadedFile) { - if (is_file($file) && is_readable($file) && ($xml = @file_get_contents($file))) { + $file = $uploadedFile['tmp_name']; + + if (is_file($file) && is_readable($file)) { $package = new PclZip($file); $packageContent = $package->listContent(); - return $packageContent; + $mainFileKey = 0; + foreach ($packageContent as $index => $value) { + if ($value['filename'] == 'moodle_backup.xml') { + $mainFileKey = $index; + break; + } + } + + if (!$mainFileKey) { + Display::addFlash(Display::return_message(get_lang('FailedToImportThisIsNotAMoodleFile'), 'error')); + } + + $folder = api_get_unique_id(); + $destinationDir = api_get_path(SYS_ARCHIVE_PATH).$folder; + mkdir($destinationDir, api_get_permissions_for_new_directories(), true); + + $package->extract( + PCLZIP_OPT_PATH, + $destinationDir + ); + + $xml = @file_get_contents($destinationDir.'/moodle_backup.xml'); + + $doc = new DOMDocument(); + $res = @$doc->loadXML($xml); + if ($res) { + $activities = $doc->getElementsByTagName('activity'); + foreach ($activities as $activity) { + if ($activity->childNodes->length) { + $currentItem = []; + + foreach($activity->childNodes as $item) { + $currentItem[$item->nodeName] = $item->nodeValue; + } + + $moduleName = $currentItem['modulename']; + switch ($moduleName) { + case 'duh!': + require_once '../forum/forumfunction.inc.php'; + $catForumValues = []; + + // Read the current forum module xml. + $moduleDir = $currentItem['directory']; + $moduleXml = @file_get_contents($destinationDir.'/'.$moduleDir.'/forum.xml'); + $moduleValues = $this->readForumModule($moduleXml); + + // Create a Forum category based on Moodle forum type. + $catForumValues['forum_category_title'] = $moduleValues['type']; + $catForumValues['forum_category_comment'] = ''; + $catId = store_forumcategory($catForumValues); + $forumValues = []; + $forumValues['forum_title'] = $moduleValues['name']; + $forumValues['forum_image'] = ''; + $forumValues['forum_comment'] = $moduleValues['intro']; + $forumValues['forum_category'] = $catId; + + $result = store_forum($forumValues); + break; + case 'quiz': + + break; + case 'resource': + // Read the current resource module xml. + $moduleDir = $currentItem['directory']; + $moduleXml = @file_get_contents($destinationDir.'/'.$moduleDir.'/resource.xml'); + $filesXml = @file_get_contents($destinationDir.'/files.xml'); + $moduleValues = $this->readResourceModule($moduleXml); + $fileInfo = $this->readMainFilesXml($filesXml, $moduleValues['contextid']); + var_dump($moduleValues); + var_dump($fileInfo); + + break; + case 'url': + + break; + } + } + } + } } + + return $packageContent[$mainFileKey]; } + + /** + * Read and validate the forum module XML + * + * @param resource $moduleXml XML file + * @return mixed | array if is a valid xml file, false otherwise + */ + public function readForumModule($moduleXml) + { + $moduleDoc = new DOMDocument(); + $moduleRes = @$moduleDoc->loadXML($moduleXml); + if ($moduleRes) { + $activities = $moduleDoc->getElementsByTagName('forum'); + $currentItem = []; + foreach ($activities as $activity) { + if ($activity->childNodes->length) { + foreach ($activity->childNodes as $item) { + $currentItem[$item->nodeName] = $item->nodeValue; + } + } + } + + return $currentItem; + } + + return false; + } + + /** + * Read and validate the resource module XML + * + * @param resource $moduleXml XML file + * @return mixed | array if is a valid xml file, false otherwise + */ + public function readResourceModule($moduleXml) + { + $moduleDoc = new DOMDocument(); + $moduleRes = @$moduleDoc->loadXML($moduleXml); + if ($moduleRes) { + $activities = $moduleDoc->getElementsByTagName('resource'); + $mainActivity = $moduleDoc->getElementsByTagName('activity'); + $contextId = $mainActivity->item(0)->getAttribute('contextid'); + $currentItem = []; + foreach ($activities as $activity) { + if ($activity->childNodes->length) { + foreach($activity->childNodes as $item) { + $currentItem[$item->nodeName] = $item->nodeValue; + } + } + } + + $currentItem['contextid'] = $contextId; + return $currentItem; + } + + return false; + } + + /** + * Search the current file resource in main Files XML + * + * @param resource $filesXml XML file + * @param int $contextId + * @return mixed | array if is a valid xml file, false otherwise + */ + public function readMainFilesXml($filesXml, $contextId) + { + $moduleDoc = new DOMDocument(); + $moduleRes = @$moduleDoc->loadXML($filesXml); + if ($moduleRes) { + $activities = $moduleDoc->getElementsByTagName('file'); + $currentItem = []; + foreach ($activities as $activity) { + if ($activity->childNodes->length) { + $isThisItemThatIWant = false; + foreach($activity->childNodes as $item) { + if (!$isThisItemThatIWant && $item->nodeName == 'contenthash') { + $currentItem['contenthash'] = $item->nodeValue; + } + if ($item->nodeName == 'contextid' && intval($item->nodeValue) == intval($contextId) && !$isThisItemThatIWant) { + $isThisItemThatIWant = true; + continue; + } + + if ($isThisItemThatIWant && $item->nodeName == 'filename') { + $currentItem['filename'] = $item->nodeValue; + } + + if ($isThisItemThatIWant && $item->nodeName == 'mimetype' && $item->nodeValue == 'document/unknown') { + break; + } + + if ($isThisItemThatIWant && $item->nodeName == 'mimetype' && $item->nodeValue !== 'document/unknown') { + $currentItem['mimetype'] = $item->nodeValue; + break 2; + } + } + } + } + + return $currentItem; + } + + return false; + } + } \ No newline at end of file