2007-07-19 12:40:28 +02:00
|
|
|
<?php
|
2016-06-15 06:03:16 +02:00
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
namespace SilverStripe\Forms;
|
|
|
|
|
2016-06-15 06:03:16 +02:00
|
|
|
use SilverStripe\ORM\ArrayList;
|
2016-06-03 10:51:02 +02:00
|
|
|
use SilverStripe\ORM\FieldType\DBField;
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\View\Requirements;
|
2016-06-03 10:51:02 +02:00
|
|
|
|
2007-07-19 12:40:28 +02:00
|
|
|
/**
|
2014-08-15 08:53:05 +02:00
|
|
|
* Represents a number of fields which are selectable by a radio
|
|
|
|
* button that appears at the beginning of each item. Using CSS, you can
|
|
|
|
* configure the field to only display its contents if the corresponding radio
|
2012-11-30 15:06:49 +01:00
|
|
|
* button is selected. Each item is defined through {@link SelectionGroup_Item}.
|
|
|
|
*
|
|
|
|
* @example <code>
|
|
|
|
* $items = array(
|
|
|
|
* new SelectionGroup_Item(
|
|
|
|
* 'one',
|
|
|
|
* new LiteralField('one', 'one view'),
|
|
|
|
* 'one title'
|
|
|
|
* ),
|
|
|
|
* new SelectionGroup_Item(
|
|
|
|
* 'two',
|
|
|
|
* new LiteralField('two', 'two view'),
|
|
|
|
* 'two title'
|
|
|
|
* ),
|
|
|
|
* );
|
|
|
|
* $field = new SelectionGroup('MyGroup', $items);
|
|
|
|
* </code>
|
2016-09-15 04:48:38 +02:00
|
|
|
*
|
|
|
|
* Caution: The form field does not include any JavaScript or CSS when used outside of the CMS context,
|
|
|
|
* since the required frontend dependencies are included through CMS bundling.
|
2007-07-19 12:40:28 +02:00
|
|
|
*/
|
|
|
|
class SelectionGroup extends CompositeField {
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2007-07-19 12:40:28 +02:00
|
|
|
/**
|
|
|
|
* Create a new selection group.
|
2014-08-15 08:53:05 +02:00
|
|
|
*
|
2013-12-21 02:55:17 +01:00
|
|
|
* @param string $name The field name of the selection group.
|
|
|
|
* @param array $items The list of {@link SelectionGroup_Item}
|
|
|
|
* @param mixed $value
|
2007-07-19 12:40:28 +02:00
|
|
|
*/
|
2013-12-21 02:55:17 +01:00
|
|
|
public function __construct($name, $items, $value = null) {
|
|
|
|
if($value !== null) {
|
|
|
|
$this->setValue($value);
|
|
|
|
}
|
|
|
|
|
2012-11-30 15:06:49 +01:00
|
|
|
$selectionItems = array();
|
2013-12-21 02:55:17 +01:00
|
|
|
|
2012-11-30 15:06:49 +01:00
|
|
|
foreach($items as $key => $item) {
|
|
|
|
if($item instanceof SelectionGroup_Item) {
|
|
|
|
$selectionItems[] = $item;
|
|
|
|
} else {
|
|
|
|
// Convert legacy format
|
|
|
|
if(strpos($key,'//') !== false) {
|
|
|
|
list($key,$title) = explode('//', $key,2);
|
|
|
|
} else {
|
|
|
|
$title = null;
|
2014-08-15 08:53:05 +02:00
|
|
|
}
|
2012-11-30 15:06:49 +01:00
|
|
|
$selectionItems[] = new SelectionGroup_Item($key, $item, $title);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
parent::__construct($selectionItems);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-07-06 06:34:09 +02:00
|
|
|
$this->setName($name);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
2011-12-22 12:38:51 +01:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function FieldSet() {
|
2011-12-22 12:38:51 +01:00
|
|
|
return $this->FieldList();
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function FieldList() {
|
2011-12-22 12:38:51 +01:00
|
|
|
$items = parent::FieldList()->toArray();
|
2007-07-19 12:40:28 +02:00
|
|
|
$count = 0;
|
2012-08-10 08:53:33 +02:00
|
|
|
$newItems = array();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
/** @var SelectionGroup_Item $item */
|
2012-11-30 15:06:49 +01:00
|
|
|
foreach($items as $item) {
|
|
|
|
if($this->value == $item->getValue()) {
|
2016-07-25 07:24:26 +02:00
|
|
|
$firstSelected = true;
|
2012-11-30 15:06:49 +01:00
|
|
|
$checked = true;
|
|
|
|
} else {
|
2016-07-25 07:24:26 +02:00
|
|
|
$firstSelected = false;
|
2012-11-30 15:06:49 +01:00
|
|
|
$checked = false;
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2007-07-19 12:40:28 +02:00
|
|
|
$itemID = $this->ID() . '_' . (++$count);
|
2016-07-26 02:29:55 +02:00
|
|
|
// @todo Move into SelectionGroup_Item.ss template at some point.
|
2007-07-19 12:40:28 +02:00
|
|
|
$extra = array(
|
2016-06-03 10:51:02 +02:00
|
|
|
"RadioButton" => DBField::create_field('HTMLFragment', FormField::create_tag(
|
2014-08-15 08:53:05 +02:00
|
|
|
'input',
|
2012-11-30 15:06:49 +01:00
|
|
|
array(
|
|
|
|
'class' => 'selector',
|
|
|
|
'type' => 'radio',
|
|
|
|
'id' => $itemID,
|
|
|
|
'name' => $this->name,
|
|
|
|
'value' => $item->getValue(),
|
2016-07-26 02:29:55 +02:00
|
|
|
'checked' => $checked,
|
|
|
|
'aria-labelledby' => "title-{$itemID}",
|
2012-11-30 15:06:49 +01:00
|
|
|
)
|
2016-06-03 10:51:02 +02:00
|
|
|
)),
|
|
|
|
"RadioLabel" => DBField::create_field('HTMLFragment', FormField::create_tag(
|
2014-08-15 08:53:05 +02:00
|
|
|
'label',
|
2016-07-26 02:29:55 +02:00
|
|
|
array(
|
|
|
|
'id' => "title-{$itemID}",
|
|
|
|
'for' => $itemID
|
|
|
|
),
|
2012-11-30 15:06:49 +01:00
|
|
|
$item->getTitle()
|
2016-06-03 10:51:02 +02:00
|
|
|
)),
|
2007-07-19 12:40:28 +02:00
|
|
|
"Selected" => $firstSelected,
|
|
|
|
);
|
2012-11-30 15:06:49 +01:00
|
|
|
$newItems[] = $item->customise($extra);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2011-05-05 12:40:24 +02:00
|
|
|
return new ArrayList($newItems);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function hasData() {
|
2007-07-19 12:40:28 +02:00
|
|
|
return true;
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function FieldHolder($properties = array()) {
|
2016-07-26 02:29:55 +02:00
|
|
|
return parent::FieldHolder($properties);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
|
|
|
}
|