【问题标题】:Symfony form validation from an AJAX render来自 AJAX 渲染的 Symfony 表单验证
【发布时间】:2020-03-17 11:21:43
【问题描述】:

我是 symfony 的新手,我在整个 JSON 中呈现表单,所以每当我点击一个图标时,它会显示不同的表单(更改名字、姓氏...)。 我将这些表单作为 JSON 返回:

    public function profileSettings()
{
    $user = $this->getUser();

    // Formulaire d'informations concernant le compte

    $formAccountSettings = $this->createForm(AccountSettingsType::class, $user, [
        'userEmail' => $user->getEmail(),
        'userUsername' => $user->getUsername(),
    ]);

    // Formulaire d'informations personnel

    $formPersonnalSettings = $this->createForm(PersonnalSettingsType::class, $user, [
        'userFirstname' => $user->getFirstname(),
        'userLastname' => $user->getLastname(),
    ]);

    // Retour en format JSON des 3 requêtes sous tableau

    return $this->json(
        [
            'formAccountSettingsView' =>
                $this->render('user/_accountSettings.html.twig', [
                    'form' => $formAccountSettings->createView(),
                ]),

            'currentUser' => $user,

            'formPersonnalSettingsView' => $this->render('user/_accountSettings.html.twig', [
                'form' => $formPersonnalSettings->createView(),
            ]),
        ]
    );
}

这是我的显示方式:

    $('#settings-user li').on('click', function (e) {
    $.ajax({
        type: 'GET',
        url: "/website-skeleton/public/index.php/json/profile",
        success: function (response) {
            if ($(e.target).hasClass('profile')) {
                $('.display').empty().append(
                    `
                           <p id="welcome">Bonjour, <em><strong>${response['currentUser']['username']}</strong></em> vous êtes enregistré sous le nom de <strong>${response['currentUser']['firstname']} ${response['currentUser']['lastname']}</strong>.
                               <br>
                               Votre adresse email est : <strong>${response['currentUser']['email']}</strong>.
                               <br>
                               Pour modifiez vos informations veuillez cliquez sur le menu de navigation.
                           </p>`);
            } else if ($(e.target).hasClass('security')) {
                $('.display').empty().append(response['formAccountSettingsView']['content']);
            } else if ($(e.target).hasClass('informations')) {
                $('.display').empty().append(response['formPersonnalSettingsView']['content'])
            }
        }
    })
});

现在的问题是我不知道如何处理来自另一个控制器的那些表单并使用我在我的实体 User 上设置的约束对其进行验证,这就是我验证的方式:

public function editCredentials(Request $request, UserPasswordEncoderInterface $encoder)
{
    $user = $this->getUser();

    $formPersonnalSettings = $this->createForm(PersonnalSettingsType::class, $user);

    if ($request->isMethod('POST')) {
        if ($request->request->has('personnal_settings')) {
            if ($formPersonnalSettings->isSubmitted() && $formPersonnalSettings->isValid()) {
                $user->setFirstname($request->request->get('personnal_settings')['firstname']);
                $user->setLastname($request->request->get('personnal_settings')['lastname']);

                $em = $this->getDoctrine()->getManager();
                $em->persist($user);
                $em->flush();
                $this->addFlash('personnal_success', 'Vos informations personnels ont bien été enregistrées !');
                return $this->redirectToRoute('user_profile');
            }
        }

这是一个好方法吗?我应该用 ajax 处理所有事情吗?感谢您的宝贵时间!

【问题讨论】:

    标签: javascript ajax forms symfony validation


    【解决方案1】:

    您应该使用handlerequest,它会在提交表单后自动将表单中的值设置为添加到其中的实体。

    $form = $this->createCreateForm($entity); // private function to create the form
    $form->handleRequest($request);
    
    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $em->persist($entity);
    
            $em->flush();
        }
    }
    
    return $response;
    

    处理后,您只需返回一个 ok 响应,或者如果出现问题,则将表单返回到视图。

    如果我没记错的话,实体上设置的断言也会自动使用handleRequest() 处理,这取决于您如何声明它们。

    你也可以在提交后添加其他错误,只需将它们添加在isSumbmitted()isValid()之间。 Documentation

    我给你留下了一些可能有帮助的文档。

    Handle request

    Validation

    Validation in the form itself

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2015-08-04
      • 2015-05-16
      相关资源
      最近更新 更多