我可以动态地向FormType表单添加字段吗?

时间:2012-02-18 00:07:52

标签: symfony

我有一个扩展AbstractType的PostType表单。在控制器中,如果满足某些条件,我想向其添加一个字段。我可以以某种方式执行此操作,还是在控制器中修改FormTypes还有其他最佳做法?

由于

4 个答案:

答案 0 :(得分:7)

假设您有 FileType 类型的表单,如下所示:

<?php
namespace EventFlowAnalyser\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class FileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text', array('label' => 'Name'));
    }

    public function getName()
    {
        return 'file';
    }
}

您可以在控制器中使用它,如下所示:

$form = $this->createForm(new FileType(), $document);

$ document 是包含一个字段(名称)的对象。 现在,如果您需要在另一个函数中向表单对象添加字段,可以扩展 FileType 以添加所需的字段;例如,如果您要编辑名称字段但仍希望跟踪之前的状态,请添加 original_name 字段。

<?php
namespace EventFlowAnalyser\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

use EventFlowAnalyser\Form\EventListener\EditFileFieldSubscriber;

class FileEditType extends FileType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder->add('original_name', 'hidden', array('mapped' => false));
    }
}

现在,您可以使用扩展形式:

$form = $this->createForm(new FileEditType(), $document);

并修改字段的值:

$form->get('original_name')->setData($document->name);

我希望这对某些人有帮助:o)

答案 1 :(得分:5)

您可以使用Form Events

来完成

答案 2 :(得分:4)

确定您可以使用表单中的“收集类型”动态添加字段。 请参阅以下链接,这将帮助您动态创建字段。

Link1: Dynamic Field in Symfony2

Link2: Form Collection in symfony2 doc

希望这两个链接对您有所帮助。 快乐的编码..

答案 3 :(得分:2)

我认为您应该在表单中添加一个布尔选项,并将其设置在控制器中。这样你就可以获得干净的M(V)C分离。