我想构建一个自定义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'
,一切都会完美无缺。
有谁知道抛出异常的原因以及如何摆脱它?
答案 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
的渲染块。
MonthType
是FormType
的子项(因为继承的getParent()返回'form')
month_widget
(因为您尚未定义它),因此接下来会尝试渲染form_widget
。
在form_widget
中,只有像<input type="text" value="{{ value }}" ...
这样的简单文本字段,并且因为值不是标量而在此处失败。
value
实际上不是DateTime而是数组,因为类中使用了DateTimeToArrayTransformer
。
(正如类名所示,DateTime被转换为数组)
所以,错误是Array to string conversion
。