3

我想构建一个自定义 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'一切正常。

有谁知道为什么抛出异常以及如何摆脱它?

4

1 回答 1

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.

MonthType您创建的是子级FormType(因为继承的 getParent() 返回“表单”)

month_widget找不到(因为你还没有定义它),所以它接下来会尝试渲染form_widget.

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

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

所以,错误是Array to string conversion

于 2014-02-19T02:35:14.810 回答