DateTimePicker и Datatransformer, форма визуализации не учитывает строку - PullRequest
0 голосов
/ 28 января 2020

У меня есть проблема с Symfony для преобразования DateTime в строку. Я использую DataTransformer для форматирования моего Datetime, но в форме есть ошибка, которая говорит: «Это значение должно иметь тип string».

Вот мой код: My Entity: Shift. php ( только необходимое)

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;
/**
 * @ORM\Column(type="datetime")
 * @Assert\DateTime(message="La date de début doit être au format DateTime")
 */
private $start_at;

Мой ShiftType:

$builder
    ->add('start_at', TextType::class, ['attr' => [ 'class' => 'dateTimePicker']])
    ->add('end_at', TextType::class, ['attr' => [ 'class' => 'dateTimePicker']])
    ->add('has_eat')
    ->add('break_duration')
    ->add('comment')
    ;
$builder->get('start_at')->addModelTransformer($this->transformer);
$builder->get('end_at')->addModelTransformer($this->transformer);

И мой DataTransformer:

/**
 * @param DateTime|null $datetime
 * @return string
 */
public function transform($datetime)
{
    if ($datetime === null) 
    {
        return '';
    }
    return $datetime->format('Y-m-d H:i');
}
/**
 * @param string $dateString
 * @return Datetime|null
 */
public function reverseTransform($dateString)
{
    if (!$dateString) 
    {
        throw new TransformationFailedException('Pas de date(string) passé');
        return;
    }
    $date = \Datetime::createFromFormat('Y-m-d H:i', $dateString);
    if($date === false){
        throw new TransformationFailedException("Le format n'est pas le bon (fonction reverseTransform)" . "$dateString");
    }
    return $date;
}

Как я уже сказал, когда я хочу отправить форму, там ошибки с формой. Он сказал: «Это значение должно иметь тип string». и это вызвано:

Symfony\Component\Validator\ConstraintViolation {#1107 ▼
  root: Symfony\Component\Form\Form {#678 …}
  path: "data.start_at"
  value: DateTime @1578465000 {#745 ▶}
}

Что-то странное, когда я хочу отредактировать смену, Symfony получает дату из БД и преобразует ее в строку без сообщения об ошибке. Но поскольку я хочу сохранить изменения, у меня возникла та же проблема

Не могли бы вы помочь мне, пожалуйста? Спасибо

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Спасибо за ответ. Я попробовал тур решение, и я буду использовать его, но это не было решением моей проблемы. С вашим кодом я получил ту же ошибку.

Решение было в сущности. В аннотациях start_at я использовал @ Assert / DateTime, и он плохо использовался. Я просто удалил эту строку, и теперь все правильно:

/**
 * @ORM\Column(type="datetime")
 * 
 */
private $start_at;
/**
 * @ORM\Column(type="datetime", nullable=true)
 * @Assert\GreaterThan(propertyPath="start_at", message="La date de fin doit être ultérieure...")
 */
private $end_at;

Однако я использую ваш код, потому что он многократно используется, поэтому спасибо за ваш вклад

0 голосов
/ 29 января 2020

В прошлом у меня была похожая проблема при использовании $ this-> внутри формы.

Иногда $ this не содержит текущих данных. Это может объяснить, почему он загружается сначала, но при отправке может не заполняться должным образом.

Я бы предложил создать пользовательский тип формы для лучшего повторного использования, и я знаю, что он работает очень хорошо.

Поскольку у вас уже есть свой класс DataTransformer, вам нужно будет создать новый пользовательский тип Type. Этот новый тип формы расширит TextType и будет использовать преобразователь данных.

Например:

namespace App\Form\Branch\Type;

use App\Form\Branch\DataTransformer\PhoneFormatTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PhoneType extends AbstractType
{
    private $tools;


    public function __construct()
    {
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $transformer = new PhoneFormatTransformer();
        $builder->addModelTransformer($transformer);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array());
    }

    public function getParent()
    {
        return TextType::class;
    }

    public function getBlockPrefix()
    {
        return 'phone';
    }
}

Если ваши службы не подключены автоматически, вам нужно добавить определение службы с указанным тегом c

App\Form\Branch\Type\PhoneType:
    tags:
    - { name: form.type, alias: phone }

Все, что осталось сделать, - это использовать новый тип формы в конструкторе форм:

use App\Form\Branch\Type\PhoneType;
...
$builder
->add('phone', PhoneType::class);

Это немного сложнее, но его очень легко использовать повторно, что, без сомнения, вам придется делать каждый раз, когда необходимо поле даты и времени.

Надеюсь, это поможет!

...