Index: library/Zend/Form/Element/Multi.php =================================================================== --- library/Zend/Form/Element/Multi.php (revision 12418) +++ library/Zend/Form/Element/Multi.php (working copy) @@ -245,11 +245,23 @@ { if ($this->registerInArrayValidator()) { if (!$this->getValidator('InArray')) { - $options = $this->getMultiOptions(); + $multiOptions = $this->getMultiOptions(); + $options = array(); + + foreach ($multiOptions as $opt_value => $opt_label) { + // optgroup instead of option label + if (is_array($opt_label)) { + $options = array_merge($options, array_keys($opt_label)); + } + else { + $options[] = $opt_value; + } + } + $this->addValidator( 'InArray', true, - array(array_keys($options)) + array($options) ); } } Index: tests/Zend/Form/Element/SelectTest.php =================================================================== --- tests/Zend/Form/Element/SelectTest.php (revision 12418) +++ tests/Zend/Form/Element/SelectTest.php (working copy) @@ -169,6 +169,49 @@ $this->assertNotContains('unused', $html, $html); $this->assertContains('bar', $html, $html); } + + /** + * Test isValid() on select elements without optgroups. This + * ensures fixing ZF-3985 doesn't break existing functionality. + * + * @see ZF-3985 + */ + public function testIsValidWithPlainOptions() + { + // test both syntaxes for setting plain options + $this->element->setMultiOptions(array( + array('key' => '1', 'value' => 'Web Developer'), + '2' => 'Software Engineer', + )); + + $this->assertTrue($this->element->isValid('1')); + $this->assertTrue($this->element->isValid('2')); + $this->assertFalse($this->element->isValid('3')); + $this->assertFalse($this->element->isValid('Web Developer')); + } + + /** + * @group ZF-3985 + */ + public function testIsValidWithOptionGroups() + { + // test optgroup and both syntaxes for setting plain options + $this->element->setMultiOptions(array( + 'Technology' => array( + '1' => 'Web Developer', + '2' => 'Software Engineer', + ), + array('key' => '3', 'value' => 'Trainee'), + '4' => 'Intern', + )); + + $this->assertTrue($this->element->isValid('1')); + $this->assertTrue($this->element->isValid('3')); + $this->assertTrue($this->element->isValid('4')); + $this->assertFalse($this->element->isValid('5')); + $this->assertFalse($this->element->isValid('Technology')); + $this->assertFalse($this->element->isValid('Web Developer')); + } /** * Used by test methods susceptible to ZF-2794, marks a test as incomplete