feature#8637 [DomCrawler] Allowed internal validation of ChoiceFormField to be disabled (pylebecq)

This PR was squashed before being merged into the master branch (closes #8637).

Discussion
----------

[DomCrawler] Allowed internal validation of ChoiceFormField to be disabled

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #7672
| License       | MIT
| Doc PR        | Not yet

Hi,

Here is a quite basic attempt to be able to disable the internal validation of the ChoiceFormField. It's pretty basic.
Feel free to tell me what you think guys. Maybe I should check the `validationDisabled` property at the beginning of the `containsOption()` method ?
I'll make the documentation PR as soon as the implementation will be validated.

Regards.

Commits
-------

739bf71 [DomCrawler] Allowed internal validation of ChoiceFormField to be disabled
This commit is contained in:
Fabien Potencier 2013-10-01 10:36:55 +02:00
commit 112fa5eeed
4 changed files with 71 additions and 0 deletions

View File

@ -34,6 +34,10 @@ class ChoiceFormField extends FormField
* @var array * @var array
*/ */
private $options; private $options;
/**
* @var boolean
*/
private $validationDisabled = false;
/** /**
* Returns true if the field should be included in the submitted values. * 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) public function containsOption($optionValue, $options)
{ {
if ($this->validationDisabled) {
return true;
}
foreach ($options as $option) { foreach ($options as $option) {
if ($option['value'] == $optionValue) { if ($option['value'] == $optionValue) {
return true; return true;
@ -304,4 +312,16 @@ class ChoiceFormField extends FormField
return $values; return $values;
} }
/**
* Disables the internal validation of the field.
*
* @return self
*/
public function disableValidation()
{
$this->validationDisabled = true;
return $this;
}
} }

View File

@ -330,6 +330,22 @@ class Form extends Link implements \ArrayAccess
$this->fields->remove($name); $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. * Sets the node for the form.
* *

View File

@ -284,6 +284,21 @@ class ChoiceFormFieldTest extends FormFieldTestCase
$this->assertEquals('foo', $field->getValue(), '->select() changes the selected option'); $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()) protected function createSelectNode($options, $attributes = array())
{ {
$document = new \DOMDocument(); $document = new \DOMDocument();

View File

@ -328,6 +328,26 @@ class FormTest extends \PHPUnit_Framework_TestCase
} }
} }
public function testDisableValidation()
{
$form = $this->createForm('<form>
<select name="foo[bar]">
<option value="bar">bar</option>
</select>
<select name="foo[baz]">
<option value="foo">foo</option>
</select>
<input type="submit" />
</form>');
$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() public function testOffsetUnset()
{ {
$form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>'); $form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');