我正在尝试构建客户表单字段。这是一个日期选择器,但我的视图数据转换器出现问题。忘记日期选择器的东西,我把它归结为一个简单的骨头例子。这只是显示和接受日期。 Symfony日期类型的简化版本。
我将这种类型捆绑在一起。
namespace AppBundle\Form\Type;
use AppBundle\Form\DataTransformer\DateToStringTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class MyDateType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addViewTransformer(new DateToStringTransformer());
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([]);
}
public function getName()
{
return 'mydate';
}
}
这是我的变压器。
namespace AppBundle\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
class DateToStringTransformer implements DataTransformerInterface
{
public function transform($value)
{
if (null === $value) {
return '';
}
if (!$value instanceof \DateTime) {
throw new TransformationFailedException('Expected a \DateTime.');
}
return $value->format('n/j/Y');
}
public function reverseTransform($value)
{
if (empty($value)) {
return null;
}
if (!is_string($value)) {
throw new TransformationFailedException('Expected a string.');
}
return \DateTime::createFromFormat('n/j/Y', $value);
}
}
服务定义如下:
mydate:
class: AppBundle\Form\Type\MyDateType
tags:
- { name: form.type, alias: mydate}
在AppBundle / Resources / Views / form.html.twig。
{% block mydate_widget %}
{{ block('form_widget_simple') }}
{% endblock %}
在config.yml
中twig:
form:
resources:
- 'AppBundle:Form:fields.html.twig'
在控制器中。
/**
* @Route("/test2")
*/
public function test2Action(Request $request)
{
$form = $this->createFormBuilder([
'date' => \DateTime::createFromFormat('n/j/Y', '11/20/2014')
])
->add('date', 'mydate')
->add('submit', 'submit')
->getForm()
;
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
}
return $this->render('default/test2.html.twig', [
'form' => $form->createView()
]);
}
变压器从日期到字符串工作。它的变换方法被调用,日期显示正常。但是在发布表单时不会调用reverseTransform。
我觉得我错过了一些可以告诉它发布值来自哪里的东西。它当然应该是输入元素的发布值,但我不太清楚它是如何自动发生的。
我需要型号变压器吗?我不这么认为,因为我的“模型数据”和“规范数据”都是DateTime。我只需要转换为视图的字符串。
答案 0 :(得分:2)
咄!刚发现它。
在MyDateType中我需要
$resolver->setDefaults([
'compound' => false
]);