IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Mise à jour champs du formulaire


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut Mise à jour champs du formulaire
    Salut à tous,

    Voila, j'ai un form (avec un seul champ 'Content') le form pointe sur la page elle même. Globalement il fonctionne bien mais quand je tape quelque chose et que j'envoie il m'enregistre bien les données pas de problème mais au rechargement de la page il m'affiche ce que je viens d'envoyer dans le champ Content !

    Voici mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        /**
         * @Route("/messages/{id}", name="messages_show", methods={"GET","POST"})
         * 
         * @IsGranted("ROLE_USER")
         */
        public function show(Request $request, User $user): Response
        {
            $message = new Message();
            $message->setAuthor($this->getUser());
            $message->setrecipient($user);
     
            $form = $this->createForm(MessageType::class, $message);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($message);
                $entityManager->flush();
            }
     
            // on marque tous les messages comme lus car l'utilisateur est sur la conversation
            $listeMessages = $this->repository->getMessagesFor($this->getUser()->getId(), $user->getId());
            $entityManager = $this->getDoctrine()->getManager();
     
            foreach ($listeMessages as $msg) {
                // si le destinataire est le même que l'utilisateur connecté alors on ajoute 
                // une date de lecture aux messages qui ne sont pas lu.
                if ($msg->getrecipient()->getId() == $this->getUser()->getId() && $msg->getReadAt() == null) {
                    $msg->setReadAt(new \DateTime());
                }
            }
     
            $entityManager->flush();
     
            return $this->render('message/show.html.twig', [
                'user' => $user,
                'form' => $form->createView(),
                'messages' => $this->repository->getMessagesFor($this->getUser()->getId(), $user->getId())
            ]);
        }
    et la vue :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    {% extends 'base.html.twig' %}
     
    {% block title %}Messages {{ user.firstName }}{% endblock %}
     
    {% block body %}
     
    <div class="container">
        <div class="card">
            <div class="card-header">{{ user.firstName }}</div>
            <div class="card-body">
     
                {% for data in messages %}
     
                <div class="raw">
                    <div class="col-md-10 {{ data.author.id == app.user.id ? 'offset-md-2 text-right' : '' }}">
                        <p>
                            <strong>{{ data.author.id == app.user.id ? 'Moi' : data.author }}</strong><br>
                            {{ data.content|nl2br }}<br>
     
                            {% if data.author.id == app.user.id %}
                                {% if data.readAt != null %}
                                    <small>lu le {{ data.readAt|date('Y-m-d H:i:s') }}</small>
                                {% else %}
                                    <small>non lu</small>
                                {% endif %}
                            {% endif %}
                        </p>
                    </div>
                </div>
     
                <hr>
     
                {% endfor %}
                <h2>Nouveau message :</h2>
     
                {{ form_start(form) }}
                {{ form_row(form.content) }}
                <button class="btn btn-primary">Envoyer</button>
                {{ form_end(form) }}
            </div>
        </div>
    </div>
     
    {% endblock %}

    Quelqu'un a t'il une idée ? J'ai loupé quelque chose ? je vous remercie.

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Oui tu as loupé un détail

    En théorie, quand ton formulaire est soumis et validé, tu enregistres puis tu rediriges vers une autre page ou la même pour éviter ce que tu viens de dire, mais aussi qu'un rechargement de page manuel enregistre deux fois la valeur dans le document.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($message);
        $entityManager->flush();
        return $this->redirectToRoute('nom de la route');
    }
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Je pensais que pour un retour a la même page après envoi du formulaire ce n’était pas utile.

    super, j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->redirectToRoute('messages_show', ['id' => $user->getId()]);
    impeccable ! merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] MACRO mise à jour champs formulaire
    Par rere02 dans le forum Access
    Réponses: 1
    Dernier message: 01/03/2010, 22h47
  2. Réponses: 2
    Dernier message: 13/05/2008, 16h00
  3. Réponses: 1
    Dernier message: 10/04/2008, 16h53
  4. formulaire mise à jour champ texte a partir autre page
    Par laulaurent dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/01/2006, 00h13
  5. Mise à jour champs modifés via formulaire
    Par Al3x dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/01/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo