course = $course; $this->courseInfo = api_get_course_info($course->code); $this->activities = $activities; if (!$this->courseInfo) { throw new Exception("Course not found."); } } /** * Export the course-related files to the appropriate directory. */ public function exportCourse(string $exportDir): void { $courseDir = $exportDir.'/course'; if (!is_dir($courseDir)) { mkdir($courseDir, api_get_permissions_for_new_directories(), true); } $this->createCourseXml($courseDir); $this->createEnrolmentsXml($this->courseInfo['enrolments'] ?? [], $courseDir); $this->createInforefXml($courseDir); $this->createRolesXml($this->courseInfo['roles'] ?? [], $courseDir); $this->createCalendarXml($this->courseInfo['calendar'] ?? [], $courseDir); $this->createCommentsXml($this->courseInfo['comments'] ?? [], $courseDir); $this->createCompetenciesXml($this->courseInfo['competencies'] ?? [], $courseDir); $this->createCompletionDefaultsXml($this->courseInfo['completiondefaults'] ?? [], $courseDir); $this->createContentBankXml($this->courseInfo['contentbank'] ?? [], $courseDir); $this->createFiltersXml($this->courseInfo['filters'] ?? [], $courseDir); } /** * Create course.xml based on the course data from MoodleExport. */ private function createCourseXml(string $destinationDir): void { $courseId = $this->courseInfo['real_id'] ?? 0; $contextId = $this->courseInfo['real_id'] ?? 1; $shortname = $this->courseInfo['code'] ?? 'Unknown Course'; $fullname = $this->courseInfo['title'] ?? 'Unknown Fullname'; $showgrades = $this->courseInfo['showgrades'] ?? 0; $startdate = $this->courseInfo['startdate'] ?? time(); $enddate = $this->courseInfo['enddate'] ?? time() + (60 * 60 * 24 * 365); $visible = $this->courseInfo['visible'] ?? 1; $enablecompletion = $this->courseInfo['enablecompletion'] ?? 0; $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($shortname).''.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($fullname).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' topics'.PHP_EOL; $xmlContent .= ' '.$showgrades.''.PHP_EOL; $xmlContent .= ' 5'.PHP_EOL; $xmlContent .= ' '.$startdate.''.PHP_EOL; $xmlContent .= ' '.$enddate.''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.$visible.''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.time().''.PHP_EOL; $xmlContent .= ' '.time().''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' '.$enablecompletion.''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' Miscellaneous'.PHP_EOL; $xmlContent .= ' $@NULL@$'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' topics'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' hiddensections'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' topics'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' coursedisplay'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ''; file_put_contents($destinationDir.'/course.xml', $xmlContent); } /** * Create enrolments.xml based on the course data from MoodleExport. */ private function createEnrolmentsXml(array $enrolmentsData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($enrolmentsData as $enrol) { $id = $enrol['id'] ?? 0; $type = $enrol['type'] ?? 'manual'; $status = $enrol['status'] ?? 1; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($type).''.PHP_EOL; $xmlContent .= ' '.$status.''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/enrolments.xml', $xmlContent); } /** * Creates the inforef.xml file with file references, question categories, and role references. */ private function createInforefXml(string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; $questionCategories = []; foreach ($this->activities as $activity) { if ($activity['modulename'] === 'quiz') { $quizExport = new QuizExport($this->course); $quizData = $quizExport->getData($activity['id'], $activity['sectionid']); foreach ($quizData['questions'] as $question) { $categoryId = $question['questioncategoryid']; if (!in_array($categoryId, $questionCategories, true)) { $questionCategories[] = $categoryId; } } } } if (!empty($questionCategories)) { $xmlContent .= ' '.PHP_EOL; foreach ($questionCategories as $categoryId) { $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.$categoryId.''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ' '.PHP_EOL; } // Add role references $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' 5'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ''.PHP_EOL; file_put_contents($destinationDir.'/inforef.xml', $xmlContent); } /** * Creates the roles.xml file. */ private function createRolesXml(array $rolesData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($rolesData as $role) { $roleName = $role['name'] ?? 'Student'; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($roleName).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/roles.xml', $xmlContent); } /** * Creates the calendar.xml file. */ private function createCalendarXml(array $calendarData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($calendarData as $event) { $eventName = $event['name'] ?? 'Event'; $timestart = $event['timestart'] ?? time(); $duration = $event['duration'] ?? 3600; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($eventName).''.PHP_EOL; $xmlContent .= ' '.$timestart.''.PHP_EOL; $xmlContent .= ' '.$duration.''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/calendar.xml', $xmlContent); } /** * Creates the comments.xml file. */ private function createCommentsXml(array $commentsData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($commentsData as $comment) { $content = $comment['content'] ?? 'No comment'; $author = $comment['author'] ?? 'Anonymous'; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($content).''.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($author).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/comments.xml', $xmlContent); } /** * Creates the competencies.xml file. */ private function createCompetenciesXml(array $competenciesData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($competenciesData as $competency) { $name = $competency['name'] ?? 'Competency'; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($name).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/competencies.xml', $xmlContent); } /** * Creates the completiondefaults.xml file. */ private function createCompletionDefaultsXml(array $completionData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($completionData as $completion) { $completionState = $completion['state'] ?? 0; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.$completionState.''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/completiondefaults.xml', $xmlContent); } /** * Creates the contentbank.xml file. */ private function createContentBankXml(array $contentBankData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($contentBankData as $content) { $id = $content['id'] ?? 0; $name = $content['name'] ?? 'Content'; $xmlContent .= ' '.htmlspecialchars($name).''.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/contentbank.xml', $xmlContent); } /** * Creates the filters.xml file. */ private function createFiltersXml(array $filtersData, string $destinationDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; foreach ($filtersData as $filter) { $filterName = $filter['name'] ?? 'filter_example'; $active = $filter['active'] ?? 1; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars($filterName).''.PHP_EOL; $xmlContent .= ' '.$active.''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ''; file_put_contents($destinationDir.'/filters.xml', $xmlContent); } }