仅当我的用户有角色时才在表单中设置默认值:ROLE_USER [symfony 4]
Set a default value in form only if my user hasrole : ROLE_USER [symfony 4]
我有一份报告申请表。如果需要,我希望管理员为用户创建一个请求。
所以我有一个字段,如果用户具有特定用户角色,该字段将被阻止;如果用户具有管理员角色,该字段将被打开。
DemandType.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'
),
))
;
}
DemandController.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
字段显示数据库中所有可用的用户。对于第二部分,管理员可以将需求归因于其他用户。
现在我想在小部件 demand.applicant
中为具有 ROLE_USER
的用户强制一个值 app.user.username
。
我的建议:像这样在 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
]
);
}
然后在控制器中,您可以将管理标志传递给 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 %}
我有一份报告申请表。如果需要,我希望管理员为用户创建一个请求。
所以我有一个字段,如果用户具有特定用户角色,该字段将被阻止;如果用户具有管理员角色,该字段将被打开。
DemandType.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'
),
))
;
}
DemandController.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
字段显示数据库中所有可用的用户。对于第二部分,管理员可以将需求归因于其他用户。
现在我想在小部件 demand.applicant
中为具有 ROLE_USER
的用户强制一个值 app.user.username
。
我的建议:像这样在 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
]
);
}
然后在控制器中,您可以将管理标志传递给 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 %}