Skip to content

Commit

Permalink
feature #27580 [Form] Add ability to clear form errors (colinodell)
Browse files Browse the repository at this point in the history
This PR was squashed before being merged into the 4.2-dev branch (closes #27580).

Discussion
----------

[Form] Add ability to clear form errors

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #14060
| License       | MIT
| Doc PR        | symfony/symfony-docs#9916

This PR adds the ability to manually clear form errors, thus improving the DX issue reported in #14060.

Unlike my original approach in #14233 and #27571 which break BC, this adds a new `ClearableErrorInterface` which `Form` implements.  (`Button` does not implement it because buttons can't have errors.)

Commits
-------

9eb755c [Form] Add ability to clear form errors
  • Loading branch information
fabpot committed Jun 25, 2018
2 parents 86361e5 + 9eb755c commit 53a39b7
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 1 deletion.
27 changes: 27 additions & 0 deletions src/Symfony/Component/Form/ClearableErrorsInterface.php
@@ -0,0 +1,27 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form;

/**
* A form element whose errors can be cleared.
*
* @author Colin O'Dell <colinodell@gmail.com>
*/
interface ClearableErrorsInterface
{
/**
* Removes all the errors of this form.
*
* @param bool $deep Whether to remove errors from child forms as well
*/
public function clearErrors(bool $deep = false);
}
23 changes: 22 additions & 1 deletion src/Symfony/Component/Form/Form.php
Expand Up @@ -58,7 +58,7 @@
* @author Fabien Potencier <fabien@symfony.com>
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class Form implements \IteratorAggregate, FormInterface
class Form implements \IteratorAggregate, FormInterface, ClearableErrorsInterface
{
/**
* The form's configuration.
Expand Down Expand Up @@ -795,6 +795,27 @@ public function getErrors($deep = false, $flatten = true)
return new FormErrorIterator($this, $errors);
}

/**
* {@inheritdoc}
*
* @return $this
*/
public function clearErrors(bool $deep = false): self
{
$this->errors = array();

if ($deep) {
// Clear errors from children
foreach ($this as $child) {
if ($child instanceof ClearableErrorsInterface) {
$child->clearErrors(true);
}
}
}

return $this;
}

/**
* {@inheritdoc}
*/
Expand Down
42 changes: 42 additions & 0 deletions src/Symfony/Component/Form/Tests/CompoundFormTest.php
Expand Up @@ -879,6 +879,48 @@ public function testGetErrorsDeepRecursive()
$this->assertSame($nestedError, $nestedErrorsAsArray[0]);
}

public function testClearErrors()
{
$this->form->addError(new FormError('Error 1'));
$this->form->addError(new FormError('Error 2'));

$this->assertCount(2, $this->form->getErrors());

$this->form->clearErrors();

$this->assertCount(0, $this->form->getErrors());
}

public function testClearErrorsShallow()
{
$this->form->addError($error1 = new FormError('Error 1'));
$this->form->addError($error2 = new FormError('Error 2'));

$childForm = $this->getBuilder('Child')->getForm();
$childForm->addError(new FormError('Nested Error'));
$this->form->add($childForm);

$this->form->clearErrors(false);

$this->assertCount(0, $this->form->getErrors(false));
$this->assertCount(1, $this->form->getErrors(true));
}

public function testClearErrorsDeep()
{
$this->form->addError($error1 = new FormError('Error 1'));
$this->form->addError($error2 = new FormError('Error 2'));

$childForm = $this->getBuilder('Child')->getForm();
$childForm->addError($nestedError = new FormError('Nested Error'));
$this->form->add($childForm);

$this->form->clearErrors(true);

$this->assertCount(0, $this->form->getErrors(false));
$this->assertCount(0, $this->form->getErrors(true));
}

// Basic cases are covered in SimpleFormTest
public function testCreateViewWithChildren()
{
Expand Down

0 comments on commit 53a39b7

Please sign in to comment.