我有一个扩展AbstractType的PostType表单。在控制器中,如果满足某些条件,我想向其添加一个字段。我可以以某种方式执行此操作,还是在控制器中修改FormTypes还有其他最佳做法?
由于
答案 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分离。