Symfony -修改原型中的默认数据



假设我有一个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

希望有所帮助

最新更新