【问题标题】:Symfony 4 - Multiple forms of same type with dynamic display fieldsSymfony 4 - 具有动态显示字段的相同类型的多种形式
【发布时间】:2018-07-29 14:20:57
【问题描述】:

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

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

这是我的UserType 课程(主要目的是注册用户):

<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

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

【问题讨论】:

    标签: php forms symfony types


    【解决方案1】:

    您可以使用变量将角色动态添加到 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'),
    );
    

    【讨论】:

    • 我直接使用if ($options['is_admin']) 但感谢好的回答:)
    【解决方案2】:

    您可以使用array $options
    在控制器集choices 的角色中轻松处理此问题,并将它们添加到$option
    并在 userType 中执行以下操作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多