prepareActivityDirectory($exportDir, 'url', $effectiveModuleId); $urlData = $this->getData((int) $activityId, (int) $sectionId, $effectiveModuleId); if (empty($urlData)) { return; } $this->createUrlXml($urlData, $urlDir); $this->createModuleXml($urlData, $urlDir); $this->createGradesXml($urlData, $urlDir); $this->createGradeHistoryXml($urlData, $urlDir); $this->createInforefXml($urlData, $urlDir); $this->createRolesXml($urlData, $urlDir); $this->createCommentsXml($urlData, $urlDir); $this->createCalendarXml($urlData, $urlDir); $this->createFiltersXml($urlData, $urlDir); } /** * Get URL data for the course. */ public function getData(int $activityId, int $sectionId, ?int $moduleId = null): ?array { if (empty($this->course->resources['link'][$activityId])) { return null; } $url = $this->course->resources['link'][$activityId]; $effectiveModuleId = (int) ($moduleId ?? $activityId); if ($effectiveModuleId <= 0) { $effectiveModuleId = $activityId; } $name = (string) ($url->title ?? ''); if ($sectionId > 0) { $name = $this->lpItemTitle($sectionId, RESOURCE_LINK, $activityId, $name); } $name = $this->sanitizeMoodleActivityName($name, 255); $descriptionResult = $this->extractEmbeddedFilesAndNormalizeContent( (string) ($url->description ?? ''), $effectiveModuleId, 'mod_url', 'intro', 0, fn (int $sequence): int => $this->buildUrlEmbeddedFileId($effectiveModuleId, $sequence) ); return [ 'id' => $activityId, 'moduleid' => $effectiveModuleId, 'modulename' => 'url', 'contextid' => $effectiveModuleId, 'name' => $name, 'description' => $descriptionResult['content'], 'externalurl' => (string) ($url->url ?? ''), 'timecreated' => time(), 'timemodified' => time(), 'sectionid' => $sectionId, 'sectionnumber' => 0, 'users' => [], 'files' => $descriptionResult['files'], ]; } /** * Create the XML file for the URL. */ private function createUrlXml(array $urlData, string $urlDir): void { $xmlContent = ''.PHP_EOL; $xmlContent .= ''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' '.htmlspecialchars((string) $urlData['name']).''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ' 1'.PHP_EOL; $xmlContent .= ' '.htmlspecialchars((string) $urlData['externalurl']).''.PHP_EOL; $xmlContent .= ' 0'.PHP_EOL; $xmlContent .= ' a:1:{s:10:"printintro";i:1;}'.PHP_EOL; $xmlContent .= ' a:0:{}'.PHP_EOL; $xmlContent .= ' '.$urlData['timemodified'].''.PHP_EOL; $xmlContent .= ' '.PHP_EOL; $xmlContent .= ''; $this->createXmlFile('url', $xmlContent, $urlDir); } /** * Build a stable embedded file id for URL intro files. */ private function buildUrlEmbeddedFileId(int $moduleId, int $sequence): int { return 1200000000 + max(0, $moduleId) + max(1, $sequence); } }