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 :

Appel ajax dans une boucle twig


Sujet :

Symfony PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Appel ajax dans une boucle twig
    Bonjour,

    Voilà mon problème:
    Je fais un appel ajax pour passer un statut 0 à un statut 1 (0 = mon article n' est pas prêt, et 1 = mon article est prêt), ça fonctionne mais le statut s' applique à toute ma liste d' articles (il passent tous à 1...) logique tout est dans la boucle. Mais je ne trouve pas comment contourner le problème, je souhaite avoir que l' article que je clique à 1.
    Merci d' avance pour votre aide.
    Voici ma vue twig:
    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
    {% for panier in array %}
            {% for article in panier%}
     
                <a id="envoyer" href="">Click</a>
     
                <div class="col-lg-1 col-sm-1">
                    <script>
                        $("#envoyer").ready(function(){
     
                            $.ajax({
                                url : '{{ path('validArticleNoel', {'articleId': article.id})  }}',
                                type : 'GET'
                            })
                        });
                    </script>
                </div>
     
     
     
                <div class="col-lg-2 col-sm-2">
                    {{ article.article.nom |truncate(20) }}
                </div>
                <div class="col-lg-1 col-sm-1">
                    {{ article.nombre }}
                </div>
                <div class="col-lg-1 col-sm-1">
                    {% if article.quantite %}
                    {{ article.quantite }} kg
                        {% endif %}
                </div>
                <div class="col-lg-2 col-sm-2">
                    {% if article.preparation != 'RAS' %}
                    {{ article.preparation }}
                        {% endif %}
                </div>
                <div class="col-lg-2 col-sm-2">
                    {{ article.remarques }}
                </div>
            </div>
            {% endfor %}
        <hr>
        {% endfor %}

    Mon contrôleur:
    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
    /**
     * Class ValidArticleNoelController
     * @package App\Controller\Noel
     * @Route("validArticleNoel/{articleId}", name="validArticleNoel")
     */
    class ValidArticleNoelController extends AbstractController
    {
        public function __invoke($articleId, Request $request)
        {
            $article = $this
                ->getDoctrine()
                ->getManager()
                ->getRepository(ArticleVendu::class)
                ->find($articleId);
     
            $article->setFait(1);
     
            $manager = $this->getDoctrine()->getManager();
            $manager->persist($article);
            $manager->flush();
     
           // return $this->redirect($_SERVER['HTTP_REFERER']);
        }
    }
    Et une capture de ma vue:
    Nom : Capture d’écran 2020-10-25 à 09.11.03.png
Affichages : 1591
Taille : 64,5 Ko

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Points : 8 499
    Points
    8 499
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                <a id="envoyer" href="">Click</a>
     
                <div class="col-lg-1 col-sm-1">
                    <script>
                        $("#envoyer").ready(function(){
    Tu as le même ID pour tous tes liens "Click", il faudrait personnaliser chacun d'eux, avec l'ID de l'article par exemple.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour, non pourtant dans ma console j ' ai bien chaque id qui est envoyé à tour de rôle et dans ma bdd ils sont bien tous persisté.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Tu ne procède pas de la bonne façon.
    Ton lien devrais contenir l'id qui t'intéresse, par exemple avec un attribut data- :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="envoyer" href="" data-id="{{article.id}}">Click</a>

    Ensuite , il ne faut surtout pas enregistrer un événement de click à chaque tour de boucle , mais plutôt le faire une fois pour tous les éléments concernés à la fin de ta page :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
            $(document).ready(function(){
                    $(document).on('click','.envoyer',function(){ // Sur tous les éléments ayant une class "envoyer"
                        const id = $(this).data('id'); // récupération de l'id courant
                            $.ajax({
                                    url : '{{ path('validArticleNoel', {'articleId': id})  }}',
                                    type : 'GET'
                            })
                    });
            });
    </script>

    J'ai pas fait de jquery depuis longtemps donc la syntaxe est peut être pas exacte , mais l'idée générale est là

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de m'aider.

    J'ai compris le principe, mais je n'arrive pas à récupérer mon id dans data-id="{{article.id}}".
    J'essaie de débuguer en faisant:
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    <script>
                        $(document).click(function ()
                        {
                            alert($(this).data('id'));
                        });
                    </script>

    Mais j'obtiens une variable id vide. Qui pourtant existe bien dans {{ dump(article.id) }}.
    J'ai l'impression que {{ article.id }} n'est pas pris en compte par data-id...

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Dans le code HTML généré est ce que l'attribut à bien une valeur du genre : data-id="12".


    Pourquoi faire un $(document).click(function ()).
    Un événement doit s'attacher sur un élément précis ET avec la méthode on() comme montré dans mon code précédent et non pas sur la totalité du document comme tu le fais.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par nic0145 Voir le message
    J' ai compris le principe, mais je n' arrive pas à récupérer mon id dans data-id="{{article.id}}".
    parce que ton événement click ne cible pas le sélecteur de classe .envoyer mais cible plutôt toute la page. Essaie de reproduire ce qui a été proposé précémment.
    Dans la vue twig:
    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="envoyer" href="" data-id="{{article.id}}">Click</a>
    dans le script JS
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <script type="text/javascript">
            $(document).ready(function(){
                    $(document).on('click','.envoyer',function(){ // Sur tous les éléments ayant une class "envoyer"
                        const id = $(this).data('id'); // récupération de l'id courant
                        alert( id )    
                    });
            });
    </script>

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    C'est ce que j'ai fait en 1er (copié le code).

    Mais quand j'essaye ça j'ai bien mon Id :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <script type="text/javascript">
                        $(document).ready(function(){
                            $(document).on('click','.envoyer',function(){ // Sur tous les éléments ayant une class "envoyer"
                                const id = $(this).data('id'); // récupération de l'id courant
                                //alert( id )
     
                            });
                        });
                    </script>

    Mais avec ça mon Id n'existe pas :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
                        $(document).ready(function(){
                            $(document).on('click','.envoyer',function(){ // Sur tous les éléments ayant une class "envoyer"
                                const id = $(this).data('id'); // récupération de l'id courant
                                $.ajax({
                                    url : '{{ path('validArticleNoel', {'articleId': id})  }}',
                                    type : 'GET'
                                })
                            });
                        });
                    </script>

    J'ai trouvé la solution grâce à vous, merci.
    Voici le code:
    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <a class="envoyer" href="" data-path='{{ path('validArticleNoel', {'articleId': article.id})  }}'>Click</a>
     
                    <script type="text/javascript">
                        $(document).ready(function(){
                            $(document).on('click','.envoyer',function(){ // Sur tous les éléments ayant une class "envoyer"
                                var path = $(this).attr("data-path");
                                $.ajax({
                                    type : 'GET',
                                    url : path
                                })
                            });
                        });
                    </script>

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Mon code marche bien comme je voulais.
    Par contre ma page est rechargé à chaque fois, ce qui me fait remonter tout en haut....

    Je souhaitais rester au même endroit lorsque je clique d' ou l' utilisation d' ajax.

    Comment se fait il qu elle se recharge?

    Je suis parti d' un template déjà fait, est ce que ça peut venir de là?

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    C'est parce que tu n'inhibe pas l'événement du click sur le lien.
    Donc tu traite l'événement puis il se propage et le navigateur suit le lien.

    Il faut donc dire à javascript de stopper la propagation de l'événement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $(document).on('click','.envoyer',function(event){ // Sur tous les éléments ayant une class "envoyer"
        event.preventDefault();
        const id = $(this).data('id'); // récupération de l'id courant
    });

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ok merci mais ca me renvoie une 500, faut il que mon contrôler renvoie quelque chose du coup?

    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
    /**
     * Class ValidArticleNoelController
     * @package App\Controller\Noel
     * @Route("validArticleNoel/{articleId}", name="validArticleNoel")
     */
    class ValidArticleNoelController extends AbstractController
    {
        public function __invoke($articleId, Request $request)
        {
            $article = $this
                ->getDoctrine()
                ->getManager()
                ->getRepository(ArticleVendu::class)
                ->find($articleId);
     
            if ($article->IsFait() == 0) {
                $article->setFait(1);
            }
            else{
                $article->setFait(0);
            }
     
            $manager = $this->getDoctrine()->getManager();
            $manager->persist($article);
            $manager->flush();
     
        }
    }
    Si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->redirect($_SERVER['HTTP_REFERER']);
    J' obtient bien un code 200. Mais mon résultat n' est pas rafraichi.

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

Discussions similaires

  1. [AJAX] AJAX dans une boucle
    Par Eric5031 dans le forum AJAX
    Réponses: 3
    Dernier message: 15/04/2015, 10h35
  2. [AJAX] Liste liée Ajax dans une boucle For en php
    Par milo1986 dans le forum AJAX
    Réponses: 6
    Dernier message: 23/11/2012, 06h48
  3. [AJAX] Appel Ajax dans une boucle Php
    Par mycha25 dans le forum AJAX
    Réponses: 1
    Dernier message: 30/03/2012, 12h33
  4. [XL-2002] Appel macro dans une boucle
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/02/2010, 14h51
  5. Réponses: 3
    Dernier message: 25/11/2008, 17h01

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