prepareActivityDirectory($exportDir, 'glossary', $effectiveModuleId); $glossaryData = $this->getData((int) $activityId, (int) $sectionId, $effectiveModuleId); if (empty($glossaryData)) { return; } $this->createGlossaryXml($glossaryData, $glossaryDir); $this->createModuleXml($glossaryData, $glossaryDir); $this->createGradesXml($glossaryData, $glossaryDir); $this->createGradeHistoryXml($glossaryData, $glossaryDir); $this->createInforefXml($glossaryData, $glossaryDir); $this->createRolesXml($glossaryData, $glossaryDir); $this->createCalendarXml($glossaryData, $glossaryDir); $this->createCommentsXml($glossaryData, $glossaryDir); $this->createCompetenciesXml($glossaryData, $glossaryDir); $this->createFiltersXml($glossaryData, $glossaryDir); } /** * Get all terms from the course and group them into a single glossary. */ public function getData(int $glossaryId, int $sectionId, ?int $moduleId = null): ?array { if (empty($this->course->resources['glossary'])) { return null; } $adminData = MoodleExport::getAdminUserData(); $adminId = (int) ($adminData['id'] ?? 1); $effectiveModuleId = (int) ($moduleId ?? $glossaryId); if ($effectiveModuleId <= 0) { $effectiveModuleId = $glossaryId; } $glossaryEntries = []; $glossaryFiles = []; foreach ($this->course->resources['glossary'] as $glossary) { $entryId = (int) ($glossary->glossary_id ?? 0); $definitionResult = $this->extractEmbeddedFilesAndNormalizeContent( (string) ($glossary->description ?? ''), $effectiveModuleId, 'mod_glossary', 'entry', $entryId, fn (int $sequence): int => $this->buildGlossaryEmbeddedFileId() ); if (!empty($definitionResult['files'])) { $glossaryFiles = array_merge($glossaryFiles, $definitionResult['files']); } $glossaryEntries[] = [ 'id' => $entryId, 'userid' => $adminId, 'concept' => $this->sanitizeMoodleActivityName((string) ($glossary->name ?? ''), 255), 'definition' => $definitionResult['content'], 'timecreated' => time(), 'timemodified' => time(), ]; } $glossaryName = $this->sanitizeMoodleActivityName((string) get_lang('Glossary'), 255); return [ 'id' => $glossaryId, 'moduleid' => $effectiveModuleId, 'modulename' => 'glossary', 'contextid' => $effectiveModuleId, 'name' => $glossaryName, 'description' => '', 'timecreated' => time(), 'timemodified' => time(), 'sectionid' => $sectionId, 'sectionnumber' => 0, 'userid' => $adminId, 'entries' => $glossaryEntries, 'users' => [$adminId], 'files' => $glossaryFiles, ]; } /** * Create the XML file for the glossary with all terms combined. */ private function createGlossaryXml(array $glossaryData, string $glossaryDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars((string) $glossaryData['name']).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' dictionary'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 10'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 100'.PHP_EOL; $xmlContent .= ' '.$glossaryData['timecreated'].''.PHP_EOL; $xmlContent .= ' '.$glossaryData['timemodified'].''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; foreach ($glossaryData['entries'] as $entry) { $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.$entry['userid'].''.PHP_EOL; $xmlContent .= ' '.htmlspecialchars((string) $entry['concept']).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.$entry['timecreated'].''.PHP_EOL; $xmlContent .= ' '.$entry['timemodified'].''.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; } $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ''; $this->createXmlFile('glossary', $xmlContent, $glossaryDir); } /** * Build a stable embedded file id for glossary files. */ private function buildGlossaryEmbeddedFileId(): int { self::$embeddedFileGlobalSeq++; return 1500000000 + self::$embeddedFileGlobalSeq; } }