From 294961cf8a4e30109d289f7d7a27f7fe64968b0f Mon Sep 17 00:00:00 2001 From: Sam Georges Date: Thu, 19 Jun 2014 21:40:24 +1000 Subject: [PATCH] Refactor how the Form widget manages fields. Widgets no longer need to pass configuration through "options". --- modules/backend/classes/FormField.php | 54 +++++++++-- modules/backend/classes/FormWidgetBase.php | 6 ++ modules/backend/classes/WidgetBase.php | 6 +- modules/backend/formwidgets/Datepicker.php | 4 +- modules/backend/widgets/Form.php | 100 ++++++--------------- 5 files changed, 83 insertions(+), 87 deletions(-) diff --git a/modules/backend/classes/FormField.php b/modules/backend/classes/FormField.php index f8a452307..04b4b879a 100644 --- a/modules/backend/classes/FormField.php +++ b/modules/backend/classes/FormField.php @@ -11,7 +11,6 @@ use Str; */ class FormField { - /** * @var string Form field column name. */ @@ -49,7 +48,7 @@ class FormField public $type = 'text'; /** - * @var string Field or widget options. + * @var string Field options. */ public $options = []; @@ -123,6 +122,11 @@ class FormField */ public $path; + /** + * @var array Raw field configuration. + */ + public $config; + public function __construct($columnName, $label) { $this->columnName = $columnName; @@ -158,6 +162,17 @@ class FormField return $this; } + /** + * Sets field options, for dropdowns, radio lists and checkbox lists. + * @param array $value + * @return self + */ + public function options($value = []) + { + $this->options = $value; + return $this; + } + /** * Specifies a field control rendering mode. Supported modes are: * - text - creates a text field. Default for varchar column types. @@ -167,15 +182,41 @@ class FormField * - checkbox - creates a single checkbox. * - checkboxlist - creates a checkbox list. * @param string $type Specifies a render mode as described above - * @param array $options A list of render mode specific options. + * @param array $config A list of render mode specific config. */ - public function displayAs($type, $options = []) + public function displayAs($type, $config = []) { - $this->type = $type; - $this->options = $options; + $this->type = strtolower($type) ?: $this->type; + $this->config = $this->evalConfig($config); return $this; } + /** + * Process options and apply them to this object. + * @param array $config + * @return array + */ + protected function evalConfig($config) + { + if (isset($config['options'])) $this->options($config['options']); + if (isset($config['span'])) $this->span($config['span']); + if (isset($config['context'])) $this->context = $config['context']; + if (isset($config['size'])) $this->size($config['size']); + if (isset($config['tab'])) $this->tab($config['tab']); + if (isset($config['commentAbove'])) $this->comment($config['commentAbove'], 'above'); + if (isset($config['comment'])) $this->comment($config['comment']); + if (isset($config['placeholder'])) $this->placeholder = $config['placeholder']; + if (isset($config['default'])) $this->defaults = $config['default']; + if (isset($config['cssClass'])) $this->cssClass = $config['cssClass']; + if (isset($config['attributes'])) $this->attributes = $config['attributes']; + if (isset($config['path'])) $this->path = $config['path']; + + if (array_key_exists('required', $config)) $this->required = $config['required']; + if (array_key_exists('disabled', $config)) $this->disabled = $config['disabled']; + if (array_key_exists('stretch', $config)) $this->stretch = $config['stretch']; + return $config; + } + /** * Adds a text comment above or below the field. * @param string $text Specifies a comment text. @@ -222,5 +263,4 @@ class FormField $id = rtrim(str_replace(['[', ']'], '-', $id), '-'); return $id; } - } \ No newline at end of file diff --git a/modules/backend/classes/FormWidgetBase.php b/modules/backend/classes/FormWidgetBase.php index 8bd621eaa..668e19676 100644 --- a/modules/backend/classes/FormWidgetBase.php +++ b/modules/backend/classes/FormWidgetBase.php @@ -50,6 +50,12 @@ abstract class FormWidgetBase extends WidgetBase if (isset($configuration->sessionKey)) $this->sessionKey = $configuration->sessionKey; if (isset($configuration->previewMode)) $this->previewMode = $configuration->previewMode; + /* + * Form fields originally passed their configuration via the options index. + * This step should be removed if year >= 2015. + */ + if (isset($configuration->options)) $configuration = array_merge($configuration->options, (array)$configuration); + parent::__construct($controller, $configuration); } diff --git a/modules/backend/classes/WidgetBase.php b/modules/backend/classes/WidgetBase.php index 9456644bb..e2c664d43 100644 --- a/modules/backend/classes/WidgetBase.php +++ b/modules/backend/classes/WidgetBase.php @@ -65,11 +65,7 @@ abstract class WidgetBase if (!$configuration) $configuration = []; - $this->config = new stdClass(); - foreach ($configuration as $name => $value) { - $name = camel_case($name); - $this->config->{$name} = $value; - } + $this->config = $this->makeConfig($configuration); /* * If no alias is set by the configuration. diff --git a/modules/backend/formwidgets/Datepicker.php b/modules/backend/formwidgets/Datepicker.php index dcac5aa87..fb204d403 100644 --- a/modules/backend/formwidgets/Datepicker.php +++ b/modules/backend/formwidgets/Datepicker.php @@ -3,8 +3,8 @@ use Backend\Classes\FormWidgetBase; /** - * Code Editor - * Renders a code editor field. + * Date picker + * Renders a date picker field. * * @package october\backend * @author Alexey Bobkov, Samuel Georges diff --git a/modules/backend/widgets/Form.php b/modules/backend/widgets/Form.php index bd624ec8c..84d40ce17 100644 --- a/modules/backend/widgets/Form.php +++ b/modules/backend/widgets/Form.php @@ -361,45 +361,34 @@ class Form extends WidgetBase $field->idPrefix = $this->getId(); /* - * Simple widget field, only widget type is supplied + * Simple field type */ - if (is_string($config) && $this->isFormWidget($config) !== false) { - $field->displayAs('widget', ['widget' => $config]); - return $field; - } - /* - * Simple field, only field type is supplied - */ - elseif (is_string($config)) { - $field->displayAs($config); - return $field; - } + if (is_string($config)) { + if ($this->isFormWidget($config) !== false) + $field->displayAs('widget', ['widget' => $config]); + else + $field->displayAs($config); + } /* * Defined field type */ - $fieldType = isset($config['type']) ? $config['type'] : null; - if (!is_string($fieldType) && !is_null($fieldType)) - throw new ApplicationException(Lang::get('backend::lang.field.invalid_type', ['type'=>gettype($fieldType)])); + else { - /* - * Process basic options - */ - if (isset($config['span'])) $field->span($config['span']); - if (isset($config['context'])) $field->context = $config['context']; - if (isset($config['size'])) $field->size($config['size']); - if (isset($config['tab'])) $field->tab($config['tab']); - if (isset($config['commentAbove'])) $field->comment($config['commentAbove'], 'above'); - if (isset($config['comment'])) $field->comment($config['comment']); - if (isset($config['placeholder'])) $field->placeholder = $config['placeholder']; - if (isset($config['default'])) $field->defaults = $config['default']; - if (isset($config['cssClass'])) $field->cssClass = $config['cssClass']; - if (isset($config['attributes'])) $field->attributes = $config['attributes']; - if (isset($config['path'])) $field->path = $config['path']; + $fieldType = isset($config['type']) ? $config['type'] : null; + if (!is_string($fieldType) && !is_null($fieldType)) + throw new ApplicationException(Lang::get('backend::lang.field.invalid_type', ['type'=>gettype($fieldType)])); - if (array_key_exists('required', $config)) $field->required = $config['required']; - if (array_key_exists('disabled', $config)) $field->disabled = $config['disabled']; - if (array_key_exists('stretch', $config)) $field->stretch = $config['stretch']; + /* + * Widget with configuration + */ + if ($this->isFormWidget($fieldType) !== false) { + $config['widget'] = $fieldType; + $fieldType = 'widget'; + } + + $field->displayAs($fieldType, $config); + } /* * Set field value @@ -407,24 +396,13 @@ class Form extends WidgetBase $field->value = $this->getFieldValue($field); /* - * Widget with options + * Get field options from model */ - if ($this->isFormWidget($fieldType) !== false) { - $fieldOptions = (isset($config['options'])) ? $config['options'] : []; - $fieldOptions['widget'] = $fieldType; - $field->displayAs('widget', $fieldOptions); - } - /* - * Simple field with options - */ - elseif (strlen($fieldType)) { + $optionModelTypes = ['dropdown', 'radio', 'checkboxlist']; + if (in_array($field->type, $optionModelTypes)) { $fieldOptions = (isset($config['options'])) ? $config['options'] : null; - $studlyField = studly_case(strtolower($fieldType)); - - if (method_exists($this, 'eval'.$studlyField.'Options')) - $fieldOptions = $this->{'eval'.$studlyField.'Options'}($field, $fieldOptions); - - $field->displayAs($fieldType, $fieldOptions); + $fieldOptions = $this->getOptionsFromModel($field, $fieldOptions); + $field->options($fieldOptions); } return $field; @@ -460,7 +438,7 @@ class Form extends WidgetBase if (isset($this->formWidgets[$field->columnName])) return $this->formWidgets[$field->columnName]; - $widgetConfig = $this->makeConfig($field->options); + $widgetConfig = $this->makeConfig($field->config); $widgetConfig->alias = $this->alias . studly_case($field->columnName); $widgetConfig->sessionKey = $this->getSessionKey(); @@ -583,30 +561,6 @@ class Form extends WidgetBase return $data; } - /** - * Evaluate and validate dropdown field options. - */ - public function evalDropdownOptions($field, $fieldOptions) - { - return $this->getOptionsFromModel($field, $fieldOptions); - } - - /** - * Evaluate and validate radio field options. - */ - public function evalRadioOptions($field, $fieldOptions) - { - return $this->getOptionsFromModel($field, $fieldOptions); - } - - /** - * Evaluate and validate checkbox list field options. - */ - public function evalCheckboxlistOptions($field, $fieldOptions) - { - return $this->getOptionsFromModel($field, $fieldOptions); - } - /** * Looks at the model for defined options. */