From 84e546e0fc05fea74639f85a67763b1b594be97e Mon Sep 17 00:00:00 2001 From: Sam Hemelryk Date: Sun, 2 May 2010 09:02:20 +0000 Subject: [PATCH] backup MDL-22142 P22 - Several big backup dependency issues resolved --- backup/moodle2/backup_root_task.class.php | 1 + backup/util/settings/backup_setting.class.php | 12 ---- backup/util/settings/base_setting.class.php | 55 ++++++++++++---- .../settings/setting_dependency.class.php | 65 ++++++++++++++++--- backup/util/ui/backup_moodleform.class.php | 41 ++++-------- 5 files changed, 111 insertions(+), 63 deletions(-) diff --git a/backup/moodle2/backup_root_task.class.php b/backup/moodle2/backup_root_task.class.php index 41ae043fe92..d171d5567ce 100644 --- a/backup/moodle2/backup_root_task.class.php +++ b/backup/moodle2/backup_root_task.class.php @@ -74,6 +74,7 @@ class backup_root_task extends backup_task { $userfiles->set_ui(new backup_setting_ui_select($userfiles, $userfiles->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); $this->add_setting($userfiles); $users->add_dependency($userfiles); + $anonymize->add_dependency($userfiles, setting_dependency::DISABLED_TRUE); // Define activitites $activities = new backup_activities_setting('activities', base_setting::IS_BOOLEAN, true); diff --git a/backup/util/settings/backup_setting.class.php b/backup/util/settings/backup_setting.class.php index 666050e6ff1..279afa6170e 100644 --- a/backup/util/settings/backup_setting.class.php +++ b/backup/util/settings/backup_setting.class.php @@ -61,18 +61,6 @@ abstract class backup_setting extends base_setting implements checksumable { public function is_checksum_correct($checksum) { return $this->calculate_checksum() === $checksum; } - - public function get_dependencies() { - return $this->dependencies; - } - - public function get_ui_name() { - return $this->uisetting->get_name(); - } - - public function get_ui_type() { - return $this->uisetting->get_type(); - } } /* diff --git a/backup/util/settings/base_setting.class.php b/backup/util/settings/base_setting.class.php index 665db668450..1171b395dbc 100644 --- a/backup/util/settings/base_setting.class.php +++ b/backup/util/settings/base_setting.class.php @@ -188,6 +188,22 @@ abstract class base_setting { } } + /** + * Returns an array of all dependencies this setting has as well as the dependencies + * of its dependencies.... another words recursivily + * @return array + */ + public function get_all_dependencies() { + $dependencies = array_values($this->dependencies); + foreach ($this->dependencies as &$dependency) { + $childdependencies = $dependency->get_dependant_setting()->get_all_dependencies(); + foreach ($childdependencies as $name=>&$childdependency) { + $dependencies[] = $childdependency; + } + } + return $dependencies; + } + public function set_ui(backup_setting_ui $ui) { $this->uisetting = $ui; } @@ -270,10 +286,18 @@ abstract class base_setting { if ($type == null) { switch ($this->vtype) { case self::IS_BOOLEAN : - if ($this->value) { - $type = setting_dependency::DISABLED_FALSE; + if ($this->get_ui_type() == self::UI_HTML_CHECKBOX) { + if ($this->value) { + $type = setting_dependency::DISABLED_NOT_CHECKED; + } else { + $type = setting_dependency::DISABLED_CHECKED; + } } else { - $type = setting_dependency::DISABLED_TRUE; + if ($this->value) { + $type = setting_dependency::DISABLED_FALSE; + } else { + $type = setting_dependency::DISABLED_TRUE; + } } break; case self::IS_FILENAME : @@ -293,13 +317,17 @@ abstract class base_setting { $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, $options['value'], $options['defaultvalue']); break; case setting_dependency::DISABLED_TRUE : - case setting_dependency::DISABLED_CHECKED : $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, true, $options['defaultvalue']); break; case setting_dependency::DISABLED_FALSE : - case setting_dependency::DISABLED_NOT_CHECKED : $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, false, $options['defaultvalue']); break; + case setting_dependency::DISABLED_CHECKED : + $dependency = new setting_dependency_disabledif_checked($this, $dependentsetting, $options['defaultvalue']); + break; + case setting_dependency::DISABLED_NOT_CHECKED : + $dependency = new setting_dependency_disabledif_not_checked($this, $dependentsetting, $options['defaultvalue']); + break; } $this->dependencies[$dependentsetting->get_name()] = $dependency; $dependency->get_dependant_setting()->register_dependent_dependency($dependency); @@ -389,13 +417,16 @@ abstract class base_setting { return false; } - protected function get_dependencies() { - $dependencies = array(); - foreach ($this->dependencies as $dependency) { - $dependencies[$dependency->get_dependant_setting()->get_name()] = $dependency->get_dependant_setting(); - $dependencies = array_merge($dependencies, $dependency->get_dependencies()); - } - return $dependencies; + public function get_dependencies() { + return $this->dependencies; + } + + public function get_ui_name() { + return $this->uisetting->get_name(); + } + + public function get_ui_type() { + return $this->uisetting->get_type(); } /** diff --git a/backup/util/settings/setting_dependency.class.php b/backup/util/settings/setting_dependency.class.php index a851f003afc..310ef66985e 100644 --- a/backup/util/settings/setting_dependency.class.php +++ b/backup/util/settings/setting_dependency.class.php @@ -38,10 +38,10 @@ abstract class setting_dependency { */ const DISABLED_VALUE = 0; const DISABLED_NOT_VALUE = 1; - const DISABLED_CHECKED = 2; const DISABLED_TRUE = 2; - const DISABLED_NOT_CHECKED = 3; const DISABLED_FALSE = 3; + const DISABLED_CHECKED = 4; + const DISABLED_NOT_CHECKED = 5; /** * The parent setting (primary) @@ -130,6 +130,16 @@ abstract class setting_dependency { public function get_dependant_setting() { return $this->dependentsetting; } + /** + * This function enforces the dependency + */ + abstract public function enforce(); + /** + * Returns an array of properties suitable to be used to define a moodleforms + * disabled command + * @return array + */ + abstract public function get_moodleform_properties(); } /** @@ -155,7 +165,7 @@ class setting_dependency_disabledif_equals extends setting_dependency { */ public function __construct(base_setting $setting, base_setting $dependentsetting, $value, $defaultvalue = false) { parent::__construct($setting, $dependentsetting, $defaultvalue); - $this->value = $value; + $this->value = ($value)?(string)$value:0; } /** * Processes a value change in the primary setting @@ -171,10 +181,8 @@ class setting_dependency_disabledif_equals extends setting_dependency { $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); $this->dependentsetting->set_value($this->defaultvalue); } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { - // We can unlock the dependent setting and reset its value to the - // last value the user had for it. + // We can unlock the dependent setting $this->dependentsetting->set_status(base_setting::NOT_LOCKED); - $this->dependentsetting->set_value($this->lastvalue); } // Return true if the value has changed for the dependent setting return ($prevalue != $this->dependentsetting->get_value()); @@ -222,6 +230,19 @@ class setting_dependency_disabledif_equals extends setting_dependency { } return $changes; } + /** + * Returns an array of properties suitable to be used to define a moodleforms + * disabled command + * @return array + */ + public function get_moodleform_properties() { + return array( + 'setting'=>$this->dependentsetting->get_ui_name(), + 'dependenton'=>$this->setting->get_ui_name(), + 'condition'=>'eq', + 'value'=>$this->value + ); + } } /** * A dependency that disables the secondary element if the primary element is @@ -231,10 +252,22 @@ class setting_dependency_disabledif_equals extends setting_dependency { * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class setting_dependency_disabledif_checked extends setting_dependency_disabledif_equals { - public function __construct(base_setting $setting, base_setting $dependentsetting) { - parent::__construct($setting, $dependentsetting, $defaultvalue = false); + public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { + parent::__construct($setting, $dependentsetting, true, $defaultvalue); $this->value = true; } + /** + * Returns an array of properties suitable to be used to define a moodleforms + * disabled command + * @return array + */ + public function get_moodleform_properties() { + return array( + 'setting'=>$this->dependentsetting->get_ui_name(), + 'dependenton'=>$this->setting->get_ui_name(), + 'condition'=>'checked' + ); + } } /** @@ -244,9 +277,21 @@ class setting_dependency_disabledif_checked extends setting_dependency_disabledi * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class setting_dependency_disabledif_notchecked extends setting_dependency_disabledif_equals { +class setting_dependency_disabledif_not_checked extends setting_dependency_disabledif_equals { public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { - parent::__construct($setting, $dependentsetting); + parent::__construct($setting, $dependentsetting, false, $defaultvalue); $this->value = false; } + /** + * Returns an array of properties suitable to be used to define a moodleforms + * disabled command + * @return array + */ + public function get_moodleform_properties() { + return array( + 'setting'=>$this->dependentsetting->get_ui_name(), + 'dependenton'=>$this->setting->get_ui_name(), + 'condition'=>'notchecked' + ); + } } \ No newline at end of file diff --git a/backup/util/ui/backup_moodleform.class.php b/backup/util/ui/backup_moodleform.class.php index 52ebc4b3aed..3922978e8b4 100644 --- a/backup/util/ui/backup_moodleform.class.php +++ b/backup/util/ui/backup_moodleform.class.php @@ -110,21 +110,16 @@ abstract class backup_moodleform extends moodleform { * @return bool */ function add_setting(backup_setting $setting, backup_task $task=null) { - if ($setting->get_status() == backup_setting::NOT_LOCKED && $setting->get_visibility() == backup_setting::VISIBLE) { - // First add the formatting for this setting - $this->add_html_formatting($setting); - // The call the add method with the get_element_properties array - call_user_method_array('addElement', $this->_form, $setting->get_ui()->get_element_properties($task)); - $this->_form->setDefault($setting->get_ui_name(), $setting->get_value()); - if ($setting->has_help()) { - list($identifier, $component) = $setting->get_help(); - $this->_form->addHelpButton($setting->get_ui_name(), $identifier, $component); - } - $this->_form->addElement('html', html_writer::end_tag('div')); - } else { - // Add as a fixed unchangeable setting - $this->add_fixed_setting($setting); + // First add the formatting for this setting + $this->add_html_formatting($setting); + // The call the add method with the get_element_properties array + call_user_method_array('addElement', $this->_form, $setting->get_ui()->get_element_properties($task)); + $this->_form->setDefault($setting->get_ui_name(), $setting->get_value()); + if ($setting->has_help()) { + list($identifier, $component) = $setting->get_help(); + $this->_form->addHelpButton($setting->get_ui_name(), $identifier, $component); } + $this->_form->addElement('html', html_writer::end_tag('div')); return true; } /** @@ -221,21 +216,9 @@ abstract class backup_moodleform extends moodleform { if ($basesetting == null) { $basesetting = $setting; } - foreach ($setting->get_dependencies() as $dependency) { - $dependency = $dependency->get_dependant_setting(); - switch ($basesetting->get_ui_type()) { - case backup_setting::UI_HTML_CHECKBOX : - $mform->disabledIf($dependency->get_ui_name(), $basesetting->get_ui_name(), 'notchecked'); - $this->add_dependencies($dependency, $basesetting); - break; - case backup_setting::UI_HTML_DROPDOWN : - $mform->disabledIf($dependency->get_ui_name(), $basesetting->get_ui_name(), 'eq', 0); - $this->add_dependencies($dependency, $basesetting); - break; - default: - debugging('Unknown backup setting type', DEBUG_DEVELOPER); - break; - } + // Apply all dependencies for backup + foreach ($setting->get_all_dependencies() as $dependency) { + call_user_method_array('disabledIf', $this->_form, $dependency->get_moodleform_properties()); } } /**