. /** * This file contains the setting user interface classes that all backup/restore * settings use to represent the UI they have. * * @package moodlecore * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Abstract class used to represent the user interface that a setting has. * * @todo extend as required for restore * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class base_setting_ui { /** * Prefix applied to all inputs/selects */ const NAME_PREFIX = 'setting_'; /** * The name of the setting * @var string */ protected $name; /** * The label for the setting * @var string */ protected $label; /** * An array of HTML attributes to apply to this setting * @var array */ protected $attributes = array(); /** * The backup_setting UI type this relates to. One of backup_setting::UI_*; * @var int */ protected $type; /** * An icon to display next to this setting in the UI * @var pix_icon */ protected $icon = false; /** * The setting this UI belongs to (parent reference) * @var base_setting|backup_setting */ protected $setting; /** * Constructors are sooooo cool * @param base_setting $setting */ public function __construct(base_setting $setting) { $this->setting = $setting; } /** * Destroy all circular references. It helps PHP 5.2 a lot! */ public function destroy() { // No need to destroy anything recursively here, direct reset $this->setting = null; } /** * Gets the name of this item including its prefix * @return string */ public function get_name() { return self::NAME_PREFIX.$this->name; } /** * Gets the name of this item including its prefix * @return string */ public function get_label() { return $this->label; } /** * Gets the type of this element * @return int */ public function get_type() { return $this->type; } /** * Gets the HTML attributes for this item * @return array */ public function get_attributes() { return $this->attributes; } /** * Gets the value of this setting * @return mixed */ public function get_value() { return $this->setting->get_value(); } /** * Gets the value to display in a static quickforms element * @return mixed */ public function get_static_value() { return $this->setting->get_value(); } /** * Sets the label * @param string $label */ public function set_label($label) { if ((string)$label === '' || $label !== clean_param($label, PARAM_TEXT)) { throw new base_setting_ui_exception('setting_invalid_ui_label'); } $this->label = $label; } /** * Disables the UI for this element */ public function disable() { $this->attributes['disabled'] = 'disabled'; } /** * Sets the icon to display next to this item * * @param pix_icon $icon */ public function set_icon(pix_icon $icon) { $this->icon = $icon; } /** * Returns the icon to display next to this item, or false if there isn't one. * * @return pix_icon|false */ public function get_icon() { if (!empty($this->icon)) { return $this->icon; } return false; } } /** * Abstract class to represent the user interface backup settings have * * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class backup_setting_ui extends base_setting_ui { /** * An array of options relating to this setting * @var array */ protected $options = array(); /** * JAC... Just Another Constructor * * @param backup_setting $setting * @param string|null $label The label to display with the setting ui * @param array|null $attributes Array of HTML attributes to apply to the element * @param array|null $options Array of options to apply to the setting ui object */ public function __construct(backup_setting $setting, $label = null, array $attributes = null, array $options = null) { parent::__construct($setting); // Improve the inputs name by appending the level to the name switch ($setting->get_level()) { case backup_setting::ROOT_LEVEL : $this->name = 'root_'.$setting->get_name(); break; case backup_setting::COURSE_LEVEL : $this->name = 'course_'.$setting->get_name(); break; case backup_setting::SECTION_LEVEL : $this->name = 'section_'.$setting->get_name(); break; case backup_setting::ACTIVITY_LEVEL : $this->name = 'activity_'.$setting->get_name(); break; } $this->label = $label; if (is_array($attributes)) { $this->attributes = $attributes; } if (is_array($options)) { $this->options = $options; } } /** * Creates a new backup setting ui based on the setting it is given * * Throws an exception if an invalid type is provided. * * @param backup_setting $setting * @param int $type The backup_setting UI type. One of backup_setting::UI_*; * @param string $label The label to display with the setting ui * @param array $attributes Array of HTML attributes to apply to the element * @param array $options Array of options to apply to the setting ui object * * @return backup_setting_ui_text|backup_setting_ui_checkbox|backup_setting_ui_select|backup_setting_ui_radio */ final public static function make(backup_setting $setting, $type, $label, array $attributes = null, array $options=null) { // Base the decision we make on the type that was sent switch ($type) { case backup_setting::UI_HTML_CHECKBOX : return new backup_setting_ui_checkbox($setting, $label, null, (array)$attributes, (array)$options); case backup_setting::UI_HTML_DROPDOWN : return new backup_setting_ui_select($setting, $label, null, (array)$attributes, (array)$options); case backup_setting::UI_HTML_RADIOBUTTON : return new backup_setting_ui_radio($setting, $label, null, null, (array)$attributes, (array)$options); case backup_setting::UI_HTML_TEXTFIELD : return new backup_setting_ui_text($setting, $label, $attributes, $options); default: throw new backup_setting_ui_exception('setting_invalid_ui_type'); } } /** * Get element properties that can be used to make a quickform element * @return array */ abstract public function get_element_properties(base_task $task=null, renderer_base $output=null); /** * Applies config options to a given properties array and then returns it * @param array $properties * @return array */ public function apply_options(array $properties) { if (!empty($this->options['size'])) { $properties['attributes']['size'] = $this->options['size']; } return $properties; } /** * Gets the label for this item * @param backup_task|null $task Optional, if provided and the setting is an include * $task is used to set the setting label * @return string */ public function get_label(base_task $task=null) { // If a task has been provided and the label is not already set meaniningfully // we will attempt to improve it. if (!is_null($task) && $this->label == $this->setting->get_name() && strpos($this->setting->get_name(), '_include')!==false) { if ($this->setting->get_level() == backup_setting::SECTION_LEVEL) { $this->label = get_string('includesection', 'backup', $task->get_name()); } else if ($this->setting->get_level() == backup_setting::ACTIVITY_LEVEL) { $this->label = $task->get_name(); } } return $this->label; } /** * Returns true if the setting is changeable. * * A setting is changeable if it meets either of the two following conditions. * * 1. The setting is not locked * 2. The setting is locked but only by settings that are of the same level (same page) * * Condition 2 is really why we have this function * * @return bool */ public function is_changeable() { if ($this->setting->get_status() === backup_setting::NOT_LOCKED) { // Its not locked so its chanegable return true; } else if ($this->setting->get_status() !== backup_setting::LOCKED_BY_HIERARCHY) { // Its not changeable because its locked by permission or config return false; } else if ($this->setting->has_dependencies_on_settings()) { foreach ($this->setting->get_settings_depended_on() as $dependency) { if ($dependency->is_locked() && $dependency->get_setting()->get_level() !== $this->setting->get_level()) { // Its not changeable because one or more dependancies arn't // changeable. return false; } } // Its changeable because all dependencies are changeable. return true; } // We should never get here but if we do return false to be safe. // The setting would need to be locked by hierarchy and not have any deps return false; } } /** * A text input user interface element for backup settings * * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class backup_setting_ui_text extends backup_setting_ui { /** * @var int */ protected $type = backup_setting::UI_HTML_TEXTFIELD; /** * Returns an array of properties suitable for generating a quickforms element * @param backup_task|null $task * @return array (element, name, label, attributes) */ public function get_element_properties(base_task $task=null, renderer_base $output=null) { // name, label, text, attributes $icon = $this->get_icon(); $label = $this->get_label($task); if (!empty($icon)) { $label .= ' '.$output->render($icon); } // name, label, attributes return $this->apply_options(array('element'=>'text','name'=>self::NAME_PREFIX.$this->name, 'label'=>$label, 'attributes'=>$this->attributes)); } } /** * A checkbox user interface element for backup settings (default) * * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class backup_setting_ui_checkbox extends backup_setting_ui { /** * @var int */ protected $type = backup_setting::UI_HTML_CHECKBOX; /** * @var bool */ protected $changeable = true; /** * The text to show next to the checkbox * @var string */ protected $text; /** * Overridden constructor so we can take text argument * @param backup_setting $setting * @param string $label * @param string $text * @param array $attributes * @param array $options */ public function __construct(backup_setting $setting, $label = null, $text=null, array $attributes = array(), array $options = array()) { parent::__construct($setting, $label, $attributes, $options); $this->text = $text; } /** * Returns an array of properties suitable for generating a quickforms element * @param backup_task|null $task * @return array (element, name, label, text, attributes); */ public function get_element_properties(base_task $task=null, renderer_base $output=null) { // name, label, text, attributes $icon = $this->get_icon(); $label = $this->get_label($task); if (!empty($icon)) { $label .= ' '.$output->render($icon); } return $this->apply_options(array('element'=>'checkbox','name'=>self::NAME_PREFIX.$this->name, 'label'=>$label, 'text'=>$this->text, 'attributes'=>$this->attributes)); } /** * Sets the text for the element * @param string $text */ public function set_text($text) { $this->text = $text; } /** * Gets the static value for the element * @global core_renderer $OUTPUT * @return string */ public function get_static_value() { global $OUTPUT; // Checkboxes are always yes or no if ($this->get_value()) { return $OUTPUT->pix_icon('i/tick_green_big', get_string('yes')); } else { return $OUTPUT->pix_icon('i/cross_red_big', get_string('no')); } } /** * Returns true if the setting is changeable * @return bool */ public function is_changeable() { if ($this->changeable===false) { return false; } else { return parent::is_changeable(); } } /** * Sets whether the setting is changeable, * Note dependencies can still mark this setting changeable or not * @param bool $newvalue */ public function set_changeable($newvalue) { $this->changeable = ($newvalue); } } /** * Radio button user interface element for backup settings * * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class backup_setting_ui_radio extends backup_setting_ui { /** * @var int */ protected $type = backup_setting::UI_HTML_RADIOBUTTON; /** * The string shown next to the input * @var string */ protected $text; /** * The value for the radio input * @var string */ protected $value; /** * * @param backup_setting $setting * @param string $label * @param string $text * @param string $value * @param array $attributes * @param array $options */ public function __construct(backup_setting $setting, $label = null, $text=null, $value=null, array $attributes = array(), array $options = array()) { parent::__construct($setting, $label, $attributes, $options); $this->text = $text; $this->value = (string)$value; } /** * Returns an array of properties suitable for generating a quickforms element * @param backup_task|null $task * @return array (element, name, label, text, value, attributes) */ public function get_element_properties(base_task $task=null, renderer_base $output=null) { // name, label, text, attributes $icon = $this->get_icon(); $label = $this->get_label($task); if (!empty($icon)) { $label .= ' '.$output->render($icon); } // name, label, text, value, attributes return $this->apply_options(array('element'=>'radio','name'=>self::NAME_PREFIX.$this->name, 'label'=>$label, 'text'=>$this->text, 'value'=>$this->value, 'attributes'=>$this->attributes)); } /** * Sets the text next to this input * @param text $text */ public function set_text($text) { $this->text = $text; } /** * Sets the value for the input * @param string $value */ public function set_value($value) { $this->value = (string)$value; } /** * Gets the static value to show for the element */ public function get_static_value() { return $this->value; } } /** * A select box, drop down user interface for backup settings * * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class backup_setting_ui_select extends backup_setting_ui { /** * @var int */ protected $type = backup_setting::UI_HTML_DROPDOWN; /** * An array of options to display in the select * @var array */ protected $values; /** * * @param backup_setting $setting * @param string $label * @param array $values * @param array $attributes * @param array $options */ public function __construct(backup_setting $setting, $label = null, $values=null, array $attributes = array(), array $options = array()) { parent::__construct($setting, $label, $attributes, $options); $this->values = $values; } /** * Returns an array of properties suitable for generating a quickforms element * @param backup_task|null $task * @return array (element, name, label, options, attributes) */ public function get_element_properties(base_task $task = null, renderer_base $output=null) { // name, label, text, attributes $icon = $this->get_icon(); $label = $this->get_label($task); if (!empty($icon)) { $label .= ' '.$output->render($icon); } // name, label, options, attributes return $this->apply_options(array('element'=>'select','name'=>self::NAME_PREFIX.$this->name, 'label'=>$label, 'options'=>$this->values, 'attributes'=>$this->attributes)); } /** * Sets the options for the select box * @param array $values Associative array of value=>text options */ public function set_values(array $values) { $this->values = $values; } /** * Gets the static value for this select element * @return string */ public function get_static_value() { return $this->values[$this->get_value()]; } /** * Returns true if the setting is changeable, false otherwise * * @return bool */ public function is_changeable() { if (count($this->values) == 1) { return false; } else { return parent::is_changeable(); } } } class backup_setting_ui_dateselector extends backup_setting_ui_text { public function get_element_properties(base_task $task = null, renderer_base $output=null) { if (!array_key_exists('optional', $this->attributes)) { $this->attributes['optional'] = false; } $properties = parent::get_element_properties($task, $output); $properties['element'] = 'date_selector'; return $properties; } public function get_static_value() { $value = $this->get_value(); if (!empty($value)) { return userdate($value); } return parent::get_static_value(); } } class base_setting_ui_exception extends base_setting_exception {} class backup_setting_ui_exception extends base_setting_ui_exception {};