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 :

Requête Ajax avec fetch concaténe induement les routes !


Sujet :

Symfony PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut Requête Ajax avec fetch concaténe induement les routes !
    Bonjour à tous,

    Quelqu'un saurait-il me dire pour quelle raison le fetch contenu dans le code ci-dessous concatène 2 routes au lieu de se contenter de celle que je lui demande ?

    Par exemple pour un acompte la reqûete envoyée par fetch va concaténer la route de la page actuelle à celle spécifiée par le controller AcomptesController, cela donne :

    "admin/ecritures/modifier-ecriture/acomptes/acomptes-ecriture" alors que la route correcte est simplement "admin/acomptes/acomptes-ecriture/+ numéro écriture"...

    Je ne sais pas si c'est moi qui fait une bourde mais je ne comprends pas pourquoi ce phénomène se produit surtout qu'il existe un controller pour les écritures et un autre pour les acomptes, lignes, avoirs etc...

    Le but étant de présenter les infos dans des onglets pour alléger les requêtes à l'instant T...

    A noter que si je rentre la bonne adresse manuellement dans le fetch j'ai bien la bonne réponse qui s'affiche dans l'onglet actif... incompréhensible !

    Merci d'avance pour vos lumières !!!

    AcomptesController.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Afficher les lignes d'acomptes pour cette écriture + le total d'acomptes en Ajax
        #[Route('acomptes-ecriture/{id}', name: 'acomptes-ecriture')]
        public function acomptesEcriture(Ecritures $ecritures, AcomptesRepository $acomptesRepository, $id): Response
        {
            $lignes = $acomptesRepository->findBy(['liaison' => $id], ['date_acompte' => 'desc']);
     
            $idEcriture = $ecritures->getId();
     
            $totalAcomptes = $ecritures->getTotalAcomptesEcriture();
     
            return new JsonResponse([
                'content' => $this->renderView('_partials/_acomptes-ecriture.html.twig', compact('lignes', 'totalAcomptes', 'idEcriture'))
            ]);
        }
    TabsEcriture.js :

    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
    window.onload = () => {
      const tabContent = document.querySelector(".tabs__content");
      const radButtons = document.querySelectorAll(".tabs__radio");
     
      radButtons.forEach((rb) =>
        rb.addEventListener("change", (e) => {
          let url = "";
          switch (e.target.id) {
            case "lignes":
              url = "lignes-ecriture";
              break;
     
            case "acomptes":
              url = "acomptes-ecriture";
              break;
     
            case "avoirs":
              url = "avoirs-ecriture";
              break;
            default:
              return;
          }
          fetch(url, {
            method: "GET",
            headers: {
              "X-Requested-With": "XMLHttpRequest",
              "Content-Type": "Application/json",
            },
          })
            .then((response) => response.json())
            .then((data) => {
              tabContent.innerHTML = data.content;
            })
            .catch((error) => alert("Erreur : " + error));
        })
      );
    };

  2. #2
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 429
    Par défaut
    Bonjour,

    L'URL renseignée est une URL relative.

    Renseigne une URL absolue en commençant par un / initial : url = "/admin/acomptes/acomptes-ecriture";

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Merci Pytet, c'était bien le manque de "/" qui provoquait l'erreur ...

    Maintenant je bute sur comment récupérer en JS la valeur de la variable idEcriture que j'envoie depuis le controller car je pense qu'on en a besoin pour ajouter à la fin de la route spécifiée dans le fetch ...

    Pour l'instant je rentre un numéro à la main et ça renvoie bien les bonnes infos...

    Merci de ton aide

  4. #4
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 429
    Par défaut
    Dans la vue où tu génères les input radio, tu peux stocker l'identifiant dans un attribut html data-id de l'input puis le récupérer en js juste avant de faire la requête via fetch :
    https://symfony.com/doc/current/fron...rver-data.html

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Merci mille fois, tout marche à merveille !

    Grâce à vos conseils

    Voici ce que j'ai fait :

    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
    {% block body %}
    	{% set idEcriture = formEcritures.vars.value.id %}
     
    	<div class="tabs">
    		<input type="radio" class="tabs__radio" name="tabs-ecriture" id="lignes" checked data-url="{{path('ecritures_lignes-ecriture',{id:idEcriture})}}">
    		<label for="lignes">Détails</label>
     
    		<input type="radio" class="tabs__radio" name="tabs-ecriture" id="acomptes" data-url="{{path('acomptes_acomptes-ecriture',{id:idEcriture})}}">
    		<label for="lignes">Réglements</label>
     
    		{% if formEcritures.vars.value.typedocument =="Facture" %}{
     
    			<input type="radio" class="tabs__radio" name="tabs-ecriture" id="avoirs" data-url="{{path('avoirs_avoirs-facture',{id:idEcriture})}}">
    			<label for="lignes">Avoirs</label>
     
    			}
     
    		{% endif %}
    	</div>
     
    	{% autoescape 'js' %}
    		<div class="tabs__content"></div>
    	{% endautoescape %}
     
    	{% block javascripts %}
    		<script src={{asset('assets/js/TabsEcritures.js')}} type="text/javascript" defer></script>
    	{% endblock %}
    {% endblock %}
    puis en JS :

    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
    window.onload = () => {
      const tabContent = document.querySelector(".tabs__content");
      const radButtons = document.querySelectorAll(".tabs__radio");
     
      radButtons.forEach((rb) =>
        rb.addEventListener("change", (e) => {
          const url = e.target.dataset.url;
     
          fetch(url, {
            method: "GET",
            headers: {
              "X-Requested-With": "XMLHttpRequest",
              "Content-Type": "Application/json",
            },
          })
            .then((response) => response.json())
            .then((data) => {
              tabContent.innerHTML = data.content;
            })
            .catch((error) => alert("Erreur : " + error));
        })
      );
    };

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

Discussions similaires

  1. Class poo : Requête AJAX avec les promises
    Par Smlh.dev dans le forum AJAX
    Réponses: 2
    Dernier message: 09/05/2020, 12h14
  2. Encoder l'url lors d'une requête ajax avec IE
    Par Tristan Zwingelstein dans le forum jQuery
    Réponses: 1
    Dernier message: 28/12/2009, 10h39
  3. [Dojo] Requête AJAX avec paramètre avec DOJO
    Par Tavarez59 dans le forum Bibliothèques & Frameworks
    Réponses: 10
    Dernier message: 19/06/2009, 13h50
  4. [JQuery] Requête ajax avec jQuery
    Par ApheX2 dans le forum jQuery
    Réponses: 3
    Dernier message: 28/08/2008, 22h40
  5. [MooTools] requête ajax avec Mootools
    Par oneTime dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 14/04/2008, 10h50

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