BC fixes for disabled checkboxes

see: d504642
see: #3545

Signed-off-by: Rachman Chavik <rchavik@xintesa.com>
This commit is contained in:
euromark 2013-01-30 13:54:09 +01:00 committed by Rachman Chavik
parent 1cb24384cd
commit ee08fe5c1f
2 changed files with 76 additions and 5 deletions

View file

@ -2445,6 +2445,33 @@ class FormHelperTest extends CakeTestCase {
); );
$result = $this->Form->input('Contact.multiple', array('multiple' => 'checkbox', 'disabled' => $disabled, 'options' => $options)); $result = $this->Form->input('Contact.multiple', array('multiple' => 'checkbox', 'disabled' => $disabled, 'options' => $options));
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
// make sure 50 does only disable 50, and not 50f5c0cf
$options = array('50' => 'Fifty', '50f5c0cf' => 'Stringy');
$disabled = array(50);
$expected = array(
array('div' => array('class' => 'input select')),
array('label' => array('for' => "ContactMultiple")),
'Multiple',
'/label',
array('input' => array('type' => 'hidden', 'name' => "data[Contact][multiple]", 'value' => '', 'id' => "ContactMultiple")),
array('div' => array('class' => 'checkbox')),
array('input' => array('type' => 'checkbox', 'name' => "data[Contact][multiple][]", 'value' => 50, 'disabled' => 'disabled', 'id' => "ContactMultiple50")),
array('label' => array('for' => "ContactMultiple50")),
'Fifty',
'/label',
'/div',
array('div' => array('class' => 'checkbox')),
array('input' => array('type' => 'checkbox', 'name' => "data[Contact][multiple][]", 'value' => '50f5c0cf', 'id' => "ContactMultiple50f5c0cf")),
array('label' => array('for' => "ContactMultiple50f5c0cf")),
'Stringy',
'/label',
'/div',
'/div'
);
$result = $this->Form->input('Contact.multiple', array('multiple' => 'checkbox', 'disabled' => $disabled, 'options' => $options));
$this->assertTags($result, $expected);
} }
/** /**
@ -4277,6 +4304,48 @@ class FormHelperTest extends CakeTestCase {
'/select' '/select'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
// make sure only 50 is selected, and not 50f5c0cf
$this->View->viewVars['contactTags'] = array(
'1' => 'blue',
'50f5c0cf' => 'red',
'50' => 'green'
);
$this->Form->request->data = array(
'Contact' => array(),
'ContactTag' => array(
array(
'id' => 1,
'name' => 'blue'
),
array(
'id' => 50,
'name' => 'green'
)
)
);
$this->Form->create('Contact');
$result = $this->Form->input('ContactTag', array('div' => false, 'label' => false));
$expected = array(
'input' => array(
'type' => 'hidden', 'name' => 'data[ContactTag][ContactTag]', 'value' => '', 'id' => 'ContactTagContactTag_'
),
'select' => array(
'name' => 'data[ContactTag][ContactTag][]', 'id' => 'ContactTagContactTag',
'multiple' => 'multiple'
),
array('option' => array('value' => '1', 'selected' => 'selected')),
'blue',
'/option',
array('option' => array('value' => '50f5c0cf')),
'red',
'/option',
array('option' => array('value' => '50', 'selected' => 'selected')),
'green',
'/option',
'/select'
);
$this->assertTags($result, $expected);
} }
/** /**

View file

@ -2631,19 +2631,21 @@ class FormHelper extends AppHelper {
if ($attributes['style'] === 'checkbox') { if ($attributes['style'] === 'checkbox') {
$htmlOptions['value'] = $name; $htmlOptions['value'] = $name;
$disabledType = null;
$hasDisabled = !empty($attributes['disabled']); $hasDisabled = !empty($attributes['disabled']);
if ($hasDisabled) { if ($hasDisabled) {
$disabledType = gettype($attributes['disabled']); $disabledIsArray = is_array($attributes['disabled']);
if ($disabledIsArray) {
$disabledIsNumeric = is_numeric($htmlOptions['value']);
}
} }
if ( if (
$hasDisabled && $hasDisabled &&
$disabledType === 'array' && $disabledIsArray &&
in_array($htmlOptions['value'], $attributes['disabled']) in_array($htmlOptions['value'], $attributes['disabled'], !$disabledIsNumeric)
) { ) {
$htmlOptions['disabled'] = 'disabled'; $htmlOptions['disabled'] = 'disabled';
} }
if ($hasDisabled && $disabledType !== 'array') { if ($hasDisabled && !$disabledIsArray) {
$htmlOptions['disabled'] = $attributes['disabled'] === true ? 'disabled' : $attributes['disabled']; $htmlOptions['disabled'] = $attributes['disabled'] === true ? 'disabled' : $attributes['disabled'];
} }