我想使用Symfony 2.3将DateTime字段拆分为两个字段(日期和时间)。因此,我尝试调整发现here的Symfony 2.0解决方案,并对Symfony 2.3进行了必要的更改。
新类型:
class MyDateTimeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'date', array(
'label' => 'label.form.date',
'input' => 'datetime',
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'error_bubbling' => true
))
->add('time', 'time', array(
'label' => 'label.form.time',
'input' => 'datetime',
'widget' => 'single_text',
'error_bubbling' => true
))
->addViewTransformer(new DateTimeToDateTimeArrayTransformer());
}
public function getDefaultOptions(array $options)
{
return array(
'label' => 'label.form.date',
'error_bubbling' => false
);
}
public function getParent()
{
return 'form';
}
public function getName()
{
return 'my_datetime';
}
}
和DataTransformer:
class DateTimeToDateTimeArrayTransformer implements DataTransformerInterface
{
public function transform($datetime)
{
if ($datetime instanceof \DateTime)
{
$date = clone $datetime;
$date->setTime(12, 0, 0);
$time = clone $datetime;
$time->setDate(1970, 1, 1);
}
else
{
$date = null;
$time = null;
}
$result = array(
'date' => $date,
'time' => $time
);
return $result;
}
public function reverseTransform($array)
{
$date = $array['date'];
$time = $array['time'];
if(null == $date || null == $time)
return null;
$date->setTime($time->format('G'), $time->format('i'));
return $date;
}
}
services.yml
foo.bar.form.type.my_date_time:
class: Foo\Bar\Form\MyDateTimeType
tags:
- { name: form.type, alias: my_datetime }
但是当我以这样的形式使用类型时:
$builder->add('abc', 'my_datetime', array(
'label' => 'ABC',
'data' => new \DateTime(null, new \DateTimeZone('UTC'))
));
我收到错误:
表单的视图数据应该是DateTime类的实例,但是我是一个(n)数组。您可以通过将“data_class”选项设置为null或通过添加将(n)数组转换为DateTime实例的视图转换器来避免此错误。
答案 0 :(得分:7)
我知道有点晚了,但我遇到了同样的问题并解决了它。
您不需要新的表单类型来分割日期时间字段的日期和时间。
以您的形式
$builder
->add('datetime', DateTimeType::class, array(
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'date_format' => 'dd.MM.yyyy',
'required' => true,
))
:
如果你想分别渲染输入字段(例如,将不同的类添加为属性),只需在树枝模板中执行此操作
{{ form_start(form) }}
..
{{ form_widget(form.datetime.date) }}
{{ form_widget(form.datetime.time) }}
..
{{ form_end(form) }}
在Symfony 2.6中测试,应该从2.3上升(甚至可能是2.1)
编辑:针对Symfony 2.8及更高版本进行了调整