Skip to content

Commit f4d1c75

Browse files
committed
[Form] Add "is empty callback" to form config
1 parent dab6732 commit f4d1c75

16 files changed

+152
-1
lines changed

UPGRADE-5.1.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
UPGRADE FROM 5.0 to 5.1
2+
=======================
3+
4+
Form
5+
----
6+
7+
* Implementing the `FormConfigInterface` without implementing the `getIsEmptyCallback()` method
8+
is deprecated. The method will be added to the interface in 6.0.
9+
* Implementing the `FormConfigBuilderInterface` without implementing the `setIsEmptyCallback()` method
10+
is deprecated. The method will be added to the interface in 6.0.

UPGRADE-6.0.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
UPGRADE FROM 5.x to 6.0
2+
=======================
3+
4+
Form
5+
----
6+
7+
* Added the `getIsEmptyCallback()` method to the `FormConfigInterface`.
8+
* Added the `setIsEmptyCallback()` method to the `FormConfigBuilderInterface`.

src/Symfony/Component/Form/ButtonBuilder.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,16 @@ public function getFormConfig()
466466
return $config;
467467
}
468468

469+
/**
470+
* Unsupported method.
471+
*
472+
* @throws BadMethodCallException
473+
*/
474+
public function setIsEmptyCallback(?callable $isEmptyCallback)
475+
{
476+
throw new BadMethodCallException('Buttons do not support "is empty" callback.');
477+
}
478+
469479
/**
470480
* Unsupported method.
471481
*/
@@ -738,6 +748,16 @@ public function getOption(string $name, $default = null)
738748
return \array_key_exists($name, $this->options) ? $this->options[$name] : $default;
739749
}
740750

751+
/**
752+
* Unsupported method.
753+
*
754+
* @throws BadMethodCallException
755+
*/
756+
public function getIsEmptyCallback(): ?callable
757+
{
758+
throw new BadMethodCallException('Buttons do not support "is empty" callback.');
759+
}
760+
741761
/**
742762
* Unsupported method.
743763
*

src/Symfony/Component/Form/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
CHANGELOG
22
=========
33

4+
5.1.0
5+
-----
6+
7+
* Implementing the `FormConfigInterface` without implementing the `getIsEmptyCallback()` method
8+
is deprecated. The method will be added to the interface in 6.0.
9+
* Implementing the `FormConfigBuilderInterface` without implementing the `setIsEmptyCallback()` method
10+
is deprecated. The method will be added to the interface in 6.0.
11+
412
5.0.0
513
-----
614

src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ public function configureOptions(OptionsResolver $resolver)
6060
'empty_data' => $emptyData,
6161
'compound' => false,
6262
'false_values' => [null],
63+
'is_empty_callback' => static function ($modelData): bool {
64+
return false === $modelData;
65+
},
6366
]);
6467

6568
$resolver->setAllowedTypes('false_values', 'array');

src/Symfony/Component/Form/Extension/Core/Type/FormType.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;
1616
use Symfony\Component\Form\Extension\Core\EventListener\TrimListener;
1717
use Symfony\Component\Form\FormBuilderInterface;
18+
use Symfony\Component\Form\FormConfigBuilder;
19+
use Symfony\Component\Form\FormConfigBuilderInterface;
1820
use Symfony\Component\Form\FormInterface;
1921
use Symfony\Component\Form\FormView;
2022
use Symfony\Component\OptionsResolver\Options;
@@ -58,6 +60,14 @@ public function buildForm(FormBuilderInterface $builder, array $options)
5860
if ($options['trim']) {
5961
$builder->addEventSubscriber(new TrimListener());
6062
}
63+
64+
if (!method_exists($builder, 'setIsEmptyCallback')) {
65+
@trigger_error(sprintf('Not implementing the "%s::setIsEmptyCallback()" method in "%s" is deprecated since Symfony 5.1.', FormConfigBuilderInterface::class, \get_class($builder)), E_USER_DEPRECATED);
66+
67+
return;
68+
}
69+
70+
$builder->setIsEmptyCallback($options['is_empty_callback']);
6171
}
6272

6373
/**
@@ -190,13 +200,15 @@ public function configureOptions(OptionsResolver $resolver)
190200
'help_attr' => [],
191201
'help_html' => false,
192202
'help_translation_parameters' => [],
203+
'is_empty_callback' => null,
193204
]);
194205

195206
$resolver->setAllowedTypes('label_attr', 'array');
196207
$resolver->setAllowedTypes('upload_max_size_message', ['callable']);
197208
$resolver->setAllowedTypes('help', ['string', 'null']);
198209
$resolver->setAllowedTypes('help_attr', 'array');
199210
$resolver->setAllowedTypes('help_html', 'bool');
211+
$resolver->setAllowedTypes('is_empty_callback', ['null', 'callable']);
200212
}
201213

202214
/**

src/Symfony/Component/Form/Form.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,15 @@ public function isEmpty()
726726
}
727727
}
728728

729-
return FormUtil::isEmpty($this->modelData) ||
729+
if (!method_exists($this->config, 'getIsEmptyCallback')) {
730+
@trigger_error(sprintf('Not implementing the "%s::getIsEmptyCallback()" method in "%s" is deprecated since Symfony 5.1.', FormConfigInterface::class, \get_class($this->config)), E_USER_DEPRECATED);
731+
732+
$isEmptyCallback = null;
733+
} else {
734+
$isEmptyCallback = $this->config->getIsEmptyCallback();
735+
}
736+
737+
return $isEmptyCallback ? $isEmptyCallback($this->modelData) : FormUtil::isEmpty($this->modelData) ||
730738
// arrays, countables
731739
((\is_array($this->modelData) || $this->modelData instanceof \Countable) && 0 === \count($this->modelData)) ||
732740
// traversables that are not countable

src/Symfony/Component/Form/FormConfigBuilder.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\EventDispatcher\ImmutableEventDispatcher;
1717
use Symfony\Component\Form\Exception\BadMethodCallException;
1818
use Symfony\Component\Form\Exception\InvalidArgumentException;
19+
use Symfony\Component\Form\Util\FormUtil;
1920
use Symfony\Component\PropertyAccess\PropertyPath;
2021
use Symfony\Component\PropertyAccess\PropertyPathInterface;
2122

@@ -103,6 +104,8 @@ class FormConfigBuilder implements FormConfigBuilderInterface
103104
private $autoInitialize = false;
104105
private $options;
105106

107+
private $isEmptyCallback;
108+
106109
/**
107110
* Creates an empty form configuration.
108111
*
@@ -461,6 +464,11 @@ public function getOption(string $name, $default = null)
461464
return \array_key_exists($name, $this->options) ? $this->options[$name] : $default;
462465
}
463466

467+
public function getIsEmptyCallback(): ?callable
468+
{
469+
return $this->isEmptyCallback;
470+
}
471+
464472
/**
465473
* {@inheritdoc}
466474
*/
@@ -761,6 +769,16 @@ public function getFormConfig()
761769
return $config;
762770
}
763771

772+
/**
773+
* {@inheritdoc}
774+
*/
775+
public function setIsEmptyCallback(?callable $isEmptyCallback)
776+
{
777+
$this->isEmptyCallback = $isEmptyCallback;
778+
779+
return $this;
780+
}
781+
764782
/**
765783
* Validates whether the given variable is a valid form name.
766784
*

src/Symfony/Component/Form/FormConfigBuilderInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
/**
1818
* @author Bernhard Schussek <bschussek@gmail.com>
19+
*
20+
* @method $this setIsEmptyCallback(callable|null $isEmptyCallback) Sets the callback that will be called to determine if the model data of the form is empty or not - not implementing it is deprecated since Symfony 5.1
1921
*/
2022
interface FormConfigBuilderInterface extends FormConfigInterface
2123
{

src/Symfony/Component/Form/FormConfigInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* The configuration of a {@link Form} object.
1919
*
2020
* @author Bernhard Schussek <bschussek@gmail.com>
21+
*
22+
* @method callable|null getIsEmptyCallback() Returns a callable that takes the model data as argument and that returns if it is empty or not - not implementing it is deprecated since Symfony 5.1
2123
*/
2224
interface FormConfigInterface
2325
{

0 commit comments

Comments
 (0)