0

我有这个表单类

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

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

我的问题是我需要两种形式,一种用于需要所有字段的后端,另一种用于需要少量字段的前端。

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

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

4

2 回答 2

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');
     }
}

但这是一个相当肮脏的解决方案,我个人会创建两种类型。

于 2012-08-02T09:47:45.540 回答
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';
    }
}

现在您可以在没有额外选项或带有额外选项的情况下使用表单类型。如果没有默认选项,将被使用。

于 2015-11-10T08:03:00.163 回答