【问题标题】:Symfony 4 - Can't access form dataSymfony 4 - 无法访问表单数据
【发布时间】:2020-02-06 21:46:04
【问题描述】:

我有点担心 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 %}

还有模式:

{%- 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() 对象但为空。没有考虑提交的内容

【问题讨论】:

  • 嗨!你检查调试器是否有一些表单错误?
  • 您好,请问如何检查调试器?我是初学者
  • 没问题 ;) 检查这个symfony.com/doc/current/profiler.html,在左上角你可以访问所有请求,检查你感兴趣的请求
  • 嗯,所以我必须附加 Debug::enable();在我的功能中?如果是这样,我在调试中对我的问题一无所知:s
  • 感谢您的帮助,我的问题已解决:)

标签: php forms symfony controller


【解决方案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

仍然必须将您的删除 &lt;a&gt; 更改为 &lt;button&gt;。 (或捕获单击以将表单提交到不同的 url)

【讨论】:

  • 感谢您的回答!伟大的 !她真的把虫子放在了我的耳朵里!错误实际上是我的宏,我在其中错误地声明了我的表单(实际上我有一个以前的宏的复制/粘贴,我忘记考虑到它是一个表单)。现在一切正常!回答您的问题:路径中的 {id} 是我要删除的组。事实上,我有一个组列表,我可以删除它们(所以我需要在我要删除的组的路径中找到它)。但是当涉及到默认组时,我必须在删除之前选择一个新的默认组,就是这样:) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多