我有这个表单类
class ProfileType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('name')
->add('class')
->add('age')
->add('parent')
}
我的问题是我需要两个表单,一个用于后端,我需要所有字段,一个用于前端,我需要很少的字段。
我是否需要为两个表单创建单独的类,或者我可以以某种方式在一个类中放置两个表单,例如假设我不想在前端显示父表单。
问题是如果我在模板中只显示几个字段,那么当我提交表单时,这些字段将设置为null。所以我需要从班级中删除
答案 0 :(得分:1)
您可以使用$ options参数。
$form = $this->createForm(new ProfileType(), $profile, array('status' => 'backend'));
在你的buildForm中:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name')
->add('class')
->add('age')
->add('parent');
if($options['status'] == 'backend')
{
$builder->add('other1')
->add('other2');
}
}
但这是一个非常肮脏的解决方案,我个人会创建两种类型。
答案 1 :(得分:0)
也添加默认选项:
class ProfileType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name')
->add('class')
->add('age')
->add('parent');
if($options['status'] == 'backend')
{
$builder->add('other1')
->add('other2');
}
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Profile',
'status' => 'frontend',
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_profile';
}
}
现在您可以使用formtype而无需额外选项或额外选项。如果没有默认选项,将使用。