symfony4 - 仅当我的用户拥有角色时才在表单中设置默认值: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
。
解决方案
我的建议:在 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 %}
推荐阅读
- java - 没有 JDBC 类型的方言映射:-155
- angular - 如何在 Angular 单元测试中设置当前路由
- javascript - 检测未知设备以提醒用户的最佳方法
- azure - Azure SDK 帮助:如何获取有关用户最后访问的服务的信息?
- firebase - 无论如何,是否可以在 Google Analytics 中查看我从 Firebase 应用程序记录的(自定义)事件?
- amazon-web-services - 应用程序负载均衡器使用 Cognito 内部 500 错误进行身份验证
- javascript - 是否可以在 instagram 应用程序之外的 instagram 浏览器中打开网址?
- excel - 如果使用复制/粘贴插入,使用宏找到的值不会被替换
- javascript - 网页更改 url 后,开发工具中的 Javascript 片段似乎无法执行
- c++ - 如何在 C++Builder 中制作具有全文搜索自动完成支持的 ComboBox?