mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
Moved checkboxset option list generation to separate method
This allows subclasses and extensions time to modify the list of options and their configuration without having to override the entire Field method. A more flexible way to implement silverstripe#3311
This commit is contained in:
parent
59e7f777a2
commit
5a14b7227c
@ -42,7 +42,7 @@ class CheckboxSetField extends OptionsetField {
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultItems = array();
|
||||
|
||||
|
||||
/**
|
||||
* @todo Explain different source data that can be used with this field,
|
||||
* e.g. SQLMap, ArrayList or an array.
|
||||
@ -50,6 +50,21 @@ class CheckboxSetField extends OptionsetField {
|
||||
public function Field($properties = array()) {
|
||||
Requirements::css(FRAMEWORK_DIR . '/css/CheckboxSetField.css');
|
||||
|
||||
$properties = array_merge($properties, array(
|
||||
'Options' => $this->getOptions()
|
||||
));
|
||||
|
||||
return $this->customise($properties)->renderWith(
|
||||
$this->getTemplates()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ArrayList
|
||||
*/
|
||||
public function getOptions() {
|
||||
$odd = 0;
|
||||
|
||||
$source = $this->source;
|
||||
$values = $this->value;
|
||||
$items = array();
|
||||
@ -99,47 +114,48 @@ class CheckboxSetField extends OptionsetField {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(is_array($source)) {
|
||||
unset($source['']);
|
||||
}
|
||||
|
||||
$odd = 0;
|
||||
$options = array();
|
||||
|
||||
if ($source == null) $source = array();
|
||||
|
||||
if($source) {
|
||||
foreach($source as $value => $item) {
|
||||
if($item instanceof DataObject) {
|
||||
$value = $item->ID;
|
||||
$title = $item->Title;
|
||||
} else {
|
||||
$title = $item;
|
||||
}
|
||||
|
||||
$itemID = $this->ID() . '_' . preg_replace('/[^a-zA-Z0-9]/', '', $value);
|
||||
$odd = ($odd + 1) % 2;
|
||||
$extraClass = $odd ? 'odd' : 'even';
|
||||
$extraClass .= ' val' . preg_replace('/[^a-zA-Z0-9\-\_]/', '_', $value);
|
||||
|
||||
$options[] = new ArrayData(array(
|
||||
'ID' => $itemID,
|
||||
'Class' => $extraClass,
|
||||
'Name' => "{$this->name}[{$value}]",
|
||||
'Value' => $value,
|
||||
'Title' => $title,
|
||||
'isChecked' => in_array($value, $items) || in_array($value, $this->defaultItems),
|
||||
'isDisabled' => $this->disabled || in_array($value, $this->disabledItems)
|
||||
));
|
||||
}
|
||||
if ($source == null) {
|
||||
$source = array();
|
||||
}
|
||||
|
||||
$properties = array_merge($properties, array('Options' => new ArrayList($options)));
|
||||
foreach($source as $value => $item) {
|
||||
if($item instanceof DataObject) {
|
||||
$value = $item->ID;
|
||||
$title = $item->Title;
|
||||
} else {
|
||||
$title = $item;
|
||||
}
|
||||
|
||||
return $this->customise($properties)->renderWith($this->getTemplates());
|
||||
$itemID = $this->ID() . '_' . preg_replace('/[^a-zA-Z0-9]/', '', $value);
|
||||
$odd = ($odd + 1) % 2;
|
||||
$extraClass = $odd ? 'odd' : 'even';
|
||||
$extraClass .= ' val' . preg_replace('/[^a-zA-Z0-9\-\_]/', '_', $value);
|
||||
|
||||
$options[] = new ArrayData(array(
|
||||
'ID' => $itemID,
|
||||
'Class' => $extraClass,
|
||||
'Name' => "{$this->name}[{$value}]",
|
||||
'Value' => $value,
|
||||
'Title' => $title,
|
||||
'isChecked' => in_array($value, $items) || in_array($value, $this->defaultItems),
|
||||
'isDisabled' => $this->disabled || in_array($value, $this->disabledItems)
|
||||
));
|
||||
}
|
||||
|
||||
$options = new ArrayList($options);
|
||||
|
||||
$this->extend('updateGetOptions', $options);
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default selections, regardless of the {@link setValue()} settings.
|
||||
* Note: Items marked as disabled through {@link setDisabledItems()} can still be
|
||||
|
Loading…
x
Reference in New Issue
Block a user