diff --git a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php index 2e192cb190..de49220299 100644 --- a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php +++ b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php @@ -34,6 +34,10 @@ class ChoiceFormField extends FormField * @var array */ private $options; + /** + * @var boolean + */ + private $validationDisabled = false; /** * Returns true if the field should be included in the submitted values. @@ -280,6 +284,10 @@ class ChoiceFormField extends FormField */ public function containsOption($optionValue, $options) { + if ($this->validationDisabled) { + return true; + } + foreach ($options as $option) { if ($option['value'] == $optionValue) { return true; @@ -304,4 +312,16 @@ class ChoiceFormField extends FormField return $values; } + + /** + * Disables the internal validation of the field. + * + * @return self + */ + public function disableValidation() + { + $this->validationDisabled = true; + + return $this; + } } diff --git a/src/Symfony/Component/DomCrawler/Form.php b/src/Symfony/Component/DomCrawler/Form.php index 7f44a5be5e..445f709c1c 100644 --- a/src/Symfony/Component/DomCrawler/Form.php +++ b/src/Symfony/Component/DomCrawler/Form.php @@ -330,6 +330,22 @@ class Form extends Link implements \ArrayAccess $this->fields->remove($name); } + /** + * Disables validation + * + * @return self + */ + public function disableValidation() + { + foreach ($this->fields->all() as $field) { + if ($field instanceof Field\ChoiceFormField) { + $field->disableValidation(); + } + } + + return $this; + } + /** * Sets the node for the form. * diff --git a/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php b/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php index cf7cd5a2f2..d2a95a53e8 100644 --- a/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php @@ -284,6 +284,21 @@ class ChoiceFormFieldTest extends FormFieldTestCase $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option'); } + public function testDisableValidation() + { + $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); + $field = new ChoiceFormField($node); + $field->disableValidation(); + $field->setValue('foobar'); + $this->assertEquals('foobar', $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.'); + + $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple')); + $field = new ChoiceFormField($node); + $field->disableValidation(); + $field->setValue(array('foobar')); + $this->assertEquals(array('foobar'), $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.'); + } + protected function createSelectNode($options, $attributes = array()) { $document = new \DOMDocument(); diff --git a/src/Symfony/Component/DomCrawler/Tests/FormTest.php b/src/Symfony/Component/DomCrawler/Tests/FormTest.php index 587717841c..6c8a4f2c93 100644 --- a/src/Symfony/Component/DomCrawler/Tests/FormTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/FormTest.php @@ -328,6 +328,26 @@ class FormTest extends \PHPUnit_Framework_TestCase } } + public function testDisableValidation() + { + $form = $this->createForm('
+ + + +
'); + + $form->disableValidation(); + + $form['foo[bar]']->select('foo'); + $form['foo[baz]']->select('bar'); + $this->assertEquals('foo', $form['foo[bar]']->getValue(), '->disableValidation() disables validation of all ChoiceFormField.'); + $this->assertEquals('bar', $form['foo[baz]']->getValue(), '->disableValidation() disables validation of all ChoiceFormField.'); + } + public function testOffsetUnset() { $form = $this->createForm('
');