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

AJAX Discussion :

Appel ajax avec url rewriting


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut Appel ajax avec url rewriting
    Bonjour,

    J'ai détecté un problème lié semble t-il à l'URL Rewriting dans ma tentative de programmer des listes déroulantes liées.

    Dans la partie html, j'ai ceci :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name="diplomeEnsfeaSpecialisation" onchange="restreindreOption(this.value);">

    Sur sélection dans la liste, ma fonction est bien appelée puisqu'un simple alert('coucou') fonctionne.

    Si je mets l'ajax qui suit, ça fonctionne et il me dit bien coucou :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	function restreindreOption(specialisation)
    {
        $.ajax({
    		type: 'POST',
    		url: '[chemin/vers/le/fichier/]aj_restreindre_option.php',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			/*$('#diplomeEnsfeaOption').html(liste_options); */
    			alert('coucou');
    		}
    	});
    }

    Pour tester, j'ai mis seulement ceci dans aj_restreindre_option.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'appel ajax réussi';

    Mais si je remplace le alert('coucou') par ceci, j'obtiens dans la boîte le code HTML de ma page avec un message d'erreur donné par mon programme :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		success: function(liste_options)
    		{
    			/*$('#diplomeEnsfeaOption').html(liste_options); */
    			alert(liste_options);
    		}

    Message d'erreur de mon programme renvoyé dans la page HTML :
    <div id="contenu">
    <div id="error_msg">
    ERREUR !<br />
    L'action demandée n'existe pas ! </div>

    </div><!-- Fin contenu -->


    La page où se trouve la liste déroulante est http://localhost/pef/fr/Inscription/ajouter. L'URL est parsée par le .htaccess afin de passer les paramètres suivants :
    $_REQUEST :

    Array
    (
    [langue] => fr
    [module] => Inscription
    [action] => ajouter
    )

    Les paramètres sont interprétés par mon programme pour chercher le fichier ajouter.php dans l'arborescence de l'application.

    J'ai placé le fichier aj_restreindre_option.php au même endroit que ajouter.php.

    Le alert(liste_options) donne, au début de son retour, ceci, résultant de l'affichage de $_REQUEST dans l'index.php appelé par l'URL Rewriting :

    Request_uri : /pef/fr/Inscription/application/module/Inscription/Controller/aj_restreindre_option.php<br />$_REQUEST : <pre>Array
    (
    [langue] => fr
    [module] => Inscription
    [action] => application
    [param] => module/Inscription/Controller/aj_restreindre_option.php
    [specialisation] => 5
    )
    </pre>
    Comment puis-je éviter cela ?

    Pour info, voici mon .htaccess :
    RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z]+)/(.+)$ index.php?langue=$1&module=$2&action=$3&param=$4 [L]
    RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z]+)$ index.php?langue=$1&module=$2&action=$3 [L]
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    J'ai essayé d'ajouter en premier dans le .htaccess la règle suivante mais sans succès quant à mon problème :
    RewriteRule ^([a-zA-Z/]+)(aj_[a-zA-Z_]+)(.php)$ application/ajax/$2.php [L]
    L'idée est de dire à Apache d'appeler directement le fichier application/ajax/aj_quelque_chose.php si l'URL est de la forme quelque/chose/aj_quelque_chose.

    J'ai bien sûr déplacé mon fichier aj_restreindre_options.php dans application/ajax/ !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 647
    Par défaut
    la fonction AJAX lance une requête HTTP comme le ferait le navigateur
    donc si la requête http://localhost/pef/fr/Inscription/ajouter fonctionne, l'appel AJAX devrait plutôt contenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "ajax" : "http://localhost/pef/fr/Inscription/aj_restreindre_option"

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    J'ai essayé (en remettant le fichier aj_restreindre_options.php dans le contrôleur) mais pas de résultat et erreur 404 dans l'outil de développement de Firefox.

    Reprenons...
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'aj_restreindre_option.php',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert('coucou');
    		}
    	});
    }
    => N'affiche rien + erreur 404 dans la console Firefox.

    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'http://localhost/pef/fr/Inscription/aj_restreindre_option',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert('coucou');
    		}
    	});
    }
    => N'affiche rien + erreur 404 dans la console Firefox.

    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'application/module/Inscription/Controleur/aj_restreindre_option.php',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert('coucou');
    		}
    	});
    }
    => Affiche bien coucou.

    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'application/module/Inscription/Controleur/aj_restreindre_option.php',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert(liste_options);
    		}
    	});
    }
    => Affiche ma page complète avec le code d'erreur interne au programme.
    Request_uri : /pef/fr/Inscription/application/module/Inscription/Controleur/aj_restreindre_option.php<br />$_REQUEST : <pre>Array
    (
    [langue] => fr
    [module] => Inscription
    [action] => application
    [param] => module/Inscription/Controleur/aj_restreindre_option.php
    [specialisation] => 40
    )
    </pre><!DOCTYPE html>
    <html>
    <head>

    ...

    <div id="contenu">
    <div id="error_msg">
    ERREUR !<br />
    L'action demandée n'existe pas ! </div>

    </div><!-- Fin contenu -->
    L'URL rewriting considère que l'action est "application", ce qui est évidemment faux. Le chemin vers le fichier a été ajouté au début de l'url /pef/fr/Inscription/.

    J'essaie alors de ne mettre que l'action :
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'aj_restreindre_option',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert('coucou');
    		}
    	});
    }
    => => N'affiche rien + erreur 404 dans la console Firefox.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Je progresse !

    J'avais un léger problème de syntaxe entre mon action aj_restreindre_options et mon programme aj_restreindre_option.php (option au pluriel <=> singulier).
    J'ai aussi modifié mes rewrite rules pour qu'elles prennent en compte la présence de l'underscore car elles n'acceptaient que des lettres.

    Voilà donc où j'en suis :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function restreindreOption(specialisation)
    {
    	$.ajax({
    		type: 'POST',
    		url: 'http://localhost/pef/fr/Inscription/aj_restreindre_options',
    		data: 'specialisation='+specialisation,
    		dataType: 'text',
    		cache: 'false',
    		success: function(liste_options)
    		{
    			alert(liste_options);
    		}
    	});
    }

    Le programme aj_restreindre_options.php placé dans le répertoire Controller du module :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Récupération de la spécialisation sélectionnée par l'utilisateur (vient de la fct javascript restreindreOption(specialisation)
    $idSpecialisation = intval($_POST['specialisation']); 
     
    // TODO Test à supprimer
    echo 'Spécialisation sélectionnée : '.$idSpecialisation;
    exit;
    => Le exit; est important pour ne pas avoir le texte de toute la page html puisque le progamme ajax n'est pas appelé directement mais via le cheminement de mon enchaînement de programmes à travers le contrôleur, avec génération de la page à la fin.

    Et là j'ai bien la boîte de dialogue qui m'affiche : Spécialisation sélectionnée : 38

    Reste maintenant à remplacer les options de l'autre liste à l'aide de ce que j'interroge en BDD.

    Je passe en résolu et j'ouvrirai une autre discussion si j'ai des soucis avec cette étape.

    EDIT : Pas besoin d'autre discussion, ça fonctionne.
    Je ferai un petit billet de blog là dessus plus tard.

    EDIT 2 : J'ai finalement ajouté une RewriteRule dans mon .htaccess pour que l'URL appelée en Ajax ne passe pas par le filtre index.php qui renvoie sur le contrôleur du module qui appelle le fichier PHP de l'action aj_restreindre_options :
    RewriteRule ^([a-zA-Z\/]+)\/(aj_)([a-zA-Z_]+)$ application/ajax/aj_$3.php [L]
    RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)\/([a-zA-Z_]+)\/(.+)$ index.php?langue=$1&module=$2&action=$3&param=$4 [L]
    RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)\/([a-zA-Z_]+)$ index.php?langue=$1&module=$2&action=$3 [L]
    Ainsi, tous mes fichiers ajax seront bien rangés au même endroit et pas répartis dans les contrôleurs des modules.

    EDIT 3 : Billet de blog publié. Pourquoi remettre à plus tard ce qu'on peut faire tout de suite tant que c'est frais dans la tête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 647
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    EDIT 3 : Billet de blog publié. Pourquoi remettre à plus tard ce qu'on peut faire tout de suite tant que c'est frais dans la tête ?
    je viens de lire l'article et je n'avais pas compris qu'avec la règle par défaut, le contenu HTML est généré autour de la réponse.
    et donc je pense aussi qu'une nouvelle règle de réécriture est le plus logique pour traiter ces requêtes AJAX

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

Discussions similaires

  1. récupérer nom de produits de ma base avec url rewriting
    Par Stéph utilisateur d'acces dans le forum Apache
    Réponses: 4
    Dernier message: 27/02/2009, 18h41
  2. Problème avec url rewriting
    Par queen_pitbull dans le forum Apache
    Réponses: 6
    Dernier message: 22/01/2009, 14h41
  3. [AJAX] Ajax et Url rewriting
    Par csim69 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/01/2009, 21h29
  4. [AJAX] Ajax et URL rewriting
    Par supertino7 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/11/2008, 10h10
  5. Petit souci avec URL Rewriting
    Par jhdscript dans le forum Apache
    Réponses: 6
    Dernier message: 18/06/2008, 09h02

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