diff --git a/src/View/Input/Radio.php b/src/View/Input/Radio.php index 6115d35416e..b9fe72e9f15 100644 --- a/src/View/Input/Radio.php +++ b/src/View/Input/Radio.php @@ -36,6 +36,16 @@ class Radio { /** * Constructor * + * This class uses a few templates: + * + * - `radio` Used to generate the input for a radio button. + * Can use the following variables `name`, `value`, `attrs`. + * - `label` Used to generate the label for a radio button. + * Can use the following variables `attrs`, `text` and `input`. + * - `radioContainer` Used to generate the container element for + * the radio + input element. Can use the `input` and `label` + * variables. + * * @param Cake\View\StringTemplate $templates */ public function __construct($templates) { @@ -135,14 +145,19 @@ protected function _renderInput($val, $text, $data) { $radio['disabled'] = true; } - $label = $this->_renderLabel($radio, $data['label'], $escape); - $input = $this->_templates->format('radio', [ 'name' => $radio['name'], 'value' => $escape ? h($radio['value']) : $radio['value'], 'attrs' => $this->_templates->formatAttributes($radio, ['name', 'value', 'text']), ]); + $label = $this->_renderLabel( + $radio, + $data['label'], + $input, + $escape + ); + return $this->_templates->format('radioContainer', [ 'input' => $input, 'label' => $label, @@ -157,10 +172,11 @@ protected function _renderInput($val, $text, $data) { * * @param array $radio The input properties. * @param false|string|array $label The properties for a label. + * @param string $input The input widget. * @param boolean $escape Whether or not to HTML escape the label. * @return string Generated label. */ - protected function _renderLabel($radio, $label, $escape) { + protected function _renderLabel($radio, $label, $input, $escape) { if (!$label) { return false; } @@ -169,6 +185,7 @@ protected function _renderLabel($radio, $label, $escape) { return $this->_templates->format('label', [ 'text' => $escape ? h($radio['text']) : $radio['text'], + 'input' => $input, 'attrs' => $this->_templates->formatAttributes($labelAttrs), ]); } diff --git a/tests/TestCase/View/Input/RadioTest.php b/tests/TestCase/View/Input/RadioTest.php index e68ae73f148..b993f3be7da 100644 --- a/tests/TestCase/View/Input/RadioTest.php +++ b/tests/TestCase/View/Input/RadioTest.php @@ -176,6 +176,36 @@ public function testRenderEmptyOption() { $this->assertTags($result, $expected); } +/** + * Test rendering the input inside the label. + * + * @return void + */ + public function testRenderInputInsideLabel() { + $this->templates->add([ + 'label' => '{{input}}{{text}}', + 'radioContainer' => '{{label}}', + ]); + $radio = new Radio($this->templates); + $data = [ + 'name' => 'Crayons[color]', + 'options' => ['r' => 'Red'], + ]; + $result = $radio->render($data); + $expected = [ + ['label' => ['for' => 'Crayons_color_r']], + ['input' => [ + 'type' => 'radio', + 'name' => 'Crayons[color]', + 'value' => 'r', + 'id' => 'Crayons_color_r' + ]], + 'Red', + '/label', + ]; + $this->assertTags($result, $expected); + } + /** * test render() and selected inputs. *