我可以在symfony2中的FormType类中构建两个表单吗?

时间:2012-08-01 02:43:45

标签: php symfony doctrine-orm

我有这个表单类

class ProfileType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder

            ->add('name')
            ->add('class')
            ->add('age')
            ->add('parent')
     }

我的问题是我需要两个表单,一个用于后端,我需要所有字段,一个用于前端,我需要很少的字段。

我是否需要为两个表单创建单独的类,或者我可以以某种方式在一个类中放置两个表单,例如假设我不想在前端显示父表单。

问题是如果我在模板中只显示几个字段,那么当我提交表单时,这些字段将设置为null。所以我需要从班级中删除

2 个答案:

答案 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而无需额外选项或额外选项。如果没有默认选项,将使用。