diff --git a/library/Zend/Form/Element/Select.php b/library/Zend/Form/Element/Select.php index 3700874f14c..395b4be0eea 100644 --- a/library/Zend/Form/Element/Select.php +++ b/library/Zend/Form/Element/Select.php @@ -175,9 +175,19 @@ protected function getValueOptionsValues() $values = array(); $options = $this->getValueOptions(); foreach ($options as $key => $optionSpec) { - $value = (is_array($optionSpec)) ? $optionSpec['value'] : $key; - $values[] = $value; + if(is_array($optionSpec) && array_key_exists('options', $optionSpec)){ + foreach ($optionSpec['options'] as $nestedKey => $nestedOptionSpec) { + $values[] = $this->getOptionValue($nestedKey, $nestedOptionSpec); + } + }else{ + $values[] = $this->getOptionValue($key, $optionSpec); + } } return $values; } + + private function getOptionValue($key, $optionSpec) + { + return is_array($optionSpec) ? $optionSpec['value'] : $key; + } } diff --git a/tests/ZendTest/Form/Element/SelectTest.php b/tests/ZendTest/Form/Element/SelectTest.php index ffb9ef09a96..373231df8d4 100644 --- a/tests/ZendTest/Form/Element/SelectTest.php +++ b/tests/ZendTest/Form/Element/SelectTest.php @@ -49,6 +49,41 @@ public function testProvidesInputSpecificationForSingleSelect() } } + public function testValidateWorksForNestedSelectElementWithSimpleNaming() + { + $element = new SelectElement(); + $element->setValueOptions(array( + array('label' => 'group 1', 'options' => array( + 'Option 1' => 'Label 1', + 'Option 2' => 'Label 2', + 'Option 3' => 'Label 2', + )))); + + $inputSpec = $element->getInputSpecification(); + $inArrayValidator = $inputSpec['validators'][0]; + + $this->assertTrue($inArrayValidator->isValid('Option 1')); + $this->assertFalse($inArrayValidator->isValid('Option 5')); + } + + public function testValidateWorksForNestedSelectElementWithExplicitNaming() + { + $element = new SelectElement(); + $element->setValueOptions(array( + array('label' => 'group 1', 'options' => array( + array('value' => 'Option 1', 'label'=> 'Label 1'), + array('value' => 'Option 2', 'label'=> 'Label 2'), + array('value' => 'Option 3', 'label'=> 'Label 3'), + )))); + + $inputSpec = $element->getInputSpecification(); + $inArrayValidator = $inputSpec['validators'][0]; + + $this->assertTrue($inArrayValidator->isValid('Option 1')); + $this->assertTrue($inArrayValidator->isValid('Option 2')); + $this->assertTrue($inArrayValidator->isValid('Option 3')); + $this->assertFalse($inArrayValidator->isValid('Option 5')); + } public function testProvidesInputSpecificationForMultipleSelect() { $element = new SelectElement(); @@ -137,4 +172,4 @@ public function testDeprecateOptionsInAttributes() )); $this->assertEquals($valueOptions, $element->getValueOptions()); } -} \ No newline at end of file +}