diff --git a/backup/util/dbops/restore_dbops.class.php b/backup/util/dbops/restore_dbops.class.php index 25f2e533d1c..af86f23c637 100644 --- a/backup/util/dbops/restore_dbops.class.php +++ b/backup/util/dbops/restore_dbops.class.php @@ -622,10 +622,24 @@ abstract class restore_dbops { * Given one component/filearea/context and * optionally one source itemname to match itemids * put the corresponding files in the pool + * + * @param string $basepath the full path to the root of unzipped backup file + * @param string $restoreid the restore job's identification + * @param string $component + * @param string $filearea + * @param int $oldcontextid + * @param int $dfltuserid default $file->user if the old one can't be mapped + * @param string|null $itemname + * @param int|null $olditemid + * @param int|null $forcenewcontextid explicit value for the new contextid (skip mapping) + * @param bool $skipparentitemidctxmatch + * @return array of result object */ public static function send_files_to_pool($basepath, $restoreid, $component, $filearea, $oldcontextid, $dfltuserid, $itemname = null, $olditemid = null, $forcenewcontextid = null, $skipparentitemidctxmatch = false) { global $DB; + $results = array(); + if ($forcenewcontextid) { // Some components can have "forced" new contexts (example: questions can end belonging to non-standard context mappings, // with questions originally at system/coursecat context in source being restored to course context in target). So we need @@ -701,7 +715,12 @@ abstract class restore_dbops { // Find file in backup pool $backuppath = $basepath . backup_file_manager::get_backup_content_file_location($file->contenthash); if (!file_exists($backuppath)) { - throw new restore_dbops_exception('file_not_found_in_pool', $file); + $result = new stdClass(); + $result->code = 'file_missing_in_backup'; + $result->message = sprintf('missing file %s%s in backup', $file->filepath, $file->filename); + $result->level = backup::LOG_WARNING; + $results[] = $result; + continue; } if (!$fs->file_exists($newcontextid, $component, $filearea, $rec->newitemid, $file->filepath, $file->filename)) { $file_record = array( @@ -721,6 +740,7 @@ abstract class restore_dbops { } } $rs->close(); + return $results; } /** diff --git a/backup/util/plan/restore_structure_step.class.php b/backup/util/plan/restore_structure_step.class.php index ddb2fe54729..ecd1b549e7a 100644 --- a/backup/util/plan/restore_structure_step.class.php +++ b/backup/util/plan/restore_structure_step.class.php @@ -218,8 +218,14 @@ abstract class restore_structure_step extends restore_step { */ public function add_related_files($component, $filearea, $mappingitemname, $filesctxid = null, $olditemid = null) { $filesctxid = is_null($filesctxid) ? $this->task->get_old_contextid() : $filesctxid; - restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), $component, - $filearea, $filesctxid, $this->task->get_userid(), $mappingitemname, $olditemid); + $results = restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), $component, + $filearea, $filesctxid, $this->task->get_userid(), $mappingitemname, $olditemid); + $resultstoadd = array(); + foreach ($results as $result) { + $this->log($result->message, $result->level); + $resultstoadd[$result->code] = true; + } + $this->task->add_result($resultstoadd); } /** diff --git a/backup/util/ui/restore_ui_stage.class.php b/backup/util/ui/restore_ui_stage.class.php index 478fe7a4e29..b8f5f4fb31f 100644 --- a/backup/util/ui/restore_ui_stage.class.php +++ b/backup/util/ui/restore_ui_stage.class.php @@ -757,6 +757,9 @@ class restore_ui_stage_complete extends restore_ui_stage_process { $html = ''; $html .= $renderer->box_start(); + if (array_key_exists('file_missing_in_backup', $this->results)) { + $html .= $renderer->notification(get_string('restorefileweremissing', 'backup'), 'notifyproblem'); + } $html .= $renderer->notification(get_string('restoreexecutionsuccess', 'backup'), 'notifysuccess'); $html .= $renderer->continue_button(new moodle_url('/course/view.php', array( 'id' => $this->get_ui()->get_controller()->get_courseid())), 'get'); diff --git a/lang/en/backup.php b/lang/en/backup.php index 3cb7ec138f9..4f41d7bcded 100644 --- a/lang/en/backup.php +++ b/lang/en/backup.php @@ -167,6 +167,7 @@ $string['restoreactivity'] = 'Restore activity'; $string['restorecourse'] = 'Restore course'; $string['restorecoursesettings'] = 'Course settings'; $string['restoreexecutionsuccess'] = 'The course was restored successfully, clicking the continue button below will take you to view the course you restored.'; +$string['restorefileweremissing'] = 'Some files could not be restored because they were missing in the backup.'; $string['restorenewcoursefullname'] = 'New course name'; $string['restorenewcourseshortname'] = 'New course short name'; $string['restorenewcoursestartdate'] = 'New start date';