php - Symfony - 修改原型(prototype)中的默认数据

标签 php symfony prototype

假设我有一个 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#datahttps://symfony.com/doc/current/form/events.html

希望对你有帮助

关于php - Symfony - 修改原型(prototype)中的默认数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273915/

相关文章:

php - 使用 SimpleXML 在 PHP 中迭代 XML 数据

php - 如何控制单选按钮?从数据库、PHP、MYSQL 回显数据

service - Symfony2服务参数-传递当前请求

symfony - 我应该在 Symfony 2 中使用什么作为 XLIFF 原始文件?

JavaScript 原型(prototype)命名标准

php - Facebook 聊天如何运作?

javascript - 状态的多选列表框不显示另一个列表框中的所有城市(Php,mysql,ajax)

我的 UserController 的 PHPunit 没有覆盖所有行

javascript - JS原型(prototype)函数 'this'混淆

javascript - 如何在javascript中将类扩展到类实例?