Symfony 4-具有动态显示字段的同一类型的多种形式



我想使用我的 UserType表单类注册用户并编辑用户配置文件。由于我想在设置角色时注册用户,因此我不希望用户修改该选项。因此,我想使用两种不同的形式,但对于相同类型的User

我可以在一个FormType类中创建2个不同的buildForm()功能吗?还是我需要创建另一种类型?

这是我的UserType类(主要目的是注册用户(:

<?php
namespace AppForm;
use AppEntityUser;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeEmailType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeDateType;
use SymfonyComponentFormExtensionCoreTypeBirthdayType;
use SymfonyComponentFormExtensionCoreTypeRepeatedType;
use SymfonyComponentFormExtensionCoreTypePasswordType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstname', TextType::class)
            ->add('lastname', TextType::class)
            ->add('birthdate', BirthdayType::class, array(
                'placeholder' => '-'))
            ->add('email', EmailType::class)
            ->add('username', TextType::class)
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'first_options'  => array('label' => 'password'),
                'second_options' => array('label' => 'repeat-password'),
            ))
            ->add('roles', ChoiceType::class, [
               'multiple' => true,
               'expanded' => true, // render check-boxes
               'choices' => [
                   'Administrateur' => 'ROLE_ADMIN',
                   'Direction' => 'ROLE_MANAGER',
                   'Comptabilite' => 'ROLE_ACCOUNTING',
                   'Commercial' => 'ROLE_MARKETING',
                   'Docteur' => 'ROLE_DOCTOR',
                   'Client' => 'ROLE_CLIENT',
               ],
           ])
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
}

您可以使用变量将角色添加到FormType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $this->is_admin = $options['is_admin'];
    // [...]
    if ($this->is_admin)
        $builder
           ->add('roles', ChoiceType::class, [
               'multiple' => true,
               'expanded' => true, 
               'choices' => [
                   'Administrateur' => 'ROLE_ADMIN',
                   'Direction' => 'ROLE_MANAGER',
                   'Comptabilite' => 'ROLE_ACCOUNTING',
                   'Commercial' => 'ROLE_MARKETING',
                   'Docteur' => 'ROLE_DOCTOR',
                   'Client' => 'ROLE_CLIENT',
               ],
           ])
        // [...]
    ;
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        // [...]
        'is_admin' => false,
    ]);
}

然后通过变量

$form = $this->createForm(UserType::class, $user, array(
    'is_admin' => $this->isGranted('ROLE_ADMIN'),
);

您可以使用array $options
在Controler集choices中轻松处理此操作,然后将它们添加到$option
中,并且在USERTYPE中执行类似的操作:

->add('roles', ChoiceType::class, [
           'multiple' => true,
           'expanded' => true, // render check-boxes
           'choices' => $options['choices'],
       ]) 

最新更新