Index: backup/moodle2/restore_plugin.class.php =================================================================== --- backup/moodle2/restore_plugin.class.php (revision 14710) +++ backup/moodle2/restore_plugin.class.php (working copy) @@ -81,6 +81,23 @@ } /** + * after_restore dispatcher for any restore_plugin class + * + * This method will dispatch execution to the corresponding + * after_restore_xxx() method when available, with xxx + * being the connection point of the instance, so plugin + * classes with multiple connection points will support + * multiple after_restore methods, one for each connection point + */ + public function launch_after_restore_methods() { + // Check if the after_execute method exists and launch it + $afterexecute = 'after_restore_' . basename($this->connectionpoint->get_path()); + if (method_exists($this, $afterexecute)) { + $this->$afterexecute(); + } + } + + /** * Returns one array with all the decode contents * to be processed by the links decoder * Index: backup/util/plan/restore_task.class.php =================================================================== --- backup/util/plan/restore_task.class.php (revision 14710) +++ backup/util/plan/restore_task.class.php (working copy) @@ -100,6 +100,13 @@ * method if available */ public function execute_after_restore() { + if ($this->executed) { + foreach ($this->steps as $step) { + if (method_exists($step, 'launch_after_restore_methods')) { + $step->launch_after_restore_methods(); + } + } + } if ($this->executed && method_exists($this, 'after_restore')) { $this->after_restore(); } Index: backup/util/plan/restore_structure_step.class.php =================================================================== --- backup/util/plan/restore_structure_step.class.php (revision 14710) +++ backup/util/plan/restore_structure_step.class.php (working copy) @@ -361,6 +361,43 @@ } /** + * Launch all the after_restore methods present in all the processing objects + * + * This method will launch all the after_restore methods that can be defined + * both in restore_plugin class + * + * For restore_plugin classes the name of the method to be executed will be + * "after_restore_" + connection point (as far as can be multiple connection + * points in the same class) + */ + public function launch_after_restore_methods() { + $alreadylaunched = array(); // To avoid multiple executions + foreach ($this->pathelements as $pathelement) { + // Get the processing object + $pobject = $pathelement->get_processing_object(); + // Skip null processors (child of grouped ones for sure) + if (is_null($pobject)) { + continue; + } + // Skip restore structure step processors (this) + if ($pobject instanceof restore_structure_step) { + continue; + } + // Skip already launched processing objects + if (in_array($pobject, $alreadylaunched, true)) { + continue; + } + // Add processing object to array of launched ones + $alreadylaunched[] = $pobject; + // If the processing object has support for + // launching after_execute methods, use it + if (method_exists($pobject, 'launch_after_restore_methods')) { + $pobject->launch_after_restore_methods(); + } + } + } + + /** * This method will be executed after the whole structure step have been processed * * After execution method for code needed to be executed after the whole structure