Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
24.04.2002, 02:19
Kriz



Holla und Gute Nacht (gähn).

Bis gerade eben habe ich an dem Problem geknobelt, daß man in einem HTML-Frameset, in denen PHP-Skripte ablaufen, gewaltige Frame-Update-Probleme bekommen kann, wenn man nicht etwas nachdenkt.

Zuersteinmal der Grundgedanke:

Angenommen man hat das aktuelle Browserfenster in 2 Frames aufgeteilt: NAVI und MAIN. In linken Frame NAVI läuft ein PHP-Skript ab, in rechten Frame MAIN ebenfalls. Aus Designergründen befindet sich in NAVI die Funktionalität zum Ein/Ausloggen für Benutzer und in MAIN sollen Hauptausgaben erscheinen, sozusagen als Main-Frame (löl)...

Die Formulareingaben in NAVI mit den Benutzerdaten zum Einloggen (Name + PW) werden beim Klicken auf einen Submitbutton an ein externes PHP-Skript weitergeleitet, welches die Formulardaten prüft und dann nötige Datenbank- und Variablensettings betreibt.

Danach sollen NAVI und (!!!) MAIN aktualisiert werden mit den jeweils auftretenden Situationsevents (korrektes Login, Fehler usw.)

Die Problematik

Wie gesagt befördert das Formular in NAVI die Benutzerangaben an das externe PHP-Skript. Dort werden die Angaben ausgewertet und weitere Schritte eingeleitet.

Problem #1:

Das externe Skript kann von sich aus nur maximal 1 URL wieder losschicken. Das geschieht mit der PHP-Funktion header(). Header() muß aber in Sinne des HTTP-Headers noch VOR irgendeinem HTML-Tag (in diesem Fall das Tag <!doctype ...> bzw. bei Standarddateien <html>) erscheinen, damit es funktioniert.

Problem #2:

Außerdem bezieht sich header() wieder auf den Ursprungsframe, von dem es aufgerufen wurde, in diesem Falle also NAVI. Frame MAIN kann also niemals mit PHP und header() aus dem Skript heraus direkt aktualisiert werden!

Lösung

Da PHP wie gesagt nur maximal 1 URL weiterleiten kann (nach dem Ausführen von header() gilt der HTTP-Header der Datei als abgesendet!) und diese URL auch noch dummerweise direkt wieder an den Frame zurückfließt, von dem das Skript heraus aufgerufen worden ist, muß was anderes her, was diese Barrieren überwindet!

Die Lösung ist simples JavaScript! Mit JavaScript kann man bequem alle vorhandenen Frames steuern. Folgendes Miniskript definiert eine JavaScript-Funktion, welche als Parameter jeweils zwei Frame-IDs und zwei URLs erwartet. Die Funktion aktualisiert dann automatisch die jeweils angesprochenen Frames mit dem Inhalt der übergebenen URLs. Übrigens ist dies dasselbe Skript, welches auch bei CAWS die Navileiste und den Main-Bereich aktualisiert (dort aber ohne PHP, sonst hätte ich diesen Thread ja nicht aufgemacht).Quellcode:
// JavaScript Funktion TwoFrames()

function TwoFrames(URL1, F1, URL2, F2)
{
    parent.frames[F1].location.href = URL1;
    parent.frames[F2].location.href = URL2;
}

Diese Version erwartet Frame-IDs (F1 und F2) als Lokalisator und zwei Ziel-URLs (URL1 und URL2). Man könnte auch die Frame-Namen übergeben, aber das wäre mehr Code als nötig =)

Diese Funktion packen wir in eine externe JavaScript-Datei namens twoframes.js und speichern sie ab (Ich mag .js Dateien lieber als embedded scripts!). So, aber wie friemeln wir nun dieses JavaScript mit dem PHP-Skript zusammen?

Dazu ein weiterer Gedankenvorstoß:

Wir wissen, daß header() maximal 1 URL aufrufen kann und dazu noch vor jeglichem HTML-Code erscheinen muß. Header() ist also für unser Vorhaben absolut zwecklos! Also streichen wir header() aus unserem Konzept, weil wir ja nun die JavaScript-Funktion TwoFrames() besitzen.

Da das PHP-Skript ja nur als Skript auftauchen soll und weniger als sichtbares Ergebnis in einem Frame, so müssen wir das Skript dazu bringen, eine Fake-HTML-Seite zu generieren. Im <head> .. </head> Segment binden wir unsere twoframes.js Datei ein und zwingen die Seite im <body> Tag durch OnLoad() die JavaScript-Funktion TwoFrames() zu laden. Als Übergabeparamater an TwoFrames() setzen wir die Frame-IDs für NAVI und MAIN ein und die original PHP-Skript URLs vom NAVI-Basisskript und MAIN-Basiskript. Die sollen ja das Auswerten, was unser externes PHP-Skript ausgewertet hat infolge der Benutzereingaben in NAVI. Jetzt muß man nur noch dafür sorgen, daß PHP im Parameterteil von TwoFrames() dynmisch alle Angaben erledigt. Der Ablauf ist dann folgender:

1. Der User gibt seine Daten ins Formular im Frame NAVI ein und klickt Submit.
2. Das NAVI-Basisskript sendet die Daten an das externe Auswertungsskript.
3. Dieses wertet die Daten aus und generiert die Fake-Seite, die unsichtbar ist.
4. Der <body> Tag der Fake-Seite lädt sofort aus der externen js.-Datei die Funktion TwoFrames() und führt sie aus.
5. TwoFrames(9 aktualisiert NAVI und MAIN gleichzeitg mit den dynamischen Daten des externen Skripts.
6. NAVI und MAIN werden aktualisiert.

Der Code für das externe Skript könnte so aussehen:Quellcode:
<?php
    // Formulardaten auswerten (Beispiel)
    ...
    $daten_korrekt = true;
?>
<html>
<head>
<script language="javascript" src="twoframes.js" type="text/javascript"></script>
</head>
<?php
    echo "<body OnLoad(TwoFrames(0, 'navi.php?login_ok=$daten_korrekt', 1, 'main.php?login_ok=$daten_korrekt'))>";
?>
</body>
</html>

Das $daten_korrekt im zweiten PHP Tag-Block noch bekannt ist, dafür sorgt PHP schon selber.

Ich hoffe, meine Basteleien helfen euch ein wenig. Und denkt dran: PHP ist zwar mächtig, aber manchmal braucht es eben einen starken Verbündeten wie JavaScript, ehe was anständig funktioniert =)

Wer Fragen hat, der soll bitte hier posten, weil ich nicht andauernd nur E-Mails beantworten will. Thx...

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 24.04.2002 um 02:26 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
24.04.2002, 11:55
Hessie J.



JavaScript == UBEREVIL!

Nee, aber mal im Ernst: Deswegen würd ich für sowas keine Frames nehmen. Es soll nämlich tatsächlich Leute geben, die JavaScript ausgeschaltet haben (müssen). Ich gehöre hier im Büro zu dieser Gruppe. Und ich bin jedesmal angepisst, wenn wieder mal eine Seite meint, JavaScript vorraussetzen zu müssen (oder Java, oder Flash, usw. usw. :D).

--


Dieser Beitrag wurde am 24.04.2002 um 11:55 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
24.04.2002, 12:56
Tron



yeah... no java, no frames - you don't need a cup of coffee and no extra glass (;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
003
26.04.2002, 15:59
[RMen]OneStone



Zitat:
Tron postete
yeah... no java, no frames - you don't need a cup of coffee and no extra glass (;

Grrr! Das ist JavaScript ihr BANAUSEN!

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
004
26.04.2002, 20:50
Another1



was denkst du wovon die reden, du banause?

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
005
26.04.2002, 21:43
KhanRKerensky



Zitat:
Tron postete
no java

Java != JavaScript
Darum gings ihm ;)

--

"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book

zum Seitenanfang zum Seitenende Profil || Suche
006
27.04.2002, 12:11
Kriz



Zitat:
Hessie J. postete
JavaScript == UBEREVIL!

Nee, aber mal im Ernst: Deswegen würd ich für sowas keine Frames nehmen. Es soll nämlich tatsächlich Leute geben, die JavaScript ausgeschaltet haben (müssen). Ich gehöre hier im Büro zu dieser Gruppe. Und ich bin jedesmal angepisst, wenn wieder mal eine Seite meint, JavaScript vorraussetzen zu müssen (oder Java, oder Flash, usw. usw. :D).


Wo kann man denn bitteschön JavaScript deaktivieren? Sowas kann ich weder bei IE noch bei NS...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
007
27.04.2002, 14:42
Hessie J.



Unsere Systemadministratoren sind wahrhafte Künstler im Abschalten von Features (leider nur darin ;). Die haben sogar die Suchfunktion im Explorer deaktiviert.

Eine Anleitung zur Deaktivierung von JScript findet man beim z.B. Heise-Browsercheck

--

zum Seitenanfang zum Seitenende Profil || Suche