0

I'm new to symfony, I render forms throughout a JSON so whenever I click on an icon it shows different forms (to change firstname, lastname...). I return thoses forms as a 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(),
            ]),
        ]
    );
}

Here is how I display this :

    $('#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'])
            }
        }
    })
});

The problem now is that I don't know how to handle thoses forms from another controller and validate it with the constraints I set on my entity User this is how I validate :

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');
            }
        }

Is that a good method? should I handle everything with ajax ? Thanks for your time !

ben-ju1
  • 11
  • 5

1 Answers1

0

You should use the handlerequest which automatically sets the values in the form to the entity added to it once the form has been submitted.

$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;

Once handled you just need to return an ok response, or return the form back to the view if something has gone wrong.

If I remember well, the asserts set on the entity are also automatically processed with the handleRequest(), it depends on how you declared them.

Yo can also add other errors after the submit, just add them between the isSumbmitted() and isValid(). Documentation

I leave you here some documentation that may help.

Handle request

Validation

Validation in the form itself

alexcm
  • 171
  • 1
  • 4
  • 12