在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'
的方法。
有人有更直接的方法吗?
答案 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"));
});
});