我有点担心Symfony 4上的表格!实际上,我有一个显示组的页面。在这些组中,有一个是默认组。我有权删除群组。但是,如果我决定删除默认组,则会有一个模态窗口,要求我同时选择一个新的默认组。那是上下文放置。现在,我将陈述问题^^ 因此,我创建了自己的表单,该表单除了必须包含默认组外,还将包含所有组的列表
表单(DeleteDefaultGroupeType):
class DeleteDefaultGroupeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('defaultGroupeValidateurs', ChoiceType::class, [
'label' => "Service par défaut",
'placeholder' => "Sélectionnez un service",
'choices' => $options['groupeValidateursService']->getNotDefaultGroups(),
'choice_label' => function ($choice, $key, $value) {
return $choice->getNom();
}
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => ParametresAdmin::class,
'groupeValidateursService' => GroupeValidateursService::class,
]);
}
}
在控制器的index()函数中,我初始化此表单并将其作为参数发送到我的视图。然后在我看来,如果要删除默认组,我会启动一个模态窗口。这样很好,我有了模态窗口,窗体的形式允许我默认选择一个新组!
控制器(索引功能):
$formDeleteDefaultGroupe = $this->createForm(DeleteDefaultGroupeType::class, $parametresAdmin, [
"groupeValidateursService" => $this->groupeValidateursService
]);
$formDeleteDefaultGroupe->handleRequest($request);
在我的 Twig 视图中,插入模式:
<button class="btn close" data-target="#deleteModal{{groupe.id}}" data-toggle="modal" type="button">
<span aria-hidden="true">×</span>
</button>
{% if groupe == parametresAdmin.defaultGroupeValidateurs %}
{{ macro.replace_default_group(
'deleteModal'~groupe.id,
'Delete group ?',
formDeleteDefaultGroupe,
path('admin_validation_delete',{'id': groupe.id}))
}}
{% else %}
还有Modale:
{%- macro replace_default_group(id, body, form, deleteLink) -%}
{% filter spaceless %}
<div id="{{ id }}" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
{{form_start(form)}}
<div class="modal-header">
<h4 class="modal-title">Supprimer?</h4>
<button class="close" data-dismiss="modal" type="button">×</button>
</div>
<div class="modal-body">
<p>{{ body }}</p>
{{form_widget(form)}}
</div>
<div class="modal-footer">
<a href="{{ deleteLink }}" class="btn btn-primary">Supprimer</a>
<button class="btn btn-secondary" data-dismiss="modal" type="button">Annuler</button>
</div>
{{form_end(form)}}
</div>
</div>
</div>
{% endfilter %}
{%- endmacro -%}
因此,表单的动作将在控制器的deleteGroupe()函数上。他将把他作为必须删除的组的参数来摇摆。该变量是函数中的groupValidators $ groupValidators。因此,在我的控制器中,我重新初始化了表格,使我可以选择一个新组。如果已提交,则意味着我尝试删除默认组,因此我们必须应用更改。因此,我必须恢复表单中提交的内容,即将新的组作为默认组
/**
* Suppression d'un groupe de validateurs et transfert des demandes
* en attentes des utilisateurs vers le groupe par défaut
*
* @Route("/admin/validation/delete/{id}", name="admin_validation_delete")
*
* @param GroupeValidateurs $groupeValidateurs
* @return void
*/
public function deleteGroupe(Request $request, GroupeValidateurs $groupeValidateurs)
{
$form = $this->createForm(DeleteDefaultGroupeType::class, new ParametresAdmin(), [
"groupeValidateursService" => $this->groupeValidateursService,
]);
$form->handleRequest($request);
dump($form->getData());
if ($form->isSubmitted() && $form->isValid()) {
$newDefaultGroupe = $form->getData();
dd($newDefaultGroupe);
//Et là je modifie le groupe par défaut
}
dd('fin');
//Et ici je supprime le groupe que je veux supprimer
$this->groupeValidateursService->removeGroup($groupeValidateurs);
return $this->redirectToRoute("admin_validation_index");
}
奇怪的是,它不会进入isSubmitted && isValid中。而且,如果我在要查看的条件之外制作了一个$ form-> getData(),那么我碰巧得到了ParametresAdmin()对象,但它为null。未考虑提交的内容
答案 0 :(得分:1)
除非另有说明,否则表单组件希望通过POST请求提交表单数据。 form_start(form)
调用将创建该文件。但是,它将使用创建它的页面的路由来创建它。您以某种方式想出了办法,必须为表单提供正确的url,但只需将其放在链接中即可。
另一方面,通常来说,链接是默认情况下的GET请求(除非您窃取了激活事件并以某种方式创建了POST请求)。因此,您对删除页面的请求只是一个GET请求,因此没有数据。
在这一点上可能有很多事情:
我不确定,是否可以在模板中完成此操作,但是可能可以做到:
{{form_start(form, {action: deleteLink})}}
否则,或者我认为更好(!!!),因为删除表单应该始终由正确的控制器处理:
$formDeleteDefaultGroupe = $this->createForm(
DeleteDefaultGroupeType::class, $parametresAdmin, [
"groupeValidateursService" => $this->groupeValidateursService,
"action" => $this->generateUrl('admin_validation_delete', [
"id" => $defaultGroupe->getId(), // <-- change to proper $var/func()
]),
]);
此处的注释:路径中为什么有{id}
?据我所知,控制器功能当然不需要它。
然后您要做的就是将删除按钮更改为实际按钮
<button type="submit" class="btn btn-primary">Supprimer</button>
从理论上讲,您可以将表单的方法更改为GET(在您的deleteGroupe
函数中-很好的混合语言),这将导致表单随后在GET请求上触发。我不太喜欢,tbh。但是它的工作方式几乎与1完全相同。但是,您无需将action
分配给'GET'
,而是将路径分配给method
。
您仍然必须将删除的<a>
更改为<button>
。 (或捕获将表单提交到其他网址的点击)