mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 16:32:18 +02:00
MDL-83479 backup: Add hooks to restore process.
- A hook to enable plugins to add extra settings to the restore task. This would be placed inside restore_root_task::define_settings() - A hook to enable plugins to add extra fields to the copy course form. This would be done inside the copy_form class. - An adjustment to add the restore plan settings to the course restored event data. This would be done inside restore_plan::execute(). - A hook to enable extra work inside the asynchronous copy task. To be placed inside asynchronous_copy_task::execute().
This commit is contained in:
parent
139a0ad5f0
commit
a5de02a54c
44
backup/classes/hook/after_copy_form_definition.php
Normal file
44
backup/classes/hook/after_copy_form_definition.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
use MoodleQuickForm;
|
||||
|
||||
/**
|
||||
* Hook to allow adding extra fields to the copy course form.
|
||||
* This should be used together with core_backup\hook\copy_helper_process_formdata
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
#[\core\attribute\label('Use to add extra elements to the copy course form.')]
|
||||
#[\core\attribute\tags('backup')]
|
||||
final class after_copy_form_definition {
|
||||
|
||||
/** @var MoodleQuickForm */
|
||||
public readonly MoodleQuickForm $mform;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param MoodleQuickForm $mform
|
||||
*/
|
||||
public function __construct(MoodleQuickForm $mform) {
|
||||
$this->mform = $mform;
|
||||
}
|
||||
}
|
43
backup/classes/hook/after_restore_root_define_settings.php
Normal file
43
backup/classes/hook/after_restore_root_define_settings.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
use restore_root_task;
|
||||
|
||||
/**
|
||||
* Hook to allow extra settings to be defined for the course restore process.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
#[\core\attribute\label('Use to add extra elements to the settings tab of the restore process.')]
|
||||
#[\core\attribute\tags('backup')]
|
||||
final class after_restore_root_define_settings {
|
||||
|
||||
/** @var restore_root_task */
|
||||
public readonly restore_root_task $task;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param restore_root_task $task
|
||||
*/
|
||||
public function __construct(restore_root_task $task) {
|
||||
$this->task = $task;
|
||||
}
|
||||
}
|
49
backup/classes/hook/before_copy_course_execute.php
Normal file
49
backup/classes/hook/before_copy_course_execute.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
use stdClass;
|
||||
use restore_plan;
|
||||
|
||||
/**
|
||||
* Hook used to allow interaction with the copy task, before the actual task execution takes place.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
#[\core\attribute\label('Use to interact with the copy course task before the actual execution takes place.')]
|
||||
#[\core\attribute\tags('backup')]
|
||||
final class before_copy_course_execute {
|
||||
|
||||
/** @var restore_plan */
|
||||
public readonly restore_plan $plan;
|
||||
|
||||
/** @var stdClass */
|
||||
public readonly stdClass $copyinfo;
|
||||
|
||||
/**
|
||||
* Hook constructor.
|
||||
*
|
||||
* @param restore_plan $plan
|
||||
* @param stdClass $copyinfo
|
||||
*/
|
||||
public function __construct(restore_plan $plan, stdClass $copyinfo) {
|
||||
$this->plan = $plan;
|
||||
$this->copyinfo = $copyinfo;
|
||||
}
|
||||
}
|
51
backup/classes/hook/copy_helper_process_formdata.php
Normal file
51
backup/classes/hook/copy_helper_process_formdata.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
/**
|
||||
* Hook used by copy_helper::process_formdata() to expand the list of required fields.
|
||||
* This should be used together with core_backup\hook\after_copy_form_definition.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
#[\core\attribute\label('Able to add extra fields to the copy course.')]
|
||||
#[\core\attribute\tags('backup')]
|
||||
final class copy_helper_process_formdata {
|
||||
|
||||
/** @var array List of extra fields to be added. */
|
||||
protected $extrafields = [];
|
||||
|
||||
/**
|
||||
* Add an extra field.
|
||||
*
|
||||
* @param string $extrafield
|
||||
*/
|
||||
public function add_extra_field(string $extrafield) {
|
||||
$this->extrafields[] = $extrafield;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the extra fields.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_extrafields(): array {
|
||||
return $this->extrafields;
|
||||
}
|
||||
}
|
@ -26,6 +26,10 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\di;
|
||||
use core\hook\manager;
|
||||
use core_backup\hook\after_restore_root_define_settings;
|
||||
|
||||
/**
|
||||
* Start task that provides all the settings common to all restores and other initial steps
|
||||
*
|
||||
@ -343,5 +347,9 @@ class restore_root_task extends restore_task {
|
||||
$legacyfiles->set_ui(new backup_setting_ui_checkbox($legacyfiles, get_string('rootsettinglegacyfiles', 'backup')));
|
||||
$legacyfiles->get_ui()->set_changeable($changeable);
|
||||
$this->add_setting($legacyfiles);
|
||||
|
||||
// Create and dispatch a hook to allow plugins to add other settings for the restore process.
|
||||
$hook = new after_restore_root_define_settings($this);
|
||||
di::get(manager::class)->dispatch($hook);
|
||||
}
|
||||
}
|
||||
|
47
backup/moodle2/tests/fixtures/restore_task_hook_callbacks.php
vendored
Normal file
47
backup/moodle2/tests/fixtures/restore_task_hook_callbacks.php
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\fixtures;
|
||||
|
||||
use base_setting;
|
||||
use restore_generic_setting;
|
||||
use backup_setting_ui_checkbox;
|
||||
use core_backup\hook\after_restore_root_define_settings;
|
||||
|
||||
/**
|
||||
* Callback class to test after_restore_root_define_settings hook.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class restore_task_hook_callbacks {
|
||||
/**
|
||||
* Tests use of after_restore_root_define_settings hook.
|
||||
*
|
||||
* @param after_restore_root_define_settings $hook
|
||||
*/
|
||||
public static function after_restore_root_define_settings(after_restore_root_define_settings $hook) {
|
||||
$task = $hook->task;
|
||||
$defaultvalue = true;
|
||||
$changeable = true;
|
||||
|
||||
$somebox = new restore_generic_setting('extra_test', base_setting::IS_BOOLEAN, $defaultvalue);
|
||||
$somebox->set_ui(new backup_setting_ui_checkbox($somebox, 'Extra test'));
|
||||
$somebox->get_ui()->set_changeable($changeable);
|
||||
$task->add_setting($somebox);
|
||||
}
|
||||
}
|
40
backup/moodle2/tests/fixtures/restore_task_hooks.php
vendored
Normal file
40
backup/moodle2/tests/fixtures/restore_task_hooks.php
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Describes the hook callbacks used to test the restore settings definition.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core_backup\fixtures\restore_task_hook_callbacks;
|
||||
use core_backup\hook\after_restore_root_define_settings;
|
||||
|
||||
require_once(__DIR__ . '/restore_task_hook_callbacks.php');
|
||||
|
||||
$callbacks = [
|
||||
[
|
||||
'hook' => after_restore_root_define_settings::class,
|
||||
'callback' => [
|
||||
restore_task_hook_callbacks::class,
|
||||
'after_restore_root_define_settings',
|
||||
],
|
||||
],
|
||||
];
|
@ -17,6 +17,9 @@
|
||||
namespace core_backup;
|
||||
|
||||
use backup;
|
||||
use core\di;
|
||||
use core\hook\manager;
|
||||
use restore_controller;
|
||||
|
||||
/**
|
||||
* Tests for Moodle 2 restore steplib classes.
|
||||
@ -144,4 +147,57 @@ final class restore_stepslib_test extends \advanced_testcase {
|
||||
$this->assertEquals($originalsections[1]->$field, $restoredsections[1]->$field);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the hooks for restore task settings definition.
|
||||
*
|
||||
* @covers \restore_root_task::define_settings
|
||||
*/
|
||||
public function test_restore_hook(): void {
|
||||
// Load the callback classes.
|
||||
require_once(__DIR__ . '/fixtures/restore_task_hooks.php');
|
||||
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
// Replace the version of the manager in the DI container with a phpunit one.
|
||||
di::set(
|
||||
manager::class,
|
||||
manager::phpunit_get_instance([
|
||||
// Load a list of hooks for `test_plugin1` from the fixture file.
|
||||
'test_plugin1' => __DIR__ .
|
||||
'/fixtures/restore_task_hooks.php',
|
||||
]),
|
||||
);
|
||||
|
||||
global $CFG, $USER;
|
||||
|
||||
// Create course to restore into, and a user to do the restore.
|
||||
$generator = $this->getDataGenerator();
|
||||
$course = $generator->create_course();
|
||||
|
||||
$backupid = $this->backup_course($course);
|
||||
|
||||
// Turn off file logging, otherwise it can't delete the file (Windows).
|
||||
$CFG->backup_file_logger_level = backup::LOG_NONE;
|
||||
|
||||
$course = $generator->create_course();
|
||||
|
||||
// Do restore to new course with default settings.
|
||||
$rc = new restore_controller(
|
||||
$backupid,
|
||||
$course->id,
|
||||
backup::INTERACTIVE_NO,
|
||||
backup::MODE_GENERAL,
|
||||
$USER->id,
|
||||
backup::TARGET_EXISTING_DELETING
|
||||
);
|
||||
|
||||
$precheck = $rc->execute_precheck();
|
||||
$this->assertTrue($precheck);
|
||||
$setting = $rc->get_plan()->get_setting('extra_test');
|
||||
$this->assertNotEmpty($setting);
|
||||
$rc->execute_plan();
|
||||
$rc->destroy();
|
||||
}
|
||||
}
|
||||
|
104
backup/tests/hook/copy_course_hook_test.php
Normal file
104
backup/tests/hook/copy_course_hook_test.php
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
use core\di;
|
||||
use copy_helper;
|
||||
use advanced_testcase;
|
||||
use core\hook\manager;
|
||||
use core\task\manager as taskmanager;
|
||||
use core\event\course_restored;
|
||||
use core_backup\hook\fixtures\copy_course_hook_callbacks;
|
||||
|
||||
/**
|
||||
* Class to test the hook inside asynchronous_copy_task.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
final class copy_course_hook_test extends advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test the hook.
|
||||
*
|
||||
* @covers \core\task\asynchronous_copy_task::execute
|
||||
* @covers \core_backup\hook\before_copy_course_execute
|
||||
*/
|
||||
public function test_copy_course_hook(): void {
|
||||
// Load the callback classes.
|
||||
require_once(__DIR__ . '/fixtures/copy_course_hooks.php');
|
||||
|
||||
// Replace the version of the manager in the DI container with a phpunit one.
|
||||
di::set(
|
||||
manager::class,
|
||||
manager::phpunit_get_instance([
|
||||
// Load a list of hooks for `test_plugin1` from the fixture file.
|
||||
'test_plugin1' => __DIR__ .
|
||||
'/fixtures/copy_course_hooks.php',
|
||||
]),
|
||||
);
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
$this->setAdminUser();
|
||||
|
||||
$generator = $this->getDataGenerator();
|
||||
$course = $generator->create_course();
|
||||
|
||||
$copydata = (object) [
|
||||
'courseid' => $course->id,
|
||||
'fullname' => 'Name',
|
||||
'shortname' => 'name',
|
||||
'category' => 1,
|
||||
'visible' => 1,
|
||||
'startdate' => '123456789',
|
||||
'enddate' => '123456789',
|
||||
'idnumber' => 'dnum',
|
||||
'userdata' => false,
|
||||
];
|
||||
|
||||
$processed = copy_helper::process_formdata($copydata);
|
||||
copy_helper::create_copy($processed);
|
||||
$sink = $this->redirectEvents();
|
||||
|
||||
// Capture mtrace output.
|
||||
ob_start();
|
||||
|
||||
// Execute adhoc task.
|
||||
$now = time();
|
||||
$task = taskmanager::get_next_adhoc_task($now);
|
||||
$this->assertInstanceOf('\\core\\task\\asynchronous_copy_task', $task);
|
||||
$task->execute();
|
||||
taskmanager::adhoc_task_complete($task);
|
||||
|
||||
ob_get_clean();
|
||||
|
||||
$this->assertGreaterThan(0, copy_course_hook_callbacks::$count);
|
||||
|
||||
// Check that the restore settings have been added to the event data.
|
||||
$events = $sink->get_events();
|
||||
$count = 0;
|
||||
foreach ($events as $event) {
|
||||
if ($event instanceof course_restored) {
|
||||
$count++;
|
||||
$data = $event->get_data();
|
||||
$this->assertNotEmpty($data['other']['settings']);
|
||||
}
|
||||
}
|
||||
$this->assertGreaterThan(0, $count);
|
||||
}
|
||||
}
|
40
backup/tests/hook/fixtures/copy_course_hook_callbacks.php
Normal file
40
backup/tests/hook/fixtures/copy_course_hook_callbacks.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\hook\fixtures;
|
||||
|
||||
use core_backup\hook\before_copy_course_execute;
|
||||
|
||||
/**
|
||||
* Callbacks used to test the hooks in the copy course task.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class copy_course_hook_callbacks {
|
||||
/** @var int Used to keep track oh how many times the callback has been called. */
|
||||
public static $count = 0;
|
||||
|
||||
/**
|
||||
* Callback used to test the before_copy_course_execute hook.
|
||||
*
|
||||
* @param before_copy_course_execute $hook
|
||||
*/
|
||||
public static function before_copy_course_execute(before_copy_course_execute $hook) {
|
||||
self::$count++;
|
||||
}
|
||||
}
|
40
backup/tests/hook/fixtures/copy_course_hooks.php
Normal file
40
backup/tests/hook/fixtures/copy_course_hooks.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Describes hooks used for testing.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core_backup\hook\before_copy_course_execute;
|
||||
use core_backup\hook\fixtures\copy_course_hook_callbacks;
|
||||
|
||||
require_once(__DIR__ . '/copy_course_hook_callbacks.php');
|
||||
|
||||
$callbacks = [
|
||||
[
|
||||
'hook' => before_copy_course_execute::class,
|
||||
'callback' => [
|
||||
copy_course_hook_callbacks::class,
|
||||
'before_copy_course_execute',
|
||||
],
|
||||
],
|
||||
];
|
@ -14,6 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use core\di;
|
||||
use core\hook\manager;
|
||||
use core_backup\hook\copy_helper_process_formdata;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
|
||||
|
||||
@ -39,13 +43,18 @@ final class copy_helper {
|
||||
'fullname', // Fullname of the destination course.
|
||||
'shortname', // Shortname of the destination course.
|
||||
'category', // Category integer ID that contains the destination course.
|
||||
'visible', // Integer to detrmine of the copied course will be visible.
|
||||
'visible', // Integer to determine of the copied course will be visible.
|
||||
'startdate', // Integer timestamp of the start of the destination course.
|
||||
'enddate', // Integer timestamp of the end of the destination course.
|
||||
'idnumber', // ID of the destination course.
|
||||
'userdata', // Integer to determine if the copied course will contain user data.
|
||||
];
|
||||
|
||||
// Use hook to expand field list.
|
||||
$hook = new copy_helper_process_formdata();
|
||||
di::get(manager::class)->dispatch($hook);
|
||||
$requiredfields = array_merge($requiredfields, $hook->get_extrafields());
|
||||
|
||||
$missingfields = array_diff($requiredfields, array_keys((array)$formdata));
|
||||
if ($missingfields) {
|
||||
throw new \moodle_exception('copyfieldnotfound', 'backup', '', null, implode(", ", $missingfields));
|
||||
|
@ -17,6 +17,9 @@
|
||||
namespace core_backup;
|
||||
|
||||
use backup;
|
||||
use core\di;
|
||||
use copy_helper;
|
||||
use core\hook\manager;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@ -836,4 +839,43 @@ final class copy_helper_test extends \advanced_testcase {
|
||||
$copydata = \copy_helper::process_formdata($formdata);
|
||||
\copy_helper::create_copy($copydata);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test copy_helper_process_formdata hook.
|
||||
*
|
||||
* @covers \core_backup\hook\copy_helper_process_formdata
|
||||
*/
|
||||
public function test_copy_helper_process_formdata_hook(): void {
|
||||
// Load the callback classes.
|
||||
require_once(__DIR__ . '/fixtures/helper_hooks.php');
|
||||
|
||||
// Replace the version of the manager in the DI container with a phpunit one.
|
||||
di::set(
|
||||
manager::class,
|
||||
manager::phpunit_get_instance([
|
||||
// Load a list of hooks for `test_plugin1` from the fixture file.
|
||||
'test_plugin1' => __DIR__ .
|
||||
'/fixtures/helper_hooks.php',
|
||||
]),
|
||||
);
|
||||
|
||||
$formdata = (object) [
|
||||
'courseid' => 4,
|
||||
'fullname' => 'Name',
|
||||
'shortname' => 'name',
|
||||
'category' => 12,
|
||||
'visible' => 1,
|
||||
'startdate' => '123456789',
|
||||
'enddate' => '123456789',
|
||||
'idnumber' => 'dnum',
|
||||
'userdata' => false,
|
||||
'extra' => 13,
|
||||
];
|
||||
|
||||
$processed = copy_helper::process_formdata($formdata);
|
||||
|
||||
// Check that the extra fields are present.
|
||||
$this->assertTrue(isset($processed->extra));
|
||||
$this->assertEquals(13, $processed->extra);
|
||||
}
|
||||
}
|
||||
|
37
backup/util/helper/tests/fixtures/helper_hook_callbacks.php
vendored
Normal file
37
backup/util/helper/tests/fixtures/helper_hook_callbacks.php
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\fixtures;
|
||||
|
||||
use core_backup\hook\copy_helper_process_formdata;
|
||||
|
||||
/**
|
||||
* Callbacks used to test hook.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class helper_hook_callbacks {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param copy_helper_process_formdata $hook
|
||||
*/
|
||||
public static function copy_helper_process_formdata(copy_helper_process_formdata $hook) {
|
||||
$hook->add_extra_field('extra');
|
||||
}
|
||||
}
|
41
backup/util/helper/tests/fixtures/helper_hooks.php
vendored
Normal file
41
backup/util/helper/tests/fixtures/helper_hooks.php
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hook definitions.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_backup\fixtures\helper_hook_callbacks;
|
||||
use core_backup\hook\copy_helper_process_formdata;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once(__DIR__ . '/helper_hook_callbacks.php');
|
||||
|
||||
$callbacks = [
|
||||
[
|
||||
'hook' => copy_helper_process_formdata::class,
|
||||
'callback' => [
|
||||
helper_hook_callbacks::class,
|
||||
'copy_helper_process_formdata',
|
||||
],
|
||||
],
|
||||
];
|
@ -270,6 +270,19 @@ abstract class base_task implements checksumable, executable, loggable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a setting to the task.
|
||||
*
|
||||
* @param base_setting $setting
|
||||
* @return void
|
||||
*/
|
||||
public function add_setting($setting) {
|
||||
if (! $setting instanceof base_setting) {
|
||||
throw new base_setting_exception('wrong_base_setting_specified');
|
||||
}
|
||||
$this->settings[] = $setting;
|
||||
}
|
||||
|
||||
// Protected API starts here
|
||||
|
||||
/**
|
||||
@ -278,13 +291,6 @@ abstract class base_task implements checksumable, executable, loggable {
|
||||
* in the task.
|
||||
*/
|
||||
abstract protected function define_settings();
|
||||
|
||||
protected function add_setting($setting) {
|
||||
if (! $setting instanceof base_setting) {
|
||||
throw new base_setting_exception('wrong_base_setting_specified');
|
||||
}
|
||||
$this->settings[] = $setting;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -185,6 +185,9 @@ class restore_plan extends base_plan implements loggable {
|
||||
$otherarray['originalcourseid'] = $this->controller->get_info()->original_course_id;
|
||||
}
|
||||
|
||||
// Add the settings to the event data.
|
||||
$otherarray['settings'] = $this->get_settings();
|
||||
|
||||
// Trigger a course restored event.
|
||||
$event = \core\event\course_restored::create(array(
|
||||
'objectid' => $this->get_courseid(),
|
||||
|
33
backup/util/ui/classes/hook/after_copy_form_definition.php
Normal file
33
backup/util/ui/classes/hook/after_copy_form_definition.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hook to allow adding extra fields to the copy course form.
|
||||
*
|
||||
* This should be used together with core_backup\hook\copy_helper_process_formdata
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
// This file is a placeholder. Remove when MDL-83618 is available.
|
||||
require_once(__DIR__.'/../../../../classes/hook/after_copy_form_definition.php');
|
||||
|
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hook to allow extra settings to be defined for the course restore process.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
// This file is a placeholder. Remove when MDL-83618 is available.
|
||||
require_once(__DIR__.'/../../../../classes/hook/after_restore_root_define_settings.php');
|
30
backup/util/ui/classes/hook/before_copy_course_execute.php
Normal file
30
backup/util/ui/classes/hook/before_copy_course_execute.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hook used to allow interaction with the copy task, before the actual task execution takes place.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
// This file is a placeholder. Remove when MDL-83618 is available.
|
||||
require_once(__DIR__.'/../../../../classes/hook/before_copy_course_execute.php');
|
32
backup/util/ui/classes/hook/copy_helper_process_formdata.php
Normal file
32
backup/util/ui/classes/hook/copy_helper_process_formdata.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hook used by copy_helper::process_formdata() to expand the list of required fields.
|
||||
*
|
||||
* This should be used together with core_backup\hook\after_copy_form_definition.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_backup\hook;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
// This file is a placeholder. Remove when MDL-83618 is available.
|
||||
require_once(__DIR__.'/../../../../classes/hook/copy_helper_process_formdata.php');
|
@ -25,6 +25,10 @@
|
||||
|
||||
namespace core_backup\output;
|
||||
|
||||
use core\di;
|
||||
use core\hook\manager;
|
||||
use core_backup\hook\after_copy_form_definition;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
require_once("$CFG->libdir/formslib.php");
|
||||
@ -197,6 +201,10 @@ class copy_form extends \moodleform {
|
||||
$this->add_checkbox_controller(2);
|
||||
}
|
||||
|
||||
// Dispatch hook to allow more elements to be added to the form.
|
||||
$hook = new after_copy_form_definition($mform);
|
||||
di::get(manager::class)->dispatch($hook);
|
||||
|
||||
$buttonarray = array();
|
||||
$buttonarray[] = $mform->createElement('submit', 'submitreturn', get_string('copyreturn', 'backup'));
|
||||
$buttonarray[] = $mform->createElement('submit', 'submitdisplay', get_string('copyview', 'backup'));
|
||||
|
68
backup/util/ui/tests/copy_form_hook_test.php
Normal file
68
backup/util/ui/tests/copy_form_hook_test.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup;
|
||||
|
||||
use core\di;
|
||||
use core\hook\manager;
|
||||
use advanced_testcase;
|
||||
use core_backup\output\copy_form;
|
||||
|
||||
/**
|
||||
* Tests the after_copy_form_definition hook.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
final class copy_form_hook_test extends advanced_testcase {
|
||||
/**
|
||||
* Test the after_copy_form_definition hook.
|
||||
*
|
||||
* @covers \core_backup\output\copy_form::definition
|
||||
*/
|
||||
public function test_copy_form_hook(): void {
|
||||
// Load the callback classes.
|
||||
require_once(__DIR__ . '/fixtures/copy_form_hooks.php');
|
||||
|
||||
// Replace the version of the manager in the DI container with a phpunit one.
|
||||
di::set(
|
||||
manager::class,
|
||||
manager::phpunit_get_instance([
|
||||
// Load a list of hooks for `test_plugin1` from the fixture file.
|
||||
'test_plugin1' => __DIR__ .
|
||||
'/fixtures/copy_form_hooks.php',
|
||||
]),
|
||||
);
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
$this->setAdminUser();
|
||||
|
||||
$generator = $this->getDataGenerator();
|
||||
$course = $generator->create_course();
|
||||
$form = new copy_form(
|
||||
null,
|
||||
['course' => $course, 'returnto' => null, 'returnurl' => null]
|
||||
);
|
||||
ob_start();
|
||||
$form->display();
|
||||
$html = ob_get_clean();
|
||||
|
||||
// Check that the wierdtestname element is part of the form.
|
||||
$pos = strpos($html, 'wierdtestname');
|
||||
$this->assertNotFalse($pos);
|
||||
}
|
||||
}
|
38
backup/util/ui/tests/fixtures/copy_form_hook_callbacks.php
vendored
Normal file
38
backup/util/ui/tests/fixtures/copy_form_hook_callbacks.php
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_backup\fixtures;
|
||||
|
||||
use core_backup\hook\after_copy_form_definition;
|
||||
|
||||
/**
|
||||
* Callback for testing after_copy_form_definition hook.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class copy_form_hook_callbacks {
|
||||
/**
|
||||
* Callback for testing after_copy_form_definition hook.
|
||||
*
|
||||
* @param after_copy_form_definition $hook
|
||||
*/
|
||||
public static function after_copy_form_definition(after_copy_form_definition $hook) {
|
||||
$mform = $hook->mform;
|
||||
$mform->addElement('checkbox', 'wierdtestname', 'Wierd test');
|
||||
}
|
||||
}
|
40
backup/util/ui/tests/fixtures/copy_form_hooks.php
vendored
Normal file
40
backup/util/ui/tests/fixtures/copy_form_hooks.php
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Hooks used in testing.
|
||||
*
|
||||
* @package core_backup
|
||||
* @copyright 2024 Monash University (https://www.monash.edu)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core_backup\hook\after_copy_form_definition;
|
||||
use core_backup\fixtures\copy_form_hook_callbacks;
|
||||
|
||||
require_once(__DIR__ . '/copy_form_hook_callbacks.php');
|
||||
|
||||
$callbacks = [
|
||||
[
|
||||
'hook' => after_copy_form_definition::class,
|
||||
'callback' => [
|
||||
copy_form_hook_callbacks::class,
|
||||
'after_copy_form_definition',
|
||||
],
|
||||
],
|
||||
];
|
@ -25,8 +25,11 @@
|
||||
|
||||
namespace core\task;
|
||||
|
||||
use core\di;
|
||||
use async_helper;
|
||||
use cache_helper;
|
||||
use core\hook\manager;
|
||||
use core_backup\hook\before_copy_course_execute;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@ -125,6 +128,10 @@ class asynchronous_copy_task extends adhoc_task {
|
||||
$shortname = $plan->get_setting('course_shortname');
|
||||
$shortname->set_value($copyinfo->shortname);
|
||||
|
||||
// Create and dispatch a hook to allow interaction with the task immediately prior to execution.
|
||||
$hook = new before_copy_course_execute($plan, $copyinfo);
|
||||
di::get(manager::class)->dispatch($hook);
|
||||
|
||||
// Do some preflight checks on the restore.
|
||||
$rc->execute_precheck();
|
||||
$status = $rc->get_status();
|
||||
|
Loading…
x
Reference in New Issue
Block a user