DateTimePicker和Datatransformer,表单渲染器不考虑字符串

问题描述 投票:0回答:1

我在Symfony中遇到严重问题,将DateTime转换为字符串。我使用DataTransformer格式化我的Datetime,但是在格式中,出现错误提示:“此值应为字符串类型”。

这是我的代码:我的实体: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;
}

正如我所说,当我要提交表格时,表格存在错误。它说:“此值应为字符串类型。”这是由:

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

[有些破旧,当我要编辑班次时,Symfony从数据库获取日期并将其转换为字符串,而没有任何错误消息。但是,由于我要保存编辑,所以遇到了同样的问题

您能帮我吗?谢谢

symfony bootstrap-datetimepicker data-transform
1个回答
0
投票

过去在表单中使用$ this->时,我遇到过类似的问题。

有时$ this将不包含当前数据。它可能会解释为什么首先要加载它,但是在提交时,它可能无法正确填充。

我建议创建一个自定义表单类型以提高可重用性,并且我知道它的效果很好。

由于您已经拥有DataTransformer类,因此您需要创建一个新的自定义表单类型。这种新的表单类型将扩展TextType并使用datatransformer。

例如:

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';
    }
}

如果服务未自动接线,则需要添加带有特定标签的服务定义

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

剩下要做的就是在表单构建器中使用新的表单类型:

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

这是一项繁琐的工作,但是它使重用变得非常容易,毫无疑问,每次需要datetime字段时,您都必须这样做。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.