backup MDL-22142 P22 - Several big backup dependency issues resolved

This commit is contained in:
Sam Hemelryk 2010-05-02 09:02:20 +00:00
parent 5fcbdc6bf0
commit 84e546e0fc
5 changed files with 111 additions and 63 deletions

View file

@ -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')))); $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); $this->add_setting($userfiles);
$users->add_dependency($userfiles); $users->add_dependency($userfiles);
$anonymize->add_dependency($userfiles, setting_dependency::DISABLED_TRUE);
// Define activitites // Define activitites
$activities = new backup_activities_setting('activities', base_setting::IS_BOOLEAN, true); $activities = new backup_activities_setting('activities', base_setting::IS_BOOLEAN, true);

View file

@ -61,18 +61,6 @@ abstract class backup_setting extends base_setting implements checksumable {
public function is_checksum_correct($checksum) { public function is_checksum_correct($checksum) {
return $this->calculate_checksum() === $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();
}
} }
/* /*

View file

@ -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) { public function set_ui(backup_setting_ui $ui) {
$this->uisetting = $ui; $this->uisetting = $ui;
} }
@ -270,10 +286,18 @@ abstract class base_setting {
if ($type == null) { if ($type == null) {
switch ($this->vtype) { switch ($this->vtype) {
case self::IS_BOOLEAN : case self::IS_BOOLEAN :
if ($this->value) { if ($this->get_ui_type() == self::UI_HTML_CHECKBOX) {
$type = setting_dependency::DISABLED_FALSE; if ($this->value) {
$type = setting_dependency::DISABLED_NOT_CHECKED;
} else {
$type = setting_dependency::DISABLED_CHECKED;
}
} else { } else {
$type = setting_dependency::DISABLED_TRUE; if ($this->value) {
$type = setting_dependency::DISABLED_FALSE;
} else {
$type = setting_dependency::DISABLED_TRUE;
}
} }
break; break;
case self::IS_FILENAME : case self::IS_FILENAME :
@ -293,13 +317,17 @@ abstract class base_setting {
$dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, $options['value'], $options['defaultvalue']); $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, $options['value'], $options['defaultvalue']);
break; break;
case setting_dependency::DISABLED_TRUE : case setting_dependency::DISABLED_TRUE :
case setting_dependency::DISABLED_CHECKED :
$dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, true, $options['defaultvalue']); $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, true, $options['defaultvalue']);
break; break;
case setting_dependency::DISABLED_FALSE : case setting_dependency::DISABLED_FALSE :
case setting_dependency::DISABLED_NOT_CHECKED :
$dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, false, $options['defaultvalue']); $dependency = new setting_dependency_disabledif_equals($this, $dependentsetting, false, $options['defaultvalue']);
break; 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; $this->dependencies[$dependentsetting->get_name()] = $dependency;
$dependency->get_dependant_setting()->register_dependent_dependency($dependency); $dependency->get_dependant_setting()->register_dependent_dependency($dependency);
@ -389,13 +417,16 @@ abstract class base_setting {
return false; return false;
} }
protected function get_dependencies() { public function get_dependencies() {
$dependencies = array(); return $this->dependencies;
foreach ($this->dependencies as $dependency) { }
$dependencies[$dependency->get_dependant_setting()->get_name()] = $dependency->get_dependant_setting();
$dependencies = array_merge($dependencies, $dependency->get_dependencies()); public function get_ui_name() {
} return $this->uisetting->get_name();
return $dependencies; }
public function get_ui_type() {
return $this->uisetting->get_type();
} }
/** /**

View file

@ -38,10 +38,10 @@ abstract class setting_dependency {
*/ */
const DISABLED_VALUE = 0; const DISABLED_VALUE = 0;
const DISABLED_NOT_VALUE = 1; const DISABLED_NOT_VALUE = 1;
const DISABLED_CHECKED = 2;
const DISABLED_TRUE = 2; const DISABLED_TRUE = 2;
const DISABLED_NOT_CHECKED = 3;
const DISABLED_FALSE = 3; const DISABLED_FALSE = 3;
const DISABLED_CHECKED = 4;
const DISABLED_NOT_CHECKED = 5;
/** /**
* The parent setting (primary) * The parent setting (primary)
@ -130,6 +130,16 @@ abstract class setting_dependency {
public function get_dependant_setting() { public function get_dependant_setting() {
return $this->dependentsetting; 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) { public function __construct(base_setting $setting, base_setting $dependentsetting, $value, $defaultvalue = false) {
parent::__construct($setting, $dependentsetting, $defaultvalue); parent::__construct($setting, $dependentsetting, $defaultvalue);
$this->value = $value; $this->value = ($value)?(string)$value:0;
} }
/** /**
* Processes a value change in the primary setting * 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_status(base_setting::LOCKED_BY_HIERARCHY);
$this->dependentsetting->set_value($this->defaultvalue); $this->dependentsetting->set_value($this->defaultvalue);
} else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) {
// We can unlock the dependent setting and reset its value to the // We can unlock the dependent setting
// last value the user had for it.
$this->dependentsetting->set_status(base_setting::NOT_LOCKED); $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 true if the value has changed for the dependent setting
return ($prevalue != $this->dependentsetting->get_value()); return ($prevalue != $this->dependentsetting->get_value());
@ -222,6 +230,19 @@ class setting_dependency_disabledif_equals extends setting_dependency {
} }
return $changes; 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 * 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 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
class setting_dependency_disabledif_checked extends setting_dependency_disabledif_equals { class setting_dependency_disabledif_checked extends setting_dependency_disabledif_equals {
public function __construct(base_setting $setting, base_setting $dependentsetting) { public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) {
parent::__construct($setting, $dependentsetting, $defaultvalue = false); parent::__construct($setting, $dependentsetting, true, $defaultvalue);
$this->value = true; $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 * @copyright 2010 Sam Hemelryk
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @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) { public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) {
parent::__construct($setting, $dependentsetting); parent::__construct($setting, $dependentsetting, false, $defaultvalue);
$this->value = false; $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'
);
}
} }

View file

@ -110,21 +110,16 @@ abstract class backup_moodleform extends moodleform {
* @return bool * @return bool
*/ */
function add_setting(backup_setting $setting, backup_task $task=null) { 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
// First add the formatting for this setting $this->add_html_formatting($setting);
$this->add_html_formatting($setting); // The call the add method with the get_element_properties array
// 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));
call_user_method_array('addElement', $this->_form, $setting->get_ui()->get_element_properties($task)); $this->_form->setDefault($setting->get_ui_name(), $setting->get_value());
$this->_form->setDefault($setting->get_ui_name(), $setting->get_value()); if ($setting->has_help()) {
if ($setting->has_help()) { list($identifier, $component) = $setting->get_help();
list($identifier, $component) = $setting->get_help(); $this->_form->addHelpButton($setting->get_ui_name(), $identifier, $component);
$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);
} }
$this->_form->addElement('html', html_writer::end_tag('div'));
return true; return true;
} }
/** /**
@ -221,21 +216,9 @@ abstract class backup_moodleform extends moodleform {
if ($basesetting == null) { if ($basesetting == null) {
$basesetting = $setting; $basesetting = $setting;
} }
foreach ($setting->get_dependencies() as $dependency) { // Apply all dependencies for backup
$dependency = $dependency->get_dependant_setting(); foreach ($setting->get_all_dependencies() as $dependency) {
switch ($basesetting->get_ui_type()) { call_user_method_array('disabledIf', $this->_form, $dependency->get_moodleform_properties());
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;
}
} }
} }
/** /**