diff --git a/mod/resource/backup/moodle2/backup_resource_activity_task.class.php b/mod/resource/backup/moodle2/backup_resource_activity_task.class.php index 4a28b44e40d71..eec0fb8fecbff 100644 --- a/mod/resource/backup/moodle2/backup_resource_activity_task.class.php +++ b/mod/resource/backup/moodle2/backup_resource_activity_task.class.php @@ -33,6 +33,11 @@ */ class backup_resource_activity_task extends backup_activity_task { + /** + * @param bool $resourceoldexists True if there are records in the resource_old table. + */ + protected static $resourceoldexists = null; + /** * No specific settings for this activity */ @@ -57,14 +62,66 @@ static public function encode_content_links($content) { $base = preg_quote($CFG->wwwroot,"/"); - // Link to the list of resources + // Link to the list of resources. $search="/(".$base."\/mod\/resource\/index.php\?id\=)([0-9]+)/"; $content= preg_replace($search, '$@RESOURCEINDEX*$2@$', $content); - // Link to resource view by moduleid - $search="/(".$base."\/mod\/resource\/view.php\?id\=)([0-9]+)/"; - $content= preg_replace($search, '$@RESOURCEVIEWBYID*$2@$', $content); + // Link to resource view by moduleid. + $search = "/(".$base."\/mod\/resource\/view.php\?id\=)([0-9]+)/"; + // Link to resource view by recordid + $search2 = "/(".$base."\/mod\/resource\/view.php\?r\=)([0-9]+)/"; + + // Check whether there are contents in the resource old table. + if (static::$resourceoldexists === null) { + static::$resourceoldexists = $DB->record_exists('resource_old', array()); + } + + // If there are links to items in the resource_old table, rewrite them to be links to the correct URL + // for their new module. + if (static::$resourceoldexists) { + // Match all of the resources. + $result = preg_match_all($search, $content, $matches, PREG_PATTERN_ORDER); + + // Course module ID resource links. + if ($result) { + list($insql, $params) = $DB->get_in_or_equal($matches[2]); + $oldrecs = $DB->get_records_select('resource_old', "cmid $insql", $params, '', 'cmid, newmodule'); + + for ($i = 0; $i < count($matches[0]); $i++) { + $cmid = $matches[2][$i]; + if (isset($oldrecs[$cmid])) { + // Resource_old item, rewrite it + $replace = '$@' . strtoupper($oldrecs[$cmid]->newmodule) . 'VIEWBYID*' . $cmid . '@$'; + } else { + // Not in the resource old table, don't rewrite + $replace = '$@RESOURCEVIEWBYID*'.$cmid.'@$'; + } + $content = str_replace($matches[0][$i], $replace, $content); + } + } + + $matches = null; + $result = preg_match_all($search2, $content, $matches, PREG_PATTERN_ORDER); + + // No resource links. + if (!$result) { + return $content; + } + // Resource ID links. + list($insql, $params) = $DB->get_in_or_equal($matches[2]); + $oldrecs = $DB->get_records_select('resource_old', "oldid $insql", $params, '', 'oldid, cmid, newmodule'); + for ($i = 0; $i < count($matches[0]); $i++) { + $recordid = $matches[2][$i]; + if (isset($oldrecs[$recordid])) { + // Resource_old item, rewrite it + $replace = '$@' . strtoupper($oldrecs[$recordid]->newmodule) . 'VIEWBYID*' . $oldrecs[$recordid]->cmid . '@$'; + $content = str_replace($matches[0][$i], $replace, $content); + } + } + } else { + $content = preg_replace($search, '$@RESOURCEVIEWBYID*$2@$', $content); + } return $content; } }