簡體   English   中英

來自 AJAX 渲染的 Symfony 表單驗證

[英]Symfony form validation from an AJAX render

我是 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 處理所有事情嗎? 謝謝你的時間 !

您應該使用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()之間添加它們isSumbmitted() 文檔

我給你留下了一些可能有幫助的文檔。

處理請求

驗證

表單本身的驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM