Symfony DateTimeType始终无法通过拆分字段进行验证

时间:2018-10-18 19:40:20

标签: symfony

我相信将DateTimeType分为两个字段时发现错误。我无法通过表单验证。有人可以指出我是否缺少某些内容或复制吗?

这是我的alertType.php中的一个片段

            ->add('from', DateTimeType::class,[
            'date_widget'=>'single_text',
            'time_widget'=>'single_text',
            // date and time error, whole date string provided
            'date_format'=>'MM/dd/yyyy hh:mm a', 
            'input'=>'string',
            'attr'=>['class'=>'js-datetime-input'],
            'html5'=>false,
            'required'=>true,

        ])
        ->add('till', DateTimeType::class,[
            'date_widget'=>'single_text',
            'time_widget'=>'single_text',
            'input'=>'string',
            // just date string provided, error only on time
            'date_format'=>'MM/dd/yyyy',
            'attr'=>['class'=>'js-datetime-input'],
            'html5'=>false,
            'required'=>true,

        ])

这是来自探查器的图像,显​​示由于日期和时间的分割,出现了两个错误,从一个错误一直到直到。

enter image description here

我的form.html.twig

{{ form_start(alertForm) }}
    {{ form_row(alertForm.type) }}
    {{ form_row(alertForm.text) }}
    {{ form_row(alertForm.from) }}

    {{ form_row(alertForm.till) }}

<button type="submit" class="btn btn-success btn-block">Save</button>
{{ form_end(alertForm) }}

此表显示,如果在耕种上提供日期部分,我只会收到错误消息。我相信两个字段都分开时会出现问题。

enter image description here

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我找到了一个解决方案,尽管似乎有点破破烂烂

问题在于,当您将DateTimeType分为两个字段时,由于TimeType没有格式选项,因此format选项不再起作用,它仅接受24小时格式。

使用12小时格式拆分DateTimeType的解决方案是在日期类型的输入之间拆分输入,并将时间使用DateTimeType输入,以使用DateTimeType提供的格式选项。

这是我的formBuilder中的一个片段

->add('fromDate',DateType::class,array(
    'format'=>'MM/dd/yyyy',
    'widget'=>'single_text',
    'attr'=>['class'=>'js-datepicker','placeholder'=>'mm/dd/yyyy'],
    'required'=>true
))
->add('fromTime',DateTimeType::class,[
    'widget'=>'single_text',
    'format'=>'hh:mm a',
    'attr'=>['class'=>'js-timepicker','placeholder'=>'type or use picker, hh:mm am'],
    'required'=>true
])
->add('tillDate',DateType::class,array(
    'format'=>'MM/dd/yyyy',
    'widget'=>'single_text',
    'attr'=>['class'=>'js-datepicker','placeholder'=>'mm/dd/yyyy'],
    'required'=>true
))
->add('tillTime',DateTimeType::class,[
    'widget'=>'single_text',
    'format'=>'hh:mm a',
    'attr'=>['class'=>'js-timepicker','placeholder'=>'type or use picker, hh:mm am'],
    'required'=>true
])

然后在控制器中,您将合并两个DateTime对象并设置实体的值。

$fromDate = $form->get('fromDate')->getData();
$fromTime = $form->get('fromTime')->getData();
$tillDate = $form->get('tillDate')->getData();
$tillTime = $form->get('tillTime')->getData();

$mergeFrom = new \DateTime($fromDate->format('m/d/Y').' '.$fromTime->format('h:i a'));
$mergeTill = new \DateTime($tillDate->format('m/d/Y').' '.$tillTime->format('h:i a'));

$alert->setFrom($mergeFrom);
$alert->setTill($mergeTill);

由于我的实体仅存储单个字段,因此我们还需要在实体上使用几个额外的属性以对它们使用断言

/**
 * @var \DateTime
 *
 *
 * @ORM\Column(name="FROM_DATE", type="datetime")
 */
private $from;


/**
 * @var \DateTime
 *
 * @Assert\Date()
 */
private $fromDate;

/**
 * @var \DateTime
 *
 * @Assert\DateTime()
 */
private $fromTime;

希望这可以帮助希望将DateTimeTypes拆分为单独字段以供用户输入的其他任何人。