diff --git a/lib/FieldType/DataTransformer/DateTimeValueTransformer.php b/lib/FieldType/DataTransformer/DateTimeValueTransformer.php index 50cb9df8f..d25462a44 100644 --- a/lib/FieldType/DataTransformer/DateTimeValueTransformer.php +++ b/lib/FieldType/DataTransformer/DateTimeValueTransformer.php @@ -9,9 +9,9 @@ */ namespace EzSystems\RepositoryForms\FieldType\DataTransformer; -use DateTime; use eZ\Publish\Core\FieldType\DateAndTime\Value; use Symfony\Component\Form\DataTransformerInterface; +use Symfony\Component\Form\Exception\TransformationFailedException; /** * DataTransformer for DateAndTime\Value. @@ -21,28 +21,48 @@ class DateTimeValueTransformer implements DataTransformerInterface /** * @param mixed $value * - * @return DateTime|null + * @return int|null + * + * @throws TransformationFailedException */ public function transform($value) { + if (null === $value) { + return null; + } + if (!$value instanceof Value) { + throw new TransformationFailedException( + sprintf('Expected a %s, got %s instead', Value::class, gettype($value)) + ); + } + + if (null === $value->value) { return null; } - return $value->value; + return $value->value->getTimestamp(); } /** * @param mixed $value * * @return Value|null + * + * @throws TransformationFailedException */ public function reverseTransform($value) { - if ($value === null || !$value instanceof DateTime) { + if (empty($value)) { return null; } - return new Value($value); + if (!is_numeric($value)) { + throw new TransformationFailedException( + sprintf('Expected a numeric, got %s instead', gettype($value)) + ); + } + + return Value::fromTimestamp($value); } } diff --git a/lib/Form/Type/FieldType/DateTimeFieldType.php b/lib/Form/Type/FieldType/DateTimeFieldType.php index 41a3ed15c..b807a9073 100644 --- a/lib/Form/Type/FieldType/DateTimeFieldType.php +++ b/lib/Form/Type/FieldType/DateTimeFieldType.php @@ -7,8 +7,10 @@ use EzSystems\RepositoryForms\FieldType\DataTransformer\DateTimeValueTransformer; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\DateTimeType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; /** @@ -28,34 +30,24 @@ public function getBlockPrefix() public function getParent() { - return DateTimeType::class; + return IntegerType::class; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->setAttributes($this->getAttributes($options)) ->addModelTransformer(new DateTimeValueTransformer()); } - private function getAttributes(array $options) + public function buildView(FormView $view, FormInterface $form, array $options) { - $attributes = []; - - if ($options['with_seconds']) { - $attributes['step'] = 1; - } - - return $attributes; + $view->vars['attr']['data-seconds'] = (int) $options['with_seconds']; } public function configureOptions(OptionsResolver $resolver) { - $resolver->setDefaults([ - 'input' => 'datetime', - 'date_widget' => 'single_text', - 'time_widget' => 'single_text', - 'html5' => false, - ]); + $resolver + ->setDefault('with_seconds', true) + ->setAllowedTypes('with_seconds', 'bool'); } }