假设我有一个Category
和一个Product
实体,其中Category
有许多Product
实体。我的Category
表单生成器看起来像这样:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('products', CollectionType::class, array(
'entry_type' => ProductType::class,
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__product_prot__'))
->add('save', SubmitType::class))
;
}
和我的Product
表单生成器看起来像这样:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('dateAdded', DateType::class)
;
}
我想知道的是如何设置dateAdded
的值,以便每当添加新的原型时,它显示今天的日期?
有些人建议使用实体__construct()
函数来创建默认值,但这似乎不适用于原型。我也找到了占位符选项,但我不确定如何使用它,以便它总是有今天的日期-即这似乎不起作用:
->add('addDate', DateType::class, array(
'placeholder' => new DateTime();
))
如Attempted to call function "DateTime" from the global namespace
此外,我在CollectionType
字段中发现了prototype_data字段,但是再次,我不确定如何指定仅将数据放在单个字段中,并使其动态。
谁能告诉我最好的方法和正确的语法?
编辑:所以我的__construct()
看起来像:
public function __construct()
{
$this->addDate = new DateTime();
}
这适用于Category
实体(如果我给它一个日期字段进行测试),但不适用原型Product
实体。当我将原型加载到表单中时,我得到的默认日期是2011年1月1日。原型如下:
{% block _category_products_entry_row %}
<li>
{{ form_row(form.name) }}
{{ form_row(form.dateAdded) }}
</li>
{% endblock %}
有趣的是,我还发现,如果我加载新表单与Product
实体已经在Category
控制器,dateAdded
字段出现由于:
{% for product in form.products %}
{{ form_row(product) }}
{% endfor %}
将今天的日期作为默认值。这对我来说意味着,原型的加载方式与"如何嵌入表单集合"教程相同,这是导致问题的原因。
要设置表单字段的默认值,可以使用"data"属性并使用FormEvent来处理表单更新。结果如下:
use SymfonyComponentFormFormEvent;
use SymfonyComponentFormFormEvents;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('dateAdded', DateType::class, array(
'data' => new DateTime(),
))
;
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
$product = $event->getData();
$form = $event->getForm();
if (!$product) {
return;
}
if ($dateAdded = $product->getDateAdded()) {
$form->add('dateAdded', DateType::class, array(
'data' => $dateAdded,
));
}
});
}
在PRE_SET_DATA上,你可以用你获取的数据覆盖dateAdded字段的默认值。
更多信息,请访问http://symfony.com/doc/current/reference/forms/types/date.html#data和https://symfony.com/doc/current/form/events.html
希望有所帮助