MDL-46481 backup: implemented quick backup process (one click)
authorSam Hemelryk <sam@moodle.com>
Wed, 23 Jul 2014 00:28:54 +0000 (12:28 +1200)
committerSam Hemelryk <sam@moodle.com>
Thu, 2 Oct 2014 20:43:08 +0000 (09:43 +1300)
backup/util/ui/backup_moodleform.class.php
backup/util/ui/backup_ui_stage.class.php
backup/util/ui/base_moodleform.class.php
backup/util/ui/base_ui_stage.class.php
lang/en/backup.php

index 3b66dc5..f00f0c9 100644 (file)
@@ -55,11 +55,24 @@ abstract class backup_moodleform extends base_moodleform {
 }
 /**
  * Initial backup user interface stage moodleform.
- *
- * Nothing to override we only need it defined so that moodleform doesn't get confused
- * between stages.
  */
-class backup_initial_form extends backup_moodleform {}
+class backup_initial_form extends backup_moodleform {
+
+    /**
+     * We override the initial form to offer a one click backup option.
+     */
+    public function definition() {
+        $mform = $this->_form;
+
+        $mform->addElement('header', 'backupheading', get_string('backup'));
+        $mform->addElement('html', html_writer::tag('p', get_string('performoneclickbackup_desc', 'backup')));
+        $mform->addElement('submit', 'oneclickbackup', get_string('performoneclickbackup', 'backup'));
+
+        parent::definition();
+
+        $mform->setDisableShortforms(false);
+    }
+}
 /**
  * Schema backup user interface stage moodleform.
  *
index 257a2ec..2b52880 100644 (file)
@@ -62,6 +62,12 @@ abstract class backup_ui_stage extends base_ui_stage {
  */
 class backup_ui_stage_initial extends backup_ui_stage {
 
+    /**
+     * When set to true we skip all stages and jump to immediately processing the backup.
+     * @var bool
+     */
+    protected $oneclickbackup = false;
+
     /**
      * Initial backup stage constructor
      * @param backup_ui $ui
@@ -86,6 +92,9 @@ class backup_ui_stage_initial extends backup_ui_stage {
 
         $data = $form->get_data();
         if ($data && confirm_sesskey()) {
+            if (isset($data->oneclickbackup)) {
+                $this->oneclickbackup = true;
+            }
             $tasks = $this->ui->get_tasks();
             $changes = 0;
             foreach ($tasks as &$task) {
@@ -112,6 +121,42 @@ class backup_ui_stage_initial extends backup_ui_stage {
         }
     }
 
+    /**
+     * Gets the next stage for the backup.
+     *
+     * We override this function to implement the one click backup.
+     * When the user performs a one click backup we jump straight to the final stage.
+     *
+     * @return int
+     */
+    public function get_next_stage() {
+        if ($this->oneclickbackup) {
+            // Its a one click backup.
+            // The default filename is backup.mbz, this normally gets set to something useful in the confirmation stage.
+            // because we skipped that stage we must manually set this to a useful value.
+            $tasks = $this->ui->get_tasks();
+            foreach ($tasks as $task) {
+                if ($task instanceof backup_root_task) {
+                    // Find the filename setting.
+                    $setting = $task->get_setting('filename');
+                    if ($setting) {
+                        // Use the helper objects to get a useful name.
+                        $filename = backup_plan_dbops::get_default_backup_filename(
+                            $this->ui->get_format(),
+                            $this->ui->get_type(),
+                            $this->ui->get_controller_id(),
+                            $this->ui->get_setting_value('users'),
+                            $this->ui->get_setting_value('anonymize')
+                        );
+                        $setting->set_value($filename);
+                    }
+                }
+            }
+            return backup_ui::STAGE_FINAL;
+        }
+        return parent::get_next_stage();
+    }
+
     /**
      * Initialises the backup_moodleform instance for this stage
      *
@@ -130,6 +175,7 @@ class backup_ui_stage_initial extends backup_ui_stage {
                 // For the initial stage we are only interested in the root settings
                 if ($task instanceof backup_root_task) {
                     $form->add_heading('rootsettings', get_string('rootsettings', 'backup'));
+                    $form->collapse_heading('rootsettings');
                     $settings = $task->get_settings();
                     // First add all settings except the filename setting
                     foreach ($settings as &$setting) {
index 262142e..b358436 100644 (file)
@@ -369,4 +369,13 @@ abstract class base_moodleform extends moodleform {
             $this->definition_after_data();
         }
     }
+
+    /**
+     * Can be used to collapse a heading from outside of this form.
+     *
+     * @param string $heading
+     */
+    public function collapse_heading($heading) {
+        $this->_form->setExpanded($heading, false);
+    }
 }
index 71b90dd..85f99a2 100644 (file)
@@ -84,7 +84,7 @@ abstract class base_ui_stage {
      * The next stage
      * @return int
      */
-    final public function get_next_stage() {
+    public function get_next_stage() {
         return floor($this->stage*2);
     }
     /**
index f72413c..61f6cb6 100644 (file)
@@ -177,6 +177,8 @@ $string['moreresults'] = 'There are too many results, enter a more specific sear
 $string['nomatchingcourses'] = 'There are no courses to display';
 $string['norestoreoptions'] = 'There are no categories or existing courses you can restore to.';
 $string['originalwwwroot'] = 'URL of backup';
+$string['performoneclickbackup'] = 'Perform quick backup';
+$string['performoneclickbackup_desc'] = 'Clicking this will create a backup using the current settings. If you wish to proceed through each stage of the backup individually use the controls at the bottom of the form.';
 $string['previousstage'] = 'Previous';
 $string['preparingui'] = 'Preparing to display page';
 $string['preparingdata'] = 'Preparing data';