[SYMFONY] afficher ou pas un élément si le controller renvoie le form noValid

Résolu/Fermé
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022 - 17 sept. 2021 à 18:00
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022 - 22 sept. 2021 à 15:37
Bonjour,

Je vais essayé d'être le plus clair..

J'ai un controller qui affiche mais édite également les données de l'utilisateur connecté.

Par défaut seulement les infos (dans un card) de l'utilisateur sont affiché sur cette page avec une petite icone dedans qui quand je click dessus m'affiche en dessous (fait avec jquery) la card edit.

-> Quand tout est ok
Quand je click sur l'icone la card edit apparaît je modifie correctement (pour ne pas avoir d'erreur)et je valide. la page charge donc m'envoie sur la page par défaut (cette à dire elle-même) juste la card avec les infos. + un addflash avec un message qui me notifie bien sur cette page en haut 'Profil mise à jour' si le formulaire est bien envoyé et valide.

jusque là ca va..

-> Quand arrive une erreur...
Quand les valeurs ne respect pas mes regex tout est bien notifié comme je l'ai demandé dans le formType idem pour le champ null. le problème c'est qu'il me fait la même chose que quand tout est bon il me renvoie sur la page par defaut et il faut que j'aille clické pour ré affiché la card modifié pour voir les erreurs.

Ce que je voudrais c'est que quand tout est bon tu peux afficher par défaut mais s'il y a une erreur tu me garde la card edit AFFICHE pour que l'on voit directement les erreurs.

donc je vous montre ce que j'ai tenté de faire sans succès...

-essai 1 :
Afficher un addFlash au cas d'erreur l'utilisateur comprendra qu'il y a une erreur et ira ouvrir la card mais ici le message s'affiche mes plus les erreurs sous les inputs

Mon controller :
/**
 * @Route("/profil")
 */
class UserController extends AbstractController
{
    /**
     * @Route("", name="app_profil_user")
     */
    public function profil(Request $request, EntityManagerInterface $manager): Response
    {
        $user = $this->getUser(); // $this->getUser() récupère l'utilisateur actuellement connecté
        $form = $this->createForm(EditProfilType::class, $user); 
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {

            $manager->persist($user);
            $manager->flush();
            $this->addFlash('success', 'Profil mis à jour !');
            return $this->redirectToRoute('app_profil_user');  
        }
        elseif($form->isSubmitted() && !$form->isValid()) {

            $this->addFlash('danger', 'Une erreur est survenue lors de l\'envoi du formulaire.');
            return $this->redirectToRoute('app_profil_user'); 
        }

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

-essai 2 :
J'ai voulu passer une variable $error = false dans le if($form->isSubmitted() && $form->isValid()) et sinon $error = true

donc dans mon template je lui dis si error == false ma card edit peut être en display:none
sinon ma card je n'ajoute pas de display:none ce qui devrais l'afficher

Le problème ici c'est la card reste tout le temps affiché même au chargement de la page.
Mon controller :
/**
 * @Route("/profil")
 */
class UserController extends AbstractController
{
    /**
     * @Route("", name="app_profil_user")
     */
    public function profil(Request $request, EntityManagerInterface $manager): Response
    {
        $user = $this->getUser(); // $this->getUser() récupère l'utilisateur actuellement connecté
        $form = $this->createForm(EditProfilType::class, $user); 
        $form->handleRequest($request);
        $error = ' ';  // $error = false par defaut aussi n'a rien donné

        if($form->isSubmitted() && $form->isValid()) {

            $manager->persist($user);
            $manager->flush();

            $error = false;

            $this->addFlash('success', 'Profil mis à jour !');
            return $this->redirectToRoute('app_profil_user');  
        }

        $error = true;

        return $this->render('user/base_profil.html.twig', [
            'form' => $form->createView(),
            'error' => $error
        ]
        
        );
    }


Mon template twig de la card edit:

 {% if error == false %}
    <div class="col-11 card edit" id="EditCard" style="display: none;">
    {% else %}
    <div class="col-11 card edit" id="EditCard">
    {% endif %}


Je n'est plus d'idée ou comment résoudre ceci...

S'il vous manque des éléments pour mieux comprendre faite le moi savoir

Merci pour votre aide
Configuration: Windows / Chrome 93.0.4577.63

2 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
21 sept. 2021 à 17:01
Bonjour,

s'il y a une erreur tu me garde la card edit AFFICHE pour que l'on voit directement les erreurs

Si je comprends bien, le soucis vient du fait que la "card edit" n'est par défaut pas affichée sur la page alors que celle-ci devrait s'afficher si une erreur a été faite lors de la saisie du formulaire.

dans mon template je lui dis si error == false ma card edit peut être en display:none
sinon ma card je n'ajoute pas de display:none ce qui devrais l'afficher


Par défaut la card n'est pas affiché, l'ajout d'un display: none pour masquer la card ne semble donc pas nécessaire. Il faudrait plutôt faire l'inverse :
- par défaut la card n'est pas affichée
- si error == true : on affiche la card (éventuellement avec un display: block; ou idéalement en utilisant la même méthode jQuery lors du clic sur l'icone qui affiche la card)
0
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022
Modifié le 22 sept. 2021 à 15:37
Merci !
j'avais en réalité besoin d'un display: block !
parce que par défaut c'est display: none
0