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);
}
}