我正在寻找一种简单的方法来为每个表单添加一组字段。
我找到了一种扩展AbstractType并使用该buildForm
方法添加更多字段的方法。
创建表单时,我给出了我的新类型的名称(如何创建自定义表单字段类型)。
在我看来,这是一种简单的方法,但每个表格仅限于一种类型。
有没有更好的方法来实现这样的目标?
我已经阅读了 symfony 的食谱,但我只找到了如何扩展现有表单的内容,而不是如何使用我的字段创建自己的表单“模板”。
我正在寻找一种简单的方法来为每个表单添加一组字段。
我找到了一种扩展AbstractType并使用该buildForm
方法添加更多字段的方法。
创建表单时,我给出了我的新类型的名称(如何创建自定义表单字段类型)。
在我看来,这是一种简单的方法,但每个表格仅限于一种类型。
有没有更好的方法来实现这样的目标?
我已经阅读了 symfony 的食谱,但我只找到了如何扩展现有表单的内容,而不是如何使用我的字段创建自己的表单“模板”。
您是否尝试过使用继承?
这真的很简单,首先你必须定义一个表单类型:
# file: Your\Bundle\Form\BaseType.php
<?php
namespace Your\Bundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class BaseType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'text');
$builder->add('add', 'submit');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Your\Bundle\Entity\YourEntity',
));
}
public function getName()
{
return 'base';
}
}
然后你可以extend
这个表单类型:
# file: Your\Bundle\Form\ExtendType.php
<?php
namespace Your\Bundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ExtendType extends BaseType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
# you can also remove an element from the parent form type
# $builder->remove('some_field');
$builder->add('number', 'integer');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Your\Bundle\Entity\YourEntity',
));
}
public function getName()
{
return 'extend';
}
}
将BaseType
显示一个名称字段和一个添加提交按钮。将ExtendType
显示一个名称字段、一个添加提交按钮和一个数字字段。
您可以使用 getParent() 函数执行此操作。
<?php
namespace Your\Bundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class ChildType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// $builder->remove('field');
// $builder->add('field);
}
public function getParent()
{
return ParentType::class;
}
}