SELFHTML

Patrick Canterino
Charger un fichier dans un jeu de cadres avec PHP

Page d'information: vue d'ensemble

vers le bas Patrick Canterino
vers le bas Introduction
vers le bas Variante basique
vers le bas Modifier plusieurs cadres
vers le bas Cela marche également avec Perl!
vers le bas Remarques

vers le bas 

Patrick Canterino

E-Mail: Adresse électronique patrick@patshaping.de
URL de la page d'accueil: Page en langue allemande http://www.patshaping.de/

Il s'agit ici d'un article traduit de l'allemand par la rédaction de SELFHTML actuel. Veuillez poser vos questions relatives à cet article uniquement à son auteur, prenant compte que celui-ci ne maîtrise peut-être pas la langue française!

vers le hautvers le bas 

Introduction

Comme il est déjà mentionné dans SELFHTML dans Page d'information: connexion exigée Possibilités d'application judicieuse pour les cadres, les jeux de cadres présentent ce défaut qu'il est impossible de maitriser directement les sous-pages du jeu de cadres. Le visiteur peut bien sûr appeler tout simplement la page correspondante, mais il est alors "coincé" sur cette page, étant donné que la navigation manque.

Quoi de plus simple donc que d'incorporer un petit script dans le jeu de cadres qui permette, de modifier le jeu de cadres par ce qu'on appelle une chaîne de requête (une petite chaîne de caractères accrochée à une URI par un point d'interrogation). Dans cet article, je voudrais démontrer comment vous pouvez le faire grâce à Page d'information: connexion exigée PHP.

Si vous voulez mettre en œuvre une solution basée sur Page d'information: connexion exigée JavaScript (par exemple parce que l'hébergeur de votre page d'accueil ne permet pas PHP ), vous pouvez également utiliser le principe décrit par Martin Wernecke dans son article Seite Charger un fichier dans un jeu de cadres de façon dynamique. Étudiez un peu cet article et vous comprendrez où je veux en venir.
Cette méthode présente l'inconvénient de dépendre du navigateur de votre visiteur, c.à.d. que si le visiteur a désactivé JavaScript, elle ne fonctionne pas.

Si par contre vous êtes plutôt un adepte de Page d'information: connexion exigée Perl, veuillez lire le paragraphe vers le bas Cela marche également avec Perl!. En effet, vous pouvez tout aussi bien le faire avec Perl.

Ne perdez pas de vue que les solutions présentées ici ne constituent pas les solutions, étant donné qu'à vrai dire chaque jeu de cadres est différent. Seules les bases sont présentées ici. Avant tout, les solutions sont très rudimentaires. Veuillez lire pour cette raison également les vers le bas remarques pour voir ce à quoi vous devez veiller entre autre.

vers le hautvers le bas 

Variante basique

La première variante que je voudrais présenter ici peut modifier un cadre. Cela suffit parfaitement dans la plupart des cas.

Ce jeu de cadres tout simple servira de point de départ:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<title>Jeu de cadres</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="gauche.htm" name="gauche">
   <frame src="droite.htm" name="droite">
   <noframes>
   <body>
   <p>Votre navigateur ne gère pas les cadres!</p>
   </body>
   </noframes>
</frameset>
</html>

Il est constitué d'un cadre gauche et d'un cadre droit. Dans le cadre gauche se trouve la navigation et dans le cadre droit les textes etc...

L'objectif est maintenant de modifier le cadre droit par une chaîne de requête. L'adresse correspondante aurait alors cet aspect:

http://www.mespages.fr/mondossier/?nouvellepage

La chaîne de requête change donc le fichier d'origine du cadre droit dans l'index du répertoire mondossier et le remplace par nouvellepage.
Le script PHP doit donc lire la chaîne de requête et modifier en conséquence la définition du jeu de cadres. Le script PHP pourrait alors avoir cet aspect:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<title>Jeu de cadres</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="gauche.htm" name="gauche">
   <?php
   $arg = $_SERVER['QUERY_STRING'];

   if($arg == "") $arg = "droite.htm";

   print "<frame src=\"$arg\" name=\"droite\">";
   ?>

   <noframes>
   <body>
   <p>Votre navigateur ne gère pas les cadres!</p>
   </body>
   </noframes>
</frameset>
</html>

Explication:

Le script PHP copie dans un premier temps la chaîne de requête dans la variable $arg, afin de faciliter le travail ultérieurement. Suite à quoi il est vérifié si cette chaîne de caractères est vide. Si c'est le cas, c'est le nom de fichier qui correspond en réalité au cadre droit qui est copié dans la variable $arg. Ensuite le script écrit la définition pour le cadre droit dans laquelle $arg est le nouveau fichier pour le cadre.

Cliquez sur le lien ci-dessous pour afficher l'exemple fini.

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu

vers le hautvers le bas 

Modifier plusieurs cadres

Qu'en serait-il si vous vouliez modifier simultanément plusieurs cadres de votre jeu de cadres?
Pas de panique, il ne s'agit pas ici de l'histoire connue depuis longtemps Page d'information: connexion exigée Changer simultanément deux cadres (mais j'utiliserai le jeu de cadres de cet exemple)!
Non, je veux démontrer que de cette façon (ou avec un procédé similaire) il est aussi possible de modifier plusieurs cadres simultanément.

Pour ce faire, nous nous servirons de la méthode par laquelle un formulaire transmet ses données, c'est la raison pour laquelle les noms de cadre seront accrochés à l'URI avec le signe & (? pour le premier) et que les noms de fichiers (sans l'extension) correspondants seront accrochés aux noms de cadre avec le signe =.
Un appel correspondant pourrait alors prendre cet aspect:

http://www.mespages.fr/mondossier/?cadre 1=fichier 1&cadre 2=fichier 2

Nous partirons cette fois de ce jeu de cadres:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Changer simultanément deux cadres</title>
</head>
<frameset cols="180,*">
 <frame src="deux_cadres_gauche.htm" name="gauche">
 <frameset rows="180,*">
   <frame src="deux_cadres_to.htm" name="haut">
   <frame src="deux_cadres_tu.htm" name="bas">
 </frameset>
</frameset>
</html>

L'objectif est maintenant de faire générer par PHP les définitions pour les cadres "haut" et "bas".
Pour parvenir à savoir quel fichier est destiné à quel cadre, la chaîne de requête doit être décomposée. PHP s'en charge automatiquement pour vous.

Le script PHP fini peut par exemple avoir cet aspect:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Changer simultanément deux cadres</title>
</head>
<frameset cols="180,*">
 <frame src="deux_cadres_gauche.htm" name="gauche">
 <frameset rows="180,*">
   <?php
   $haut  = $_GET['haut'];
   $bas = $_GET['bas'];

   if($haut  == "") $haut  = "deux_cadres_to.htm";
   if($bas == "") $bas = "deux_cadres_tu.htm";

   print "<frame src=\"$haut\" name=\"haut\">\n";
   print "   <frame src=\"$bas\" name=\"bas\">";
   ?>

 </frameset>
</frameset>
</html>

Explication:

Tout d'abord le script lit les valeurs des paramètres dans le tableau superglobal $_GET. Il vérifie ensuite si les variables $haut et $bas ainsi obtenues sont vides. Si c'était le cas pour l'une d'entre elles (ou même les deux), il écrit les noms de fichier standard (toujours sans extension) dans ces variables. Enfin, il pose la définition du cadre.
Les espaces entre " et <frame src=\" ... ont pour seul but de donner au code source final un aspect propre.

Voici maintenant l'exemple fini:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu

vers le hautvers le bas 

Cela marche également avec Perl!

Cela peut bien-entendu être également réalisé avec Perl. Ici nous mettons le script en œuvre en relation avec un Page d'information: connexion exigée Server Side Include, étant donné que l'aspect sera amélioré en ce qui concerne les noms de fichiers.
Vous comprendrez que je ne décrive ici que le vers le haut premier exemple pour l'utilisation de Perl et SSI. Sur ma page d'accueil, vous trouverez un petit article nommé Page en langue allemande Charger plusieurs fichiers dans un jeu de cadres grâce à Perl, qui décrit comment vous pouvez également modifier plusieurs cadres de façon dynamique avec Perl.

Partons à nouveau de notre premier jeu de cadres:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<title>Jeu de cadres</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="gauche.htm" name="gauche">
   <frame src="droite.htm" name="droite">
   <noframes>
   <body>
   <p>Votre navigateur ne gère pas les cadres!</p>
   </body>
   </noframes>
</frameset>
</html>

Supposons que le cadre droit doive être modifié à l'aide d'une chaîne de requête. La définition du cadre gauche doit donc être remplacée par un SSI.
Ce qui nous donnerait à peu près ceci:

Fichier index.shtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<title>Jeu de cadres</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="gauche.htm" name="gauche">
   <!--#exec cgi="/cgi-bin/dynaframe.pl" -->
   <noframes>
   <body>
   <p>Votre navigateur ne gère pas les cadres!</p>
   </body>
   </noframes>
</frameset>
</html>

Le Server Side Include appelle maintenant le script Perl dynaframe.pl.
Ce script contient le code ci-après:

Fichier dynaframe.pl

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $arg = $ENV{'QUERY_STRING'};

$arg = "droite.htm" if($arg eq "");

print "Content-type: text/html\n\n";
print "<frame src=\"$arg\" name=\"droite\">";

Le script copie tout d'abord la chaîne de requête dans la variable $arg. Ensuite il vérifie si la variable $arg (donc la chaîne de requête) est vide et écrit dans cette variable le fichier standard pour ce cadre. Maintenant le script envoie la nouvelle définition de cadre au navigateur définition dans laquelle $arg est le nom du fichier.

Voici maintenant l'exemple complet:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu

vers le hautvers le bas 

Remarques

Si vous utilisez une ancienne version de PHP (antérieure à 4.1.0), qui n'interprète pas correctement les "superglobals" $_GET et $_SERVER, utilisez à la place $HTTP_GET_VARS et $HTTP_SERVER_VARS.

Tous les exemples spécifiés ici ont un gros inconvénient: Si, pour quelque raison que ce soit, un visiteur veut charger dans le jeu de cadres un fichier qui n'existe pas, alors PHP ou plutôt le script PHP écrit gentiment un lien à ce fichier inexistant et le visiteur ceçoit alors un splendide message d'erreur 404 HTTP "URL not found".
Cela peut toutefois également arriver qu'un fichier soit mentionné alors qu'à vrai dire il n'a aucune raison de l'être, par exemple en naviguant ou des pages complètement étrangères qui n'ont rien à voir avec votre page.
Vous pouvez éviter cela en examinant d'abord toutes les différentes possibilités avec if() et en ne faisant écrire le nom du fichier standard dans le jeu de cadres que si cet examen est négatif.
D'autre part, vous pouvez également vérifier grâce aux fonctions PHP file_exists() ou bien is_file(), si le fichier demandé existe vraiment et, si ce n'est pas le cas charger le fichier standard. Ne perdez pas de vue que file_exists() et is_file() sont sans effet s'ils s'agit d'un alias pour le fichier mentionné ou bien si celui-ci se trouve dans un répertoire alias.

Le script correspondant peut alors par exemple revêtir cet aspect (c'est à nouveau le jeu de cadres du vers le haut premier exemple) qui sert de base:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<title>Jeu de cadres</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="gauche.htm" name="gauche">
   <?php
   $arg = $_SERVER['QUERY_STRING'];

   if(!$arg && !file_exists($arg)) $arg = "droite.htm";

   print "<frame src=\"$arg\" name=\"droite\">";
   ?>

   <noframes>
   <body>
   <p>Votre navigateur ne gère pas les cadres!</p>
   </body>
   </noframes>
</frameset>
</html>

Explication:

Tout d'abord, le script copie la chaîne de requête dans la variable $arg. Ensuite vérification est faite si la chaîne de requête est vide ou non et si le fichier demandé existe. Si la chaîne de requête est vide et que le fichier demandé n'existe pas, le chemin du fichier standard est mentionné dans $arg. Enfin, la définition du jeu de cadres est sortie.

vers le haut

© 2005 Page d'information: connexion exigée Informations