-
Notifications
You must be signed in to change notification settings - Fork 821
/
SelectionGroup.php
125 lines (110 loc) · 3.53 KB
/
SelectionGroup.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
namespace SilverStripe\Forms;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
/**
* 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
* button is selected. Each item is defined through {@link SelectionGroup_Item}.
*
* @example <code>
* $items = [
* 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>
*
* 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.
*/
class SelectionGroup extends CompositeField
{
/**
* Create a new selection group.
*
* @param string $name The field name of the selection group.
* @param array $items The list of {@link SelectionGroup_Item}
* @param mixed $value
*/
public function __construct($name, $items, $value = null)
{
if ($value !== null) {
$this->setValue($value);
}
$selectionItems = [];
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;
}
$selectionItems[] = new SelectionGroup_Item($key, $item, $title);
}
}
parent::__construct($selectionItems);
$this->setName($name);
}
public function FieldSet()
{
return $this->FieldList();
}
public function FieldList()
{
$items = parent::FieldList()->toArray();
$count = 0;
$newItems = [];
/** @var SelectionGroup_Item $item */
foreach ($items as $item) {
if ($this->value == $item->getValue()) {
$firstSelected = true;
$checked = true;
} else {
$firstSelected = false;
$checked = false;
}
$itemID = $this->ID() . '_' . (++$count);
// @todo Move into SelectionGroup_Item.ss template at some point.
$extra = [
"RadioButton" => DBField::create_field('HTMLFragment', HTML::createTag(
'input',
[
'class' => 'selector',
'type' => 'radio',
'id' => $itemID,
'name' => $this->name,
'value' => $item->getValue(),
'checked' => $checked,
'disabled' => $item->isDisabled()
]
)),
"RadioLabel" => $item->getTitle(),
"Selected" => $firstSelected,
];
$newItems[] = $item->customise($extra);
}
return new ArrayList($newItems);
}
public function hasData()
{
return true;
}
public function FieldHolder($properties = [])
{
return parent::FieldHolder($properties);
}
}