diff --git a/src/Form/Control/Callbacks/DateValueCallback.php b/src/Form/Control/Callbacks/DateValueCallback.php new file mode 100644 index 0000000..3804ed9 --- /dev/null +++ b/src/Form/Control/Callbacks/DateValueCallback.php @@ -0,0 +1,51 @@ +. + */ + +declare(strict_types=1); + +namespace Drupal\json_forms\Form\Control\Callbacks; + +use Drupal\Core\Form\FormStateInterface; + +final class DateValueCallback { + + /** + * @param array $element + * @param mixed $input + * @param \Drupal\Core\Form\FormStateInterface $formState + * + * @return mixed + */ + public static function convert(array $element, $input, FormStateInterface $formState) { + if (FALSE === $input || '' === $input) { + $value = $element['#default_value'] ?? NULL; + + if (NULL === $value) { + // Prevent empty string as value. Drupal sets an empty string in this + // case if no value is set in the form state. + $formState->setValueForElement($element, NULL); + } + + return $value; + } + + return $input; + } + +} diff --git a/src/Form/Control/DateArrayFactory.php b/src/Form/Control/DateArrayFactory.php index 5c524b3..ce30871 100644 --- a/src/Form/Control/DateArrayFactory.php +++ b/src/Form/Control/DateArrayFactory.php @@ -24,6 +24,7 @@ use Assert\Assertion; use Drupal\Core\Form\FormStateInterface; use Drupal\json_forms\Form\AbstractConcreteFormArrayFactory; +use Drupal\json_forms\Form\Control\Callbacks\DateValueCallback; use Drupal\json_forms\Form\Control\Util\BasicFormPropertiesFactory; use Drupal\json_forms\Form\FormArrayFactoryInterface; use Drupal\json_forms\JsonForms\Definition\Control\ControlDefinition; @@ -47,6 +48,7 @@ public function createFormArray( /** @var \Drupal\json_forms\JsonForms\Definition\Control\ControlDefinition $definition */ $form = [ '#type' => 'date', + '#value_callback' => DateValueCallback::class . '::convert', ] + BasicFormPropertiesFactory::createFieldProperties($definition, $formState); // @phpstan-ignore-next-line