symfony DateType表单字段可以允许替代格式吗?

时间:2018-08-15 01:08:29

标签: forms symfony

在symfony4表单中,我有一个很好的DateType字段,我喜欢它附带的错误消息的验证和自动处理。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('dob', DateType::class, [
            'widget' => 'single_text',
            'format' => 'M/d/yy',
        ]);
}

我想要的是能够允许用户使用2位数或4位数的年份,并且都通过了验证。

执行此操作的一种乏味方法似乎是在传递给控制器​​中的handleRequest()方法之前,修改Request对象中的特定表单元素,但这会很混乱并且与我的代码紧密绑定。

一种非常不错的方法(不存在)是使用类似另一个选项'alternate_format' => 'M/d/yyyy'的方法。

有人有更直接的方法吗?

1 个答案:

答案 0 :(得分:1)

目前,我已经使用一些客户端javascript解决了我的问题。万一其他人需要类似的东西,我的日期字段是出生日期,如果我接受我没有100岁以上的人的限制,那么此解决方案可以很好地满足我的目的。 [编辑:仅当您强制输入两位数的年份时,此限制才成立。如果将格式设置为4位数字的年份,然后使用JavaScript进行调整,则没有这种限制。下面的脚本确实假定日期不能为将来的日期,这适用于出生日期字段。]

在表单中,我向字段中添加了一个类,并假定格式应为4位数字的年份:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('dob', DateType::class, [
            'widget' => 'single_text',
            'format' => 'M/d/yyyy',
            'attr' => ['class' => 'js-dob'],
        ])
}

然后在客户端,我有一个在提交时运行的小片段:

$('.js-save-button').on('click', function() {
    // convert 2-digit years to 4-digit version in dob field
    $('.js-dob').each(function() {
        let date = new Date($(this).val());
        if (date instanceof Date && !isNaN(date)) {
            if (date > new Date()) {
                date.setFullYear(date.getFullYear() - 100);
            }
        }
        $(this).val(date.toLocaleDateString("en-US"));
    });
});