Symfony Forms:修改后的DateType类中的“数组到字符串转换”异常

时间:2013-03-05 08:46:10

标签: forms symfony formbuilder

我想构建一个自定义DateType类。为了做到这一点,我将类 Symfony \ Component \ Form \ Extension \ Core \ Type \ DateType 复制到我的src /目录并更改了类名和getName()

<?php

namespace FooBar\CoreBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
// ...

class MonthType extends AbstractType
{
    // ...

    public function getName()
    {
        return 'month';
    }

    // ...
}

我还注册了新类型:

foobar.form.type.month:
    class: FooBar\CoreBundle\Form\Type\MonthType
    tags:
        - { name: form.type, alias: month }

但是,如果我尝试使用我的新类型,则抛出异常(Array to string conversion in /var/www/foobar/app/cache/dev/twig/4d/99/945***.php):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $default = new \DateTime('now');
    $builder
        ->add('season', 'month', array('data' => $default))
    ;
}

注意:如果我将'month'更改为'date',一切都会完美无缺。

有谁知道抛出异常的原因以及如何摆脱它?

1 个答案:

答案 0 :(得分:1)

如何修复

您必须定义块month_widget并使用表单字段模板来使sf2正确渲染字段。

例如,请在.twig中写下。

{% form_theme form _self %}

{% block month_widget %}
<input type="text" value="{{ value.year }}">
<input type="text" value="{{ value.month }}">
{% endblock %}

并自定义演示文稿。

默认主题文件Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig可能会有所帮助。

有关详细信息,请参见下文。 http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-a-template-for-the-field

错误原因

Symfony2没有名为month_widget的渲染块。

您创建的

MonthTypeFormType的子项(因为继承的getParent()返回'form')

找不到

month_widget(因为您尚未定义它),因此接下来会尝试渲染form_widget

form_widget中,只有像<input type="text" value="{{ value }}" ...这样的简单文本字段,并且因为值不是标量而在此处失败。

value实际上不是DateTime而是数组,因为类中使用了DateTimeToArrayTransformer。 (正如类名所示,DateTime被转换为数组)

所以,错误是Array to string conversion