Skip to content

Commit

Permalink
Fix radio() and boolean values.
Browse files Browse the repository at this point in the history
Boolean values should be cast to integer equivalents, which allows
for correct handling of boolean columns and their string equivalents
used in form options.

Fixes #3512
  • Loading branch information
markstory committed Jan 8, 2013
1 parent e132a7c commit 3f21d09
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
30 changes: 29 additions & 1 deletion lib/Cake/Test/Case/View/Helper/FormHelperTest.php
Expand Up @@ -3407,10 +3407,11 @@ public function testRadio() {

/**
* Test that radios with a 0 value are selected under the correct conditions.
* Also ensure that values that are booleanish are handled correctly.
*
* @return void
*/
public function testRadioOptionWithZeroValue() {
public function testRadioOptionWithBooleanishValues() {
$expected = array(
'fieldset' => array(),
'legend' => array(),
Expand All @@ -3432,6 +3433,9 @@ public function testRadioOptionWithZeroValue() {
$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'), array('value' => 0));
$this->assertTags($result, $expected);

$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'), array('value' => false));
$this->assertTags($result, $expected);

$expected = array(
'fieldset' => array(),
'legend' => array(),
Expand All @@ -3456,6 +3460,30 @@ public function testRadioOptionWithZeroValue() {

$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'));
$this->assertTags($result, $expected);

$expected = array(
'fieldset' => array(),
'legend' => array(),
'Field',
'/legend',
array('input' => array('type' => 'radio', 'name' => 'data[Model][field]', 'checked' => 'checked', 'value' => '1', 'id' => 'ModelField1')),
array('label' => array('for' => 'ModelField1')),
'Yes',
'/label',
array('input' => array('type' => 'radio', 'name' => 'data[Model][field]', 'value' => '0', 'id' => 'ModelField0')),
array('label' => array('for' => 'ModelField0')),
'No',
'/label',
'/fieldset'
);
$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'), array('value' => 1));
$this->assertTags($result, $expected);

$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'), array('value' => '1'));
$this->assertTags($result, $expected);

$result = $this->Form->radio('Model.field', array('1' => 'Yes', '0' => 'No'), array('value' => true));
$this->assertTags($result, $expected);
}

/**
Expand Down
4 changes: 4 additions & 0 deletions lib/Cake/View/Helper/FormHelper.php
Expand Up @@ -1385,6 +1385,10 @@ public function radio($fieldName, $options = array(), $attributes = array()) {
$hiddenField = isset($attributes['hiddenField']) ? $attributes['hiddenField'] : true;
unset($attributes['hiddenField']);

if (isset($value) && is_bool($value)) {
$value = $value ? 1 : 0;
}

foreach ($options as $optValue => $optTitle) {
$optionsHere = array('value' => $optValue);

Expand Down

0 comments on commit 3f21d09

Please sign in to comment.