Teil von SELFHTML aktuell Teil von Artikel Teil von PHP

Datei mit PHP in Frameset laden

nach unten Patrick Canterino
nach unten Einleitung
nach unten Die ganz einfache Variante
nach unten Mehrere Frames verändern
nach unten Es geht auch mit Perl!
nach unten Anmerkungen

Patrick Canterino

E-Mail: E-Mail patrick@patshaping.de
Homepage-URL: deutschsprachige Seite http://www.patshaping.de/

Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!

nach obennach unten

Einleitung

Wie schon in SELFHTML unter bereichsübergreifende Seite Sinnvolle Einsatzmöglichkeiten für Frames erwähnt wird, haben Framesets den Nachteil, dass man Unterseiten des Framesets nicht direkt ansteuern kann. Sicherlich, der Besucher kann die entsprechende Seite einfach so aufrufen, aber dann ist er auf dieser Seite "gefangen", da die Navigaton fehlt.

Was liegt also näher, als in das Frameset ein kleines Script einzubauen, dass es erlaubt, das Frameset über einen sogenannten Query String (eine kleine Zeichenkette, die mit einem Fragezeichen an einen URI angehängt wird) zu verändern. In diesem Artikel möchte ich demonstrieren, wie Sie das mit bereichsübergreifende Seite PHP realisieren können.

Wenn Sie auf eine bereichsübergreifende Seite JavaScript-basierte Lösung setzen wollen (beispielsweise weil Ihr Homepage-Anbieter PHP nicht erlaubt), können Sie auch das Prinzip verwenden, das Martin Wernecke in seinem Artikel Seite Datei dynamisch in Frameset laden beschreibt. Setzen Sie sich ein bisschen mit dem Artikel auseinander, dann werden Sie verstehen, worauf ich hinaus will.
Diese Methode hat aber den Nachteil, dass sie vom Browser Ihrer Besucher abhängig ist, d.h. wenn der Besucher JavaScript deaktiviert hat, funktioniert es nicht.

Wenn Sie allerdings eher ein Fan von bereichsübergreifende Seite Perl sind, lesen Sie bitte den kleinen Unterabschnitt nach unten Es geht auch mit Perl!. Mit Perl können Sie es nämlich genauso gut realisieren.

Bedenken Sie bitte, dass die hier vorgestellten Lösungen nicht die Lösungen sind, da im Grunde genommen jedes Frameset anders ist. Es wird hier nur die Grundlage vorgestellt. Vor allem sind die Lösungen sehr primitiv. Lesen Sie sich deshalb auch die nach unten Anmerkungen durch, um zu sehen, was Sie unter anderem beachten sollten.

nach obennach unten

Die ganz einfache Variante

Die erste Variante, die ich hier demonstrieren möchte, kann einen Frame verändern. Das reicht in den meisten Fällen vollkommen aus.

Wir gehen von diesem einfachen Frameset aus:

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

<html>
<head>
<title>Frameset</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="links.htm" name="links">
   <frame src="rechts.htm" name="rechts">
   <noframes>
   <body>
   <p>Ihr Browser unterstuetzt keine Frames!</p>
   </body>
   </noframes>
</frameset>
</html>

Es besteht aus einem linken und einem rechten Frame. Im linken befindet sich die Navigation und im rechten die Texte etc.

Das Ziel ist es nun, den rechten Frame über einen Query String zu verändern. Eine entsprechende Adresse würde dann so aussehen:

http://www.meineseiten.de/meinordner/?Neue Seite

Der Query String ändert also im Verzeichnis-Index des Ordners meinordner im rechten Frame die ursprüngliche Datei durch neueseite ersetzen.
Das PHP-Script muss also den Query String auslesen und die Frame-Definition entsprechend ändern. Das PHP-Script kann dann so aussehen:

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

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

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

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

   <noframes>
   <body>
   <p>Ihr Browser unterstuetzt keine Frames!</p>
   </body>
   </noframes>
</frameset>
</html>

Erläuterung:

Das PHP-Script kopiert zunächst den Query String in die Variable $arg, um die spätere Arbeit damit zu vereinfachen. Anschließend wird geprüft, ob er leer ist. Sollte das zutreffen, wird der Dateiname, der eigentlich in den rechten Frame gehört, in die Variable $arg kopiert. Danach schreibt das Script die Definition für den rechten Frame, wobei $arg die neue Datei für den Frame ist.

Klicken Sie auf den untenstehenden Link, um das fertige Beispiel anzuzeigen.

Popup-Seite Anzeigebeispiel: So sieht's aus

nach obennach unten

Mehrere Frames verändern

Doch was wäre, wenn Sie in Ihrem Frameset mehrere Frames auf einmal ändern wollen?
Keine Angst, hier geht es nicht um die altbekannte Geschichte bereichsübergreifende Seite Zwei Frames gleichzeitig ändern (ich verwende aber das Beispiel-Frameset)!
Nein, ich will demonstrieren, dass man auf diese Weise (oder auf eine ähnliche) auch mehrere Frames gleichzeitig ändern kann.

Dafür machen wir uns die Methode, in der ein Formular normalerweise seine Daten übermittelt zunutze, daher hängen wir die Framenamen mit &-Zeichen und die entsprechende Datei (ohne Extension) mit einem Gleichheitszeichen an den Framenamen.
Ein entsprechender Aufruf könnte dann so aussehen:

http://www.meineseiten.de/meinordner/?Frame 1=Datei 1&Frame 2=Datei 2

Dieses Mal gehen wir von diesem Frameset aus:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Zwei Frames gleichzeitig &auml;ndern</title>
</head>
<frameset cols="180,*">
 <frame src="zweiframes_links.htm" name="links">
 <frameset rows="180,*">
   <frame src="zweiframes_to.htm" name="oben">
   <frame src="zweiframes_tu.htm" name="unten">
 </frameset>
</frameset>
</html>

Das Ziel ist es jetzt, die Defintionen für die Frames "oben" und "unten" von PHP generieren zu lassen.
Um an die Information zu kommen, welche Datei in welchen Frame gehört, muss der Query String auseinandergenommen werden. Das erledigt PHP automatisch für Sie.

Das fertige PHP-Script kann dann beispielsweise so aussehen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Zwei Frames gleichzeitig &auml;ndern</title>
</head>
<frameset cols="180,*">
 <frame src="zweiframes_links.htm" name="links">
 <frameset rows="180,*">
   <?php
   $oben  = $_GET['oben'];
   $unten = $_GET['unten'];

   if($oben  == "") $oben  = "zweiframes_to.htm";
   if($unten == "") $unten = "zweiframes_tu.htm";

   print "<frame src=\"$oben\" name=\"oben\">\n";
   print "   <frame src=\"$unten\" name=\"unten\">";
   ?>

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

Erläuterung:

Das Script liest zunächst die Werte der Parameter aus dem superglobalen Array $_GET aus. Dann prüft es, ob die so entstandenen Variablen $oben und $unten leer sind. Sollte eine der beiden (oder sogar beide) leer sein, schreibt es die Standard-Dateinamen (wieder ohne Datei-Extension) in diese Variablen. Anschließend legt es noch die Frame-Definition an.
Die Leerzeichen zwischen " und <frame src=\" ... haben lediglich den Zweck, dass der fertige Quell-Code ordentlich aussieht.

Hier nun das fertige Beispiel:

Popup-Seite Anzeigebeispiel: So sieht's aus

nach obennach unten

Es geht auch mit Perl!

Das alles lässt sich natürlich auch mit Perl realisieren. Wir setzen hier das Script in Verbindung mit einem bereichsübergreifende Seite Server Side Include ein, da es irgendwie von den Dateinamen her besser aussieht.
Bitte haben Sie Verständnis, dass ich hier nur beschreibe, wie das nach oben erste Beispiel in Perl und SSI aussehen würde. Auf meiner Homepage finden Sie einen kleinen Artikel namens deutschsprachige Seite Mehrere Dateien mit Perl in Frameset laden, der beschreibt, wie Sie auch mehrere Frames dynamisch mit Perl verändern können.

Wir gehen wieder von unserem ersten Frameset aus:

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

<html>
<head>
<title>Frameset</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="links.htm" name="links">
   <frame src="rechts.htm" name="rechts">
   <noframes>
   <body>
   <p>Ihr Browser unterstuetzt keine Frames!</p>
   </body>
   </noframes>
</frameset>
</html>

Nehmen wir an, der rechte Frame soll mit Hilfe eines Query Strings verändert werden. Also muss die Definition des linken Frames durch ein SSI ersetzt werden.
Das sähe dann in etwa so aus:

Datei index.shtml

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

<html>
<head>
<title>Frameset</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="20%,80%">
   <frame src="links.htm" name="links">
   <!--#exec cgi="/cgi-bin/dynaframe.pl" -->
   <noframes>
   <body>
   <p>Ihr Browser unterstuetzt keine Frames!</p>
   </body>
   </noframes>
</frameset>
</html>

Das Server Side Include ruft nun das Perl-Script dynaframe.pl auf.
Dieses Script enthält den folgenden Code:

Datei dynaframe.pl

#!/usr/bin/perl -w

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

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

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

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

Das Script kopiert zunächst den Query String in die Variable $arg. Anschließend prüft es, ob die Variable $arg (also der Query String) leer ist und schreibt in diese Variable die Standarddatei für diesen Frame. Nun sendet das Script die neue Frame-Definiton an den Browser, wobei $arg der Name der Datei ist.

Hier nun das komplette Beispiel:

Popup-Seite Anzeigebeispiel: So sieht's aus

nach obennach unten

Anmerkungen

Wenn Sie eine ältere Version von PHP (älter als 4.1.0) verwenden, die nicht mit den "Superglobals" $_GET und $_SERVER zurecht kommt, verwenden Sie stattdessen $HTTP_GET_VARS und $HTTP_SERVER_VARS.

Alle hier von mir aufgeführten Beispiele haben einen großen Nachteil: Wenn ein Besucher aus irgendeinem Grund eine Datei in das Frameset laden will, die nicht existiert, dann schreibt das PHP- bzw. Perl-Script brav einen Verweis auf die nicht vorhandene Datei, und der Besucher bekommt einen wunderschönen HTTP Error 404 "URL not found".
Es kann allerdings auch passieren, dass eine Datei angegeben wird, die da eigentlich gar nicht hin darf, beispielsweise die Navigation oder komplett fremde Seiten, die überhaupt nichts mit Ihrer Seite zu tun haben.
Dem können Sie vorbeugen, indem Sie beispielsweise zuerst mit if() alle verschiedenen Möglichkeien abfragen, und wenn dann keine Entsprechung gefunden wurde, lassen Sie einfach die Standard-Datei ins Frameset schreiben.
Sie können andererseits auch mit den PHP-Funktionen file_exists() oder is_file() prüfen, ob die angeforderte Datei wirklich exisitiert, und, falls nicht, entsprechend die Standard-Datei laden. Bedenken Sie, dass file_exists() und is_file() wirkungslos sind, wenn es sich bei der angegebenen Datei um einen Alias handelt, oder sich die Datei in einem Alias-Verzeichnis befindet.

Ein entsprechendes Script kann zum Beispiel so aussehen (als Grundlage dient wieder das Frameset aus dem nach oben ersten Beispiel):

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

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

   if(!$arg || !file_exists($arg)) $arg = "rechts.htm";

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

   <noframes>
   <body>
   <p>Ihr Browser unterstuetzt keine Frames!</p>
   </body>
   </noframes>
</frameset>
</html>

Erläuterung:

Das Script kopiert zunächst den Query String in die Variable $arg. Anschließend wird geprüft, ob der Query String nicht leer ist und ob die angeforderte Datei überhaupt existiert. Wenn der Query String leer ist und die angeforderte Datei nicht vorhanden ist, wird in $arg der Pfad zur Standarddatei angegeben. Zum Schluss wird noch die Frame-Definition ausgegeben.

Teil von SELFHTML aktuell Teil von Artikel Teil von PHP

© 2007 bereichsübergreifende Seite Impressum