GraffitiX Index du Forum

 
 Sujets suivisSujets suivis   FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

PHP : reconstruire les URL erronées

 
Poster un nouveau sujet   Répondre au sujet    GraffitiX Index du Forum -> Créer et gérer son site
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
jjardoino
Site Admin


Inscrit le: 14 Fév 2005
Messages: 3198
Localisation: Paris

MessagePosté le: Mar 05 Sep 2006 12:56    Sujet du message: PHP : reconstruire les URL erronées Répondre en citant

Hier, je vous parlais de la récupération de l'URL demandée par un visiteur, qui peut être utile pour la page d'erreur 404, par exemple, mais aussi si vous voulez indiquer à un visiteur la bonne URL à conserver dans le cas où, venant d'un moteur de recherche par exemple, l'URL demandée n'a pas le même format que celles que vous utilisez.

Par exemple, sur GraffitiX j'utilise des adresses de type "domaine/index.php?pg=valeur1&var=valeur2". Dans ce cas, deux variables sont transmises, d'abord la page à afficher puis le contenu que doit avoir une variable que le PHP de cette page va traiter. Google peut référencer mes pages sous la forme ci-dessus, mais aussi sous le format "domaine/chemin/page.php?var=valeur2". Et, d'ailleurs, dans ce dernier cas, la page se charge seule sans l'index et sans le menu.

C'est pourquoi j'avais cherché la méthode qui permettait de retrouver l'adresse de type "index.php?pg=", pour que le visiteur puisse recharger la même page dans le contexte du site. Vous avez sûrement organisé votre site autrement, mais ce qui suit peut aisément être adapté quand vous en avez compris le principe.

Voici le code (les commentaires viendront ensuite) :

   $requete = getenv ("REQUEST_URI");

   $path_array = explode ("/", $requete);
   $nombre_slashs = count ($path_array);
   $fichier_et_vars = $path_array[$nombre_slashs - 1];

   $explosion = explode ("?", $fichier_et_vars);
   $fichier_seul = $explosion[0];
   if ($explosion[1] != "")
      $vars = "&".$explosion[1];

   include ("CherchePage.php");

   reset ($site_array);
   while (list ($cle, $valeur) = each ($site_array))
   {
      if (strcmp ($fichier_seul, $valeur) == 0)
      {
         break;
      }
   }

   $varphp_finale = "?pg=".$cle.$varphp;
   $url_finale = "http://www.graffitix.fr/index.php".$varphp_finale.">";


Bon, passons aux explications. J'ai séparé le code en plusieurs "paragraphes" pour que le commentaire de chaque étape soit plus clair.

• D'abord on récupère la partie chemin et fichier de l'URL demandée par le visiteur (le lien qu'il a utilisé). Dans la majorité des cas, c'est "REQUEST_URI" mais il peut y avoir des exceptions si vous travaillez un code similaire pour une page 404 (voir l'article d'hier). Il n'y a pas à extraire le nom de domaine puisque "REQUEST_URI" ne renvoie que la partie chemin, fichier et variables éventuelles.

• Ensuite, deuxième groupe d'instructions. La fonction explode() permet de séparer une chaîne en plusieurs parties stockées dans les éléments d'un tableau. On utilise "/" comme séparateur, et le nom de fichier sera stocké dans le dernier élément. Mais, pour le désigner, il faut connaître le nombre d'éléments et c'est le rôle de la fonction count(). Pour l'instant, on obtient le nom de fichier accompagné d'éventuelles variables passées.

• Passons au troisième groupe d'instructions. Il s'agit simplement d'obtenir séparément le nom de fichier et le groupe de variables.

Dans l'exemple, la valeur de la variable $vars commence par "&". Curieux, penserez-vous, car l'ajout des variables dans l'URL commence plutôt par "?". C'est parce que, sur GraffitiX, les URL qui doivent être corrigées ne sont jamais de type "index.php?pg=". Et c'est toujours la deuxième variable et les suivantes qui sont récupérées dans $explosion[1]. Mais, si votre site est organisé différemment, vous aurez peut-être besoin d'ajouter plutôt "?" en début de chaîne, ou bien d'ajouter un test qui va déterminer dans quels cas on ajoute "?" et dans quels cas on ajoute "&".

• Le quatrième groupe ne contient qu'une seule instruction. Dans un fichier est stocké le moyen de mettre en relation le nom de fichier seul avec son chemin ou (comme dans le cas de GraffitiX, la variable qui suffit à désigner le chemin correct et le fichier). Le nom de fichier à inclure est évidemment arbitraire (tout comme les noms choisis pour les variables) et n'a qu'un but explicite.

Chez moi, il contient un tableau avec des éléments dont les clés sont les variables de pages de GraffitiX (GNews, MApp...) et dont les valeurs correspondantes sont les noms de fichiers. Il ne restera plus qu'à comparer le nom de fichier trouvé par le code ci-dessus et le contenu du tableau afin de déterminer la variable de page.

Un tableau dont chaque élément contient une clé et une valeur s'écrit ainsi :
array = ("clé1"=>"valeur1", "clé2"=>"valeur2", "clé3"=>"valeur3", ...)

Mais rien n'interdit, pour plus de lisibilité quand vous devez l'éditer, de l'écrire ainsi :
array = (
"clé1"=>"valeur1",
"clé2"=>"valeur2",
"clé3"=>"valeur3",
...
)
car les espaces et fins de paragraphes n'ont aucune incidence. Le tout est de respecter la syntaxe. Et les quotes ne sont évidemment nécessaires que si clé ou valeur contient du texte.

• Donc on inclut le fichier qui contient le tableau (le tableau, dans l'exemple, est nommé $site_array) et nous passons au cinquième groupe. Ces instructions vont explorer le tableau et renvoyer la clé qui correspond à la valeur qui est équivalente au nom de fichier donné en comparaison. Ce sont des instructions classiques (on les trouve dans tous les manuels).

On commence par un reset du tableau pour être certain que la lecture commence par le début, puis la boucle explore le tableau, avec l'appel de la fonction strcmp() (qui renvoit 0 si les chaînes sont égales) à chaque itération, jusqu'à ce qu'une valeur soit repérée comme équivalente au nom de fichier. Quand c'est le cas, la boucle est quittée et la variable $cle contient la dernière chaîne lue, et c'est la bonne.

• Il ne reste plus, dans le sixième groupe d'instructions, qu'à reconstituer l'URL en fonction de celles que vous utilisez pour votre site. Dans cet exemple, le code correspond au format des URL de GraffitiX.


J'espère avoir été clair. Ce n'est pas facile d'expliquer ce genre de choses, et je ne peux pas expliquer la moindre instruction PHP, sinon le pavé deviendrait indigeste autant pour le confort de lecture que pour l'assimilation du principe.

On peut évidemment chercher, dans un bon manuel, les pages qui donnent les différentes étapes de cet exemple. Mais ils ne sont pas forcément mis en rapport les uns avec les autres, puisque souvent expliqués et illustrés dans des sections différentes des manuels.

J'ai pris l'exemple de cette procédure car, quand on met au point un site avec du PHP, on peut avoir besoin de cette fonction. Si on est champion, on peut avoir trouvé le moyen d'associer tout cela en très peu de temps. Mais si on se situe plutôt dans la moyenne comme moi (du moins je l'espère), on peut y passer des heures, voire des jours, avant que ça fonctionne correctement.

L'essentiel, en détaillant le principe et ses étapes, était de permettre aux visiteurs de gagner du temps. Ceux qui auront besoin de ces instructions en passeront suffisamment pour les adapter à leur site sans qu'il soit nécessaire de les contraindre à toujours réinventer la roue.
_________________
Jean-Jacques Ardoino
Si vous voulez aider GraffitiX...
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    GraffitiX Index du Forum -> Créer et gérer son site Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com