假设我有一个 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
的值,以便每当添加新原型(prototype)时,它都显示今天的日期?
有些人建议使用 Entity __construct()
函数来创建默认值,但这似乎不适用于原型(prototype)。我还找到了placeholder选项,但我不确定如何使用它以便它始终具有今天的日期 - 即这似乎不起作用:
->add('addDate', DateType::class, array(
'placeholder' => new \DateTime();
))
错误是:尝试从全局命名空间调用函数“DateTime”
此外,我还找到了 prototype_data字段中的 CollectionType 字段,但同样,我不确定如何指定仅将数据放入单个字段中,并使其动态。
有人可以告诉我最好的使用方法 - 以及正确的语法吗?
编辑:
所以我的 __construct()
看起来像:
public function __construct()
{
$this->addDate = new \DateTime();
}
这对于 Category
实体(如果我给它一个日期字段进行测试)工作得很好,但不适用于原型(prototype) Product
实体。当我将原型(prototype)加载到表单中时,我只得到默认日期 2011 年 1 月 1 日。原型(prototype)如下所示:
{% block _category_products_entry_row %}
<li>
{{ form_row(form.name) }}
{{ form_row(form.dateAdded) }}
</li>
{% endblock %}
有趣的是,我还发现,如果我加载带有已在 Category
Controller 中创建的 Product
实体的新表单,dateAdded
出现此字段的原因是:
{% for product in form.products %}
{{ form_row(product) }}
{% endfor %}
将今天的日期作为默认值。这对我来说意味着原型(prototype)的加载是以与 How to Embed a Collection of Forms 相同的方式完成的。教程 - 导致了问题。
最佳答案
要为表单字段设置默认值,您可以使用“data”属性并使用 FormEvent 来处理更新时的表单。结果如下:
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
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
希望对你有帮助
关于php - Symfony - 修改原型(prototype)中的默认数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273915/