Seitenumstellung auf PHP - wie?
Raphael90
- php
0 Der Martin
0 Ale×0 Raphael900 Ale×0 Raphael900 Raphael900 Der Martin
0 raphael90
0 Der Martin
0 Ale×
Hi,
als ich meine Seite gemacht habe, wollte ich, dass man, wenn man auf einen Menüpunkt klickt, nicht die ganze Seite neu laden muss, sondern nur den Bereich, in dem der Inhalt, bzw. der entsprechende Text steht.
Das habe ich mit einem Iframe realisiert (inzwischen weiß ich, dass man das nicht macht... bitte nicht schlagen :) ).
Ich habe aber schon versucht, einige Probleme des Iframes per Javascript zu lösen, z.B. habe ich es so gemacht, dass ich den Pfad der Seite im Iframe ohne ".html" als Anker hinter den Link geschrieben habe, so dass man, wenn man den Link kopiert und später wieder eingibt, man wieder genau da ist, wo man den Link kopiert hat.
Aber egal.
Ich weiß inzwischen, dass man das nicht macht, und würde deshalb gerne auf PHP umsteigen (steht serverseitig zur Verfügung).
Deshalb habe ich schon mehrere Stunden auf php.net verbracht, aber ich glaube, dass ich grundsätzlich noch einiges nicht verstanden habe.
Mein Ziel ist es also, sämtliche JavaScript-Elemente in PHP umzuschreiben.
Aber kann ich z.B. mit PHP auch auf Objakte zugreifen, wie z.B. per getElementByID?
Und wie kann ich das oben geschilderte Anliegen, also dass man nach Klick auf einen Menüpunkt nur einen Bereich laden muss, nicht die ganze Seite, realisieren?
Vielen Dank, Raphael
Hallo Raphael,
Ich habe aber schon versucht, einige Probleme des Iframes per Javascript zu lösen, ...
und damit ein Problem mit einem anderen ergänzt.
Mein Ziel ist es also, sämtliche JavaScript-Elemente in PHP umzuschreiben.
Aber kann ich z.B. mit PHP auch auf Objakte zugreifen, wie z.B. per getElementByID?
Deine Fragestellung lässt erkennen, dass du das Konzept im Grundsatz noch nicht verstanden hast:
PHP läuft auf dem Server. Ein PHP-Script erzeugt dynamisch das HTML-Dokument, das dann zum Client (Browser) geschickt wird. Der Client bekommt davon nichts mit; für ihn besteht kein Unterschied zwischen einem durch PHP generierten und einem rein statischen Dokument. PHP kann daher zwar auf Quelltextebene arbeiten, weiß aber nichts vom DOM, wie Javascript es sieht, und kann vor allem nicht mit dem Benutzer interagieren. Denn wenn das Dokument beim Besucher angezeigt wird, ist PHP längst mit der Arbeit fertig.
Javascript wird dagegen im Browser ausgeführt (oder auch nicht). JS arbeitet eng mit dem HTML-Parser des Browsers zusammen und kann so auf den ganzen Element- bzw. Objektbaum (DOM) zugreifen. JS kann auf Ereignisse reagieren und so Benutzereingaben und Reaktionen verarbeiten. Javascript kann nicht zwingend vorausgesetzt werden; eine Webseite muss daher so aufgebaut sein, dass sie auch ohne Javascript zumindest benutzbar bleibt, wenn auch vielleicht mit Einschränkungen in Ästhetik und Bedienkomfort.
Und wie kann ich das oben geschilderte Anliegen, also dass man nach Klick auf einen Menüpunkt nur einen Bereich laden muss, nicht die ganze Seite, realisieren?
Am besten gar nicht. Ein HTML-Dokument sollte immer komplett neu geladen werden. Der dabei entstehende Overhead wird meist gravierend überschätzt. Eine Seite, die *vollständig* neu geladen wird, braucht in der Regel nicht länger, als wenn nur Teile ausgetauscht werden, denn die übertragene Datenmenge ist bei den heute üblichen Übertragungsraten überhaupt nicht mehr maßgeblich für die benötigte Zeit. Zumindest nicht bei HTML-Dokumenten in üblicher Länge mit wenigen kB Größe.
Mit PHP oder einer anderen serverseitigen Technik (auch SSI kann einiges) kannst du dir die Arbeit aber insofern erleichtern, als du bestimmte Teile der Webpräsenz, die häufig wiederkehren, in separate Dateien auslagerst und beim Abruf der Seite wieder zusammenführst.
Die FAQ dieses Forums bieten übrigens auch einige Ansatzpunkte zum Auslagern von Quellcodeabschnitten. Lesen bildet.
So long,
Martin
Hallo Raphael,
Deine Seite könnte so aufgebaut sein:
<html>
...
Navigation
...
<?php include $content; ?>
...
</html>
Als $content wird jetzt je nach Bedarf eine Datei eingefügt (keine Komplette HTML-Datei, nur der HTML-ausgezeichnete Inhalt - wir befinen uns ja bereits in einer HTML-Seite).
Dazu übergibst Du mit jedem Link einen Parameter, etwa so: <a href="index.php&page=info">Info</a>. In der Hauptseite muss jetzt noch $content entsprechend dem Parameter zugewiesen werden:
switch($_GET['page'])
{
case 'info': $content = 'info.php'; break;
case 'bla': $content = 'bla.php'; break;
// usw...
default: $content = 'home.php'; break;
}
Ale×
Hi,
das sind schon mal gute Ansätze, vielen Dank.
@Alex:
Als $content wird jetzt je nach Bedarf eine Datei eingefügt (keine Komplette HTML-Datei, nur der HTML-ausgezeichnete Inhalt - wir befinen uns ja bereits in einer HTML-Seite).
Das verstehe ich nicht ganz. Muss ich jetzt z.B. in die info.php echo oder print Befehle schreiben?
Und v.a. was passiert, wenn dann jemand info.php aufruft?
Dazu übergibst Du mit jedem Link einen Parameter, etwa so: <a href="index.php&page=info">Info</a>....
Schön, danke für diese Anleitung!
@Martin:
Ich habe aber schon versucht, einige Probleme des Iframes per Javascript zu lösen, ...
und damit ein Problem mit einem anderen ergänzt.
Aber meine Seite hat bisher sowieso nur Sinn gemacht, wenn man JS aktiviert hatte, daher war das kein Problem.
(was meine User bisher auch hatten)
Deine Fragestellung lässt erkennen, dass du das Konzept im Grundsatz noch nicht verstanden hast:
So ist es auch, aber danke, durch die Erklärung ist mir einiges klarer geworden.
Lesen bildet.
Und dauert... Aber was sein muss muss sein.
Vielen Dank schonmal,
Raphael
Hallo Raphael,
Das verstehe ich nicht ganz. Muss ich jetzt z.B. in die info.php echo oder print Befehle schreiben?
Zunächst einmal nur HTML. Nur wenn Du Variablen ausgeben willst, brauchst Du echo.
Und v.a. was passiert, wenn dann jemand info.php aufruft?
Das kannst Du beeinflussen. Definiere z.B. eine Konstante in index.php ...
define('IN_INDEX', TRUE);
... und prüfe in den eingebundenen Dateien, ob diese definiert ist. Ist sie es nicht, hast Du einen Direktaufruf und kannst z.B. zur Hauptseite umleiten:
if(!defined('IN_INDEX'))
{
header('Location: index.php');
exit;
}
Ale×
Hi,
Das kannst Du beeinflussen. Definiere z.B. eine Konstante in index.php ...
define('IN_INDEX', TRUE);
... und prüfe in den eingebundenen Dateien, ob diese definiert ist. Ist sie es nicht, hast Du einen Direktaufruf und kannst z.B. zur Hauptseite umleiten:
if(!defined('IN_INDEX'))
{
header('Location: index.php');
exit;
}
>
> Ale×
Wunderbar...perfekt...toll...
Das ist genau das, was ich wollte... \*freufreu\*
VIELEN DANK!!
Jetzt gibts doch noch ein Problem dabei:
Ich habe diese Abfrage in die Datei start.php eingebaut (ganz an den Anfang), wo es auch so funktioniert, wie es soll.
Dann habe ich aber den gleichen Code ganz an den Anfang der Datei info.php eingebaut, jedoch erschint hier nun immer die Fehlermeldung
Warning: Cannot modify header information - headers already sent by (output started at /var/www/web199/html/php/info.php:1) in /var/www/web199/html/php/info.php on line 4
Was ist da jetzt wieder los?
Hallo,
Warning: Cannot modify header information - headers already sent by (output started at /var/www/web199/html/php/info.php:1) in /var/www/web199/html/php/info.php on line 4
ein HTTP-Header kann mit PHP nur gesendet werden, wenn noch keine Ausgabe an den Client (Browser) vorangegangen ist. Sobald das erste Zeichen Nutzdaten ausgegeben wurde (und sei es ein Leerzeichen), ist für Header der Zug abgefahren.
Hier sagt dir die Fehlermeldung: In Zeile 1 von info.php wurde das erste Zeichen ausgegeben, deswegen kann die header-Funktion in Zeile 4 nichts mehr bewirken.
So long,
Martin
Hi,
da aber beide Datein (info und start) mit der Abfrage begonnen haben, habe ich nach weiteren Unterschieden gesucht und bin darauf gestoßen, dass info.php utf-8 konvertiert ist, start.php ANSI.
Das ist auch der Grund, habe ich festgestellt, aber ich brauche die utf-8-Codierung, was kann ich da machen?
Viele Grüße, Raphael
Moin,
da aber beide Datein (info und start) mit der Abfrage begonnen haben, habe ich nach weiteren Unterschieden gesucht und bin darauf gestoßen, dass info.php utf-8 konvertiert ist, start.php ANSI.
das spielt keine Rolle - außer dass unterschiedliche Codierungen jederzeit andere Probleme machen können.
Das ist auch der Grund, habe ich festgestellt, aber ich brauche die utf-8-Codierung, was kann ich da machen?
Produziert dein Editor womöglich UTF-8 mit BOM? Dann lass die BOM weg.
So long,
Martin
Produziert dein Editor womöglich UTF-8 mit BOM? Dann lass die BOM weg.
Ja, so wars. Vielen Dank
Hallo,
header('Location: index.php');
dann korrigiere diesen Codeschnipsel doch bitte noch - der Location-Header muss eine absolute URL angeben. So will es die HTTP-Spezifikation, auch wenn viele Clients auch mit relativen URLs klarkommen.
So long,
Martin
Hallo Martin,
der Location-Header muss eine absolute URL angeben.
Ich mache das der Einfachheit oft so, dann muss auf verschiedenen Servern nichts angepasst werden. Aber Du hast Recht, ganz korrekt ist es nicht. Es macht aber IMHO auch keine Probleme.
Ale×