首页 > 解决方案 > 仅当我的用户拥有角色时才在表单中设置默认值:ROLE_USER [symfony 4]

问题描述

我有一份报告申请表。如果需要,我希望管理员为用户创建请求。

所以我有一个字段,如果用户具有某个用户角色,则该字段将被阻止,或者如果用户具有管理员角色,该字段将被打开。

需求类型.php

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('applicant', EntityType::class, array(
                'class' => User::class,
                'choice_label' => 'username',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.username', 'ASC');
                },
            ))
            ->add('date', DateType::class, array(
                'format' => 'dd MMM yyyy',
                'disabled' => true,
            ))
            ->add('type', ChoiceType::class, array(
                'choices' => array(
                    'Demande de Reporting' => 'Reporting récurrent',
                    'Demande One Shot' => 'Reporting One Shot',
                ),
                'multiple' => false,
                'required' => true,
            ))
            ->add('dateDelivery', DateType::class, array(
                'format' => 'dd MMM yyyy',
            ))
            ->add('synthesis', TextareaType::class, array(
                'attr' => array(
                    'rows' => '3'
                ),
            ))
        ;
    }

需求控制器.php

    public function create(Request $request, ObjectManager $em, UserRepository $repo)
    {
        $demand = new Demand();

        $users = $repo->findAll();

        $form = $this->createForm(DemandType::class, $demand);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em->persist($demand);
            $em->flush();

            $this->addFlash('success', 'Demande bien enregistrée');

            return $this->redirectToRoute('demand_show', array(
                'slug' => $demand->getSlug(),
            ));

        } elseif ($form->isSubmitted() && !$form->isValid()) {
            $this->addFlash('danger', 'Erreur lors de la validation du formulaire');
        }

        return $this->render('demand/new.html.twig', array(
            'form' => $form->createView(),
            'users' => $users
        ));
    }

newDemand.html.twig

{% if is_granted('ROLE_ADMIN') %}
    <div class="form-group row">
        {{ form_label(form.applicant, 'Demandeur * :', {'label_attr': {'class': 'col-sm-4 col-form-label'}}) }}
        <div class="col-sm-3">
            {{ form_widget (form.applicant, {'attr': {'class': 'form-control'}}) }}
        </div>
    </div>
{% else %}
    <div class="form-group row">
        {{ form_label(form.applicant, 'Demandeur * :', {'label_attr': {'class': 'col-sm-4 col-form-label'}}) }}
        <div class="col-sm-3">
            {{ form_widget (form.applicant, {'attr': {'value':app.user.username, 'disabled':'disabled', 'class': 'form-control'}}) }}
        </div>
    </div>
{% endif %}

我想,如果用户有ROLE_USER字段申请人被禁用并显示用户名,如果用户有ROLE_ADMIN字段显示数据库中所有可用的用户。对于第二部分,管理员可以将需求归因于其他用户。

现在我想app.user.username在小部件demand.applicant中为用户强制一个值ROLE_USER

标签: symfony4

解决方案


我的建议:在 DemandType 中引入一个新选项,如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title');
    if($options['is_admin']){
        $builder->add('applicant', EntityType::class, array(
            'class' => User::class,
            'choice_label' => 'username',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')
                    ->orderBy('u.username', 'ASC');
            },
        ))
    }
    $builder->add('date', DateType::class, array(
            'format' => 'dd MMM yyyy',
            'disabled' => true,
        ))
        ->add('type', ChoiceType::class, array(
            'choices' => array(
                'Demande de Reporting' => 'Reporting récurrent',
                'Demande One Shot' => 'Reporting One Shot',
            ),
            'multiple' => false,
            'required' => true,
        ))
        ->add('dateDelivery', DateType::class, array(
            'format' => 'dd MMM yyyy',
        ))
        ->add('synthesis', TextareaType::class, array(
            'attr' => array(
                'rows' => '3'
            ),
        ))
    ;
}

public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults(
            [
                //add this param to the rest if you have this block already
                'is_admin' => false
            ]
        );
    }

然后在 cotroller 中,您可以将 admin 标志传递给 DemandType:

public function create(Request $request, ObjectManager $em, UserRepository $repo)
{
    $demand = new Demand();

    $users = $repo->findAll();
    //Change here
    $form = $this->createForm(DemandType::class, $demand, ['is_admin' => $this->isGranted('ROLE'ADMIN')]);
    //Change end
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        //Change here
        if(!$this->isGranted('ROLE'ADMIN')){
            $demand->setApplicant($this->getUser());
        }
        //Change end
        $em->persist($demand);
        $em->flush();

        $this->addFlash('success', 'Demande bien enregistrée');

        return $this->redirectToRoute('demand_show', array(
            'slug' => $demand->getSlug(),
        ));

    } elseif ($form->isSubmitted() && !$form->isValid()) {
        $this->addFlash('danger', 'Erreur lors de la validation du formulaire');
    }

    return $this->render('demand/new.html.twig', array(
        'form' => $form->createView(),
        'users' => $users
    ));
}

枝条:

{% if is_granted('ROLE_ADMIN') %}
    <div class="form-group row">
        {{ form_label(form.applicant, 'Demandeur * :', {'label_attr': {'class': 'col-sm-4 col-form-label'}}) }}
        <div class="col-sm-3">
            {{ form_widget (form.applicant, {'attr': {'class': 'form-control'}}) }}
        </div>
    </div>
{% else %}
    <div class="form-group row">
        <label class="col-sm-4 col-form-label">Demandeur</label>
        <div class="col-sm-3">
            {{app.user.username}}
        </div>
    </div>
{% endif %}

推荐阅读