[Form] Remove support for ArrayObject as ChoiceField's choices option

Internally, ChoiceField expects both choices and preferred_choices to be a simple array, so I replaced incomplete bits of code that attempted to not modify a possible ArrayObject and instead added type checks in the configure() method (with unit tests for expected exceptions).
This commit is contained in:
Jeremy Mikola 2010-09-10 11:46:56 -04:00 committed by Fabien Potencier
parent 226277fd0e
commit 57c0ce0ec1
2 changed files with 28 additions and 14 deletions

View File

@ -2,6 +2,8 @@
namespace Symfony\Component\Form; namespace Symfony\Component\Form;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
/** /**
* Lets the user select between different choices * Lets the user select between different choices
* *
@ -28,12 +30,16 @@ class ChoiceField extends HybridField
$this->addOption('empty_value', ''); $this->addOption('empty_value', '');
$this->addOption('translate_choices', false); $this->addOption('translate_choices', false);
if (!is_array($this->getOption('choices'))) {
throw new UnexpectedTypeException('The choices option must be an array');
}
if (!is_array($this->getOption('preferred_choices'))) {
throw new UnexpectedTypeException('The preferred_choices option must be an array');
}
if (count($this->getOption('preferred_choices')) > 0) { if (count($this->getOption('preferred_choices')) > 0) {
$this->preferredChoices = array_flip($this->getOption('preferred_choices')); $this->preferredChoices = array_flip($this->getOption('preferred_choices'));
if (false && $diff = array_diff_key($this->options, $this->knownOptions)) {
//throw new InvalidOptionsException(sprintf('%s does not support the following options: "%s".', get_class($this), implode('", "', array_keys($diff))), array_keys($diff));
}
} }
if ($this->getOption('expanded')) { if ($this->getOption('expanded')) {
@ -41,11 +47,11 @@ class ChoiceField extends HybridField
$choices = $this->getOption('choices'); $choices = $this->getOption('choices');
foreach ($this->getOption('preferred_choices') as $choice) { foreach ($this->preferredChoices as $choice => $_) {
$this->add($this->newChoiceField($choice, $choices[$choice])); $this->add($this->newChoiceField($choice, $choices[$choice]));
} }
foreach ($this->getOption('choices') as $choice => $value) { foreach ($choices as $choice => $value) {
if (!isset($this->preferredChoices[$choice])) { if (!isset($this->preferredChoices[$choice])) {
$this->add($this->newChoiceField($choice, $value)); $this->add($this->newChoiceField($choice, $value));
} }

View File

@ -3,6 +3,7 @@
namespace Symfony\Tests\Component\Form; namespace Symfony\Tests\Component\Form;
use Symfony\Component\Form\ChoiceField; use Symfony\Component\Form\ChoiceField;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
class ChoiceFieldTest extends \PHPUnit_Framework_TestCase class ChoiceFieldTest extends \PHPUnit_Framework_TestCase
{ {
@ -36,18 +37,25 @@ class ChoiceFieldTest extends \PHPUnit_Framework_TestCase
4 => 'Roman', 4 => 'Roman',
); );
public function testConfigureChoicesWithArrayObject() /**
* @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
*/
public function testConfigureChoicesWithNonArray()
{ {
$choices = new \ArrayObject($this->choices);
$field = new ChoiceField('name', array( $field = new ChoiceField('name', array(
'multiple' => false, 'choices' => new \ArrayObject(),
'expanded' => true,
'choices' => $choices,
'preferred_choices' => $this->preferredChoices,
)); ));
}
$this->assertEquals($this->choices, $choices->getArrayCopy()); /**
* @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
*/
public function testConfigurePreferredChoicesWithNonArray()
{
$field = new ChoiceField('name', array(
'choices' => $this->choices,
'preferred_choices' => new \ArrayObject(),
));
} }
public function testBindSingleNonExpanded() public function testBindSingleNonExpanded()