Simuler des "frames" en PHP

Il est possible de simuler des cadres en PHP. le principal intérêt est que le document résultant envoyé par le serveur de pages Web au logiciel client, est un seul fichier HTML, ce qui évite les problèmes de décallages de gestion des cadres par les différents navigateurs Web.

L'exemple suivant présente une page Web permettant de naviguer sur plusieurs pages centrales (page de navigation). Le code exact des pages visualisées ci-dessous est téléchargable à partir de l'archive pseudo-frames.zip. Vous pouvez aussi le tester directement dans une nouvelle fenêtre (pseudo-frames/index.php) ou dans l'élément HTML "<iframe>" suivant :

Cette page contient une zone de titre dans le haut de la page, dont le code, contenu dans un fichier PHP séparé ("haut.php"), est inséré au fichier "index.php" du dossier "pseudo-frames" par un appel de la fonction PHP include() (voir dans le cours sur PHP, le chapitre sur la modularité).

La simulation des cadres est l'effet produit par le menu vertical.

Selon l'item sélectionné par le visiteur, un "centre" adapté est affiché dans la zone droite qui est sous la zone de titre.

Si vous observez les URLs pointés par les items du menu (dans la zone d'affichage de l'état de votre navigateur), vous pouvez remarquer que ces items réfèrent à la page d'index elle-même (celle-là même qui est exécutée), mais le texte de l'URL est rallongé comme lors d'un passage de paramètres de formulaire par la méthode GET.

Dans le cas de l'exemple, on utilise une variable $page pour récupérer la variable d'environnement $HTTP_GET_VARS['page'] (ou de manière équivalente $_GET['page']) pour spécifier sur quel "centre" on veut pointer. Cette affectation est faite grâce à l'instruction PHP d'affectation conditionnelle. Une telle pratique était courante en PHP3, mais elle s'est perdue progressivement. Aujourd'hui, on utilise directement $_GET['page'] (ou même $_REQUEST['page'])

Les différents fichiers sont donc :

index.php
<html>
<head>
  <title>Pseudo-frames</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
	<tr><td colspan="2">
<? include('haut.php'); // L'entete de votre site  ?>
	</td></tr>
	<tr><td width="19%" valign="top">
<? include('menu.php'); // la page menu de votre site  ?>
	</td><td width="81%">
<? include('centre.php'); // la page centrale  ?>
	</td></tr>
  </table>
</body>
</html>
haut.php
defaut.php
menu.php
centre.php


Le fichier "index.php" compose la page à partir des fichiers "haut.php", "menu.php" et "centre.php".

Le fichier "menu.php" présente simplement des URLs étendus en mettant le nom du centre dans le paramètre "page" : par exemple <a href=\"index.php?page=lanceURL\">iframe</a> met un lien sur "index.php?page=lanceURL" sous la chaîne "iframe".

Le fichier "centre.php" est lui-même remplacé dynamiquement

Indiquer le menu courant

Il est pratique de montrer au visiteur le lien sur lequel il a cliqué pour obtenir la page centrale qu'il est a sous les yeux.

Pour ajouter cet artéfact dans le menu présenté dans l'exemple, on peut modifier le fichier "menu.php" de la manière suivante :
menu.php

Vous pouvez tester directement le résultat de ce menu dans le i-cadre suivant :

Remarques : on aurait pu remplacer la ligne

$class = ($_GET['page']=='navig')? 'courrant': 'item';

par les 2 lignes suivantes qui font le test sur la valeur du paramêtre "page" dans une instruction de contrôle explicite

if ($_GET['page']=='navig') $class= 'courrant'; else $class= 'item';

plutôt que dans une affectation conditionnelle. L'affectation conditionnelle est à comprendre un peu comme les formules if des fichiers Excel : la formule entre parenthèse est un prédicat, c'est-à-dire que son évaluation rend TRUE ou FALSE ; si la valeur du prédicat vaut TRUE, alors la valeur affectée par le signe = est la première (celle qui est juste après le signe class="code"?) sinon (la valeur du prédicat vaut FALSE) la valeur affectée par le signe = est la deuxième (celle qui est juste après le signe :)



Utiliser les tableaux PHP pour obtenir un code générique

À partir de l'exemple précédent, nous avons à nouveau modifié le fichier "menu.php" de façon à factoriser le code qui affiche le menu dans une boucle.
menu.php

On a défini un tableau à 3 éléments : $tab_menu , indexé par les valeurs possibles du paramètre $page . Du code PHP peut être écrit pour calculer une telle table PHP en fonction des éléments présents dans le dossier qui contient le fichier/page Web demandé. Chaque cellule de ce tableau est elle-même un tableau à 2 éléments :

$tab_menu'item''class'
'navig'"navig" .courrant ou .item selon que $page vaut "navig" ou pas
'login'"miniForm" .courrant ou .item selon que $page vaut "miniForm" ou pas
'lanceURL'"iframe" .courrant ou .item selon que $page vaut "iframe" ou pas

Vous pouvez vérifier que ça marche toujours :



Transmission du paramètre de page dans l'action d'un formulaire

Si le code qui est inséré dans la page courante contient un formulaire, il faut faire attenion à bien transmettre le paramètre qui indique le centre de la page courante dans l'action du formulaire.

Par exemple, lancer les formulaires affichés dans les centres de exemples suivants et comparer les codes PHP qui génèrent l'action du mini-formulaire dans chaque cas ; Visualiser directement cet exemple (pseudo-frames-plus2/index.php?page=login et pseudo-frames-plus2/index.php?page=login respectivement) et observer l'URL après le lancement du formulaire

sans renvoi du paramètre page : Le chemin relatif du fichier visité par l'URL est celui qui est repris tel quel pour générer l'action du formulaire.
avec renvoi du paramètre page : Si un paramètre page a été récupéré, alors il est rajouté à la fin de l'URL du script courant pour continuer de visiter (et donc d'inclure) le même centre.


Dans les deux cas, le code inclus pour réaliser les actions est identique et contenu dans verif.php dont le code est affiché ci-contre.
On remarque que l'action prévue pour le bouton Récup exécute d'abord le code qui produit la ligne Bonjour..., puis le code exécuté aussi pour l'action prévue pour le bouton Verif : il n'y a pas d'instruction break; avant la prise ne compte du cas case 'Verif':