diff --git a/forms/DropdownField.php b/forms/DropdownField.php index c4f8a3016..08385a52f 100644 --- a/forms/DropdownField.php +++ b/forms/DropdownField.php @@ -96,7 +96,7 @@ class DropdownField extends SingleSelectField { // Check disabled $disabled = false; - if(in_array($value, $this->getDisabledItems()) && $title != $this->getEmptyString()){ + if($this->isDisabledValue($value) && $title != $this->getEmptyString()){ $disabled = 'disabled'; } diff --git a/forms/MemberDatetimeOptionsetField.php b/forms/MemberDatetimeOptionsetField.php index 23ea8ebe9..686c5e0dc 100644 --- a/forms/MemberDatetimeOptionsetField.php +++ b/forms/MemberDatetimeOptionsetField.php @@ -7,6 +7,14 @@ class MemberDatetimeOptionsetField extends OptionsetField { const CUSTOM_OPTION = '__custom__'; + /** + * Non-ambiguous date to use for the preview. + * Must be in 'y-MM-dd HH:mm:ss' format + * + * @var string + */ + private static $preview_date = '25-12-2011 17:30:00'; + public function Field($properties = array()) { Requirements::javascript(FRAMEWORK_ADMIN_DIR . '/javascript/MemberDatetimeOptionsetField.js'); $options = array(); @@ -53,15 +61,27 @@ class MemberDatetimeOptionsetField extends OptionsetField { $option->setField('CustomName', $this->getName().'[Custom]'); $option->setField('CustomValue', $this->Value()); if($this->Value()) { - $preview = Convert::raw2xml(Zend_Date::now()->toString($this->Value())); + $preview = Convert::raw2xml($this->previewFormat($this->Value())); $option->setField('CustomPreview', $preview); $option->setField('CustomPreviewLabel', _t('MemberDatetimeOptionsetField.Preview', 'Preview')); } return $option; } - public function getItemName() { - return parent::getItemName() . '[Options]'; + /** + * For a given format, generate a preview for the date + * + * @param string $format Date format + * @return string + */ + protected function previewFormat($format) { + $date = $this->config()->preview_date; + $zendDate = new Zend_Date($date, 'y-MM-dd HH:mm:ss'); + return $zendDate->toString($format); + } + + public function getOptionName() { + return parent::getOptionName() . '[Options]'; } public function Type() { diff --git a/forms/MultiSelectField.php b/forms/MultiSelectField.php index 912f5a0b2..437fb2869 100644 --- a/forms/MultiSelectField.php +++ b/forms/MultiSelectField.php @@ -147,10 +147,8 @@ abstract class MultiSelectField extends SelectField { if($result !== false) { return $result; } - - // Parse data in legacy {comma} format - Deprecation::notice('4.0', 'Storing multi-selection values in comma separated format is deprecated'); - return str_replace('{comma}', ',', explode(',', $value)); + + throw new \InvalidArgumentException("Invalid string encoded value for multi select field"); } /** diff --git a/forms/OptionsetField.php b/forms/OptionsetField.php index feb1dea3d..e8d577b38 100644 --- a/forms/OptionsetField.php +++ b/forms/OptionsetField.php @@ -61,27 +61,50 @@ class OptionsetField extends SingleSelectField { * @return ArrayData Field option */ protected function getFieldOption($value, $title, $odd) { - // Check selection - $selected = $this->isSelectedValue($value, $this->Value()); - $itemID = $this->ID() . '_' . Convert::raw2htmlid($value); - $extraClass = $odd ? 'odd' : 'even'; - $extraClass .= ' val' . Convert::raw2htmlid($value); - return new ArrayData(array( - 'ID' => $itemID, - 'Class' => $extraClass, - 'Name' => $this->getItemName(), + 'ID' => $this->getOptionID($value), + 'Class' => $this->getOptionClass($value, $odd), + 'Name' => $this->getOptionName(), 'Value' => $value, 'Title' => $title, - 'isChecked' => $selected, - 'isDisabled' => $this->isDisabled() || in_array($value, $this->getDisabledItems()), + 'isChecked' => $this->isSelectedValue($value, $this->Value()), + 'isDisabled' => $this->isDisabledValue($value) )); } - protected function getItemName() { + /** + * Generate an ID property for a single option + * + * @param string $value + * @return string + */ + protected function getOptionID($value) { + return $this->ID() . '_' . Convert::raw2htmlid($value); + } + + /** + * Get the "name" property for each item in the list + * + * @return string + */ + protected function getOptionName() { return $this->getName(); } + /** + * Get extra classes for each item in the list + * + * @param string $value Value of this item + * @param bool $odd If this item is odd numbered in the list + * @return string + */ + protected function getOptionClass($value, $odd) { + $oddClass = $odd ? 'odd' : 'even'; + $valueClass = ' val' . Convert::raw2htmlid($value); + return $oddClass . $valueClass; + } + + public function Field($properties = array()) { $options = array(); $odd = false; diff --git a/forms/SelectField.php b/forms/SelectField.php index 21a7d9b89..27d30bcde 100644 --- a/forms/SelectField.php +++ b/forms/SelectField.php @@ -58,6 +58,19 @@ abstract class SelectField extends FormField { return $this->disabledItems; } + /** + * Check if the given value is disabled + * + * @param string $value + * @return bool + */ + protected function isDisabledValue($value) { + if($this->isDisabled()) { + return true; + } + return in_array($value, $this->getDisabledItems()); + } + public function getAttributes() { return array_merge( parent::getAttributes(), diff --git a/templates/forms/DropdownField.ss b/templates/forms/DropdownField.ss index a46ce3b07..1e07c86cd 100644 --- a/templates/forms/DropdownField.ss +++ b/templates/forms/DropdownField.ss @@ -3,6 +3,7 @@ + ><% if $Title %>$Title.XML<% else %> <% end_if %> + <% end_loop %>