Symfony 4-无法访问表单数据

时间:2019-10-09 14:10:23

标签: php forms symfony controller

我有点担心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">&times;</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">&times;</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。未考虑提交的内容

1 个答案:

答案 0 :(得分:1)

除非另有说明,否则表单组件希望通过POST请求提交表单数据。 form_start(form)调用将创建该文件。但是,它将使用创建它的页面的路由来创建它。您以某种方式想出了办法,必须为表单提供正确的url,但只需将其放在链接中即可。

另一方面,通常来说,链接是默认情况下的GET请求(除非您窃取了激活事件并以某种方式创建了POST请求)。因此,您对删除页面的请求只是一个GET请求,因此没有数据。

在这一点上可能有很多事情:

1。更改表单的action

我不确定,是否可以在模板中完成此操作,但是可能可以做到:

{{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>

2。更改表单的method

从理论上讲,您可以将表单的方法更改为GET(在您的deleteGroupe函数中-很好的混合语言),这将导致表单随后在GET请求上触发。我不太喜欢,tbh。但是它的工作方式几乎与1完全相同。但是,您无需将action分配给'GET',而是将路径分配给method

仍然必须将删除的<a>更改为<button>。 (或捕获将表单提交到其他网址的点击)