-
Notifications
You must be signed in to change notification settings - Fork 3.4k
/
Radio.php
106 lines (96 loc) · 2.9 KB
/
Radio.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
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since CakePHP(tm) v3.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\View\Input;
use Cake\View\StringTemplate;
use Cake\Utility\Inflector;
use Traversable;
/**
* Input widget class for generating a set of radio buttons.
*
* This class is intended as an internal implementation detail
* of Cake\View\Helper\FormHelper and is not intended for direct use.
*/
class Radio {
/**
* Template instance.
*
* @var Cake\View\StringTemplate
*/
protected $_templates;
/**
* Constructor
*
* @param Cake\View\StringTemplate $templates
*/
public function __construct($templates) {
$this->_templates = $templates;
}
/**
* Render a set of radio buttons.
*
* Data supports the following keys:
*
* - `name` - Set the input name.
* - `options` - An array of options. See below for more information.
* - `disabled` - Either true or an array of inputs to disable.
* When true, the select element will be disabled.
* - `value` - A string of the option to mark as selected.
* - `label` - Either false to disable label generation, or
* an array of attributes for all labels.
*
* @param array $data The data to build radio buttons with.
* @return string
*/
public function render($data) {
$data += [
'name' => '',
'options' => [],
'disabled' => null,
'value' => null,
'escape' => true,
'label' => true,
];
$opts = [];
$options = (array)$data['options'];
$escape = $data['escape'];
foreach ($options as $val => $text) {
if (is_int($val) && isset($text['text'], $text['value'])) {
$radio = $text;
$text = $radio['text'];
} else {
$radio = ['value' => $val, 'text' => $text];
}
$radio['name'] = $data['name'];
if (empty($radio['id'])) {
$radio['id'] = Inflector::slug($radio['name'] . '_' . $radio['value']);
}
$labelAttrs = ['for' => $radio['id'], 'escape' => $escape];
$label = $this->_templates->format('label', [
'text' => $escape ? h($radio['text']) : $radio['text'],
'attrs' => $this->_templates->formatAttributes($labelAttrs),
]);
$input = $this->_templates->format('radio', [
'name' => $radio['name'],
'value' => $escape ? h($radio['value']) : $radio['value'],
'attrs' => $this->_templates->formatAttributes($radio, ['name', 'value', 'text']),
]);
$opts[] = $this->_templates->format('radioContainer', [
'input' => $input,
'label' => $label,
]);
}
return implode('', $opts);
}
}