PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines PHP-Problem


Sergej
2005-09-30, 11:03:51
So, Problem Problem.

Erstmal, hier: http://www.DerAdel.de - Ist unsere Abi-Seite, die ich stellvertretend für unsereren Jahrgang entworfen habe. Im Gegensatz zur Seite vom letzten Jahrgang (http://www.abi-winsen.de/) wirklich ein kleiner Fortschritt ;)

Die Seite besteht aus der Index-Seite mit zwei iFrames, einmal die Spalte rechts und das Content-Feld links daneben. Aber irgendwie ist das mit den iFrames auch nicht das wahre. Deshalb wollte ich es so halten, dass der Content nicht mehr im iFrame geladen wird, sondern per PHP. Problem ist nämlich folgendes: Bei iFrames muss man ja die Höhe und Breite festlegen. Blöd nur, wenn der Inhalt mal kürzer und mal länger ist und man dann diese nervigen Scrollbalken hat.

Also, konkret soll der Content immernoch in separaten Dateien bestehen, aber diese sollen mittels PHP und nicht per iFrame in die Index-Seite geladen werden, und zwar bei einem Klick auf den entsprechenden Menüpunkt oben.

Wie lässt sich das realisieren, dass z.B. bei einem Klick auf "News" die news.htm mittels PHP an die Content-Stelle geladen wird?

*edit* Oder hat jemand Tipps, wie man die Seite auch ganz anders gestalten könnte? Damit meine ich nicht Design oder Aufbau, sondern von der Programmierung her? Das ist jetzt einfaches HTML, gibt es da zufällig irgendwelche ganz modernen angesagten Tricks, die alles irgendwie besser machen? ;)

CSS-mäßig soll's da doch tolle Sachen geben ... hab nur leider keine Ahnung davon ...

Drexel
2005-09-30, 12:10:12
Du schreibst eine index.php z.b.:

$includesite = $_GET['includesite']; //für register_globals=off

if ($includesite != "")
{
$includesite = $includesite . ".html";
include ($includesite);
}
else
{
include ("index.html");
}


Der Aufruf der index.php (im Menü z.B.) müsste dann so aussehen: index.php?includesite=einzuschliessendeseite(ohne .html)

Ansonsten sieht die Seite doch ok aus. Die Seite der Schule würde ich in einem neuen fenster öffnen lassen.

darph
2005-09-30, 12:25:29
Du schreibst eine index.php z.b.:
Das würd ich aber so nicht machen, daß man jede Datei includieren kann.

Wenn, dann so:

switch ($_GET["seite"])
{
case: "news":
include("news.php");
break;

case: "kontakt":
include("contact.php");
break;

default:
include("indexfile.php");
break;
}

Ist zwar mehr Text, aber auf jedenfall fehlerresistent: Wenn irgendjemand was plöhtes eingibt, was es nicht gibt, oder was er nicht sehen darph, wird die Indexseite geladen.

Man kann aber einfach einen globalen header und einen globalen footer definieren, und die einfach zu Beginn und zu Ende einer jeden Seite includieren. Im Header kann man dann sein Navigationsmenü rein schreiben.

Sergej
2005-09-30, 13:33:18
OK, damit wäre das eigentliche Problem gelöst.

Aber jetzt interessiert mich doch, wie man ein Layout ohne Tabellen entwirft, nämlich mit CSS-Containern. Hat da jemand Ahnung?

Macht sowas Sinn? Kann man in einen Container einen Inhalt includieren, so dass der Container bei wechselndem Inhalt entsprechend länger oder kürzer wird?

PatTheMav
2005-09-30, 13:36:54
Seid ihr alle des WAHNSINNS ??!??! ;)

Nein mal ehrlich, überspringt doch einfach mal die absoluten Anfänger-NoNos der Webgestaltung und macht es gleich richtig, dafür fragt ihr hier, dafür sind wir ja da :)

Vorweg: Seiten gehören auf Textbrowser und nicht auf IE6 optimiert, wozu gibts denn CSS und XHTML (welches IE leider beides nicht ohne extra Hacks korrekt zustandebringt), und IFrames ? Die kommen schonmal gleich weg. Zum einen sind die nicht nur nicht mehr im XHTML-Standard vorgesehen (im Transitional-Doctype eben für die Übergangsphase noch erlaubt), da dieser durch das <object>-Tag ersetzt wurde.

Zum PHP: Die "vernünftige" Art und Weise, wie man sowas macht, basiert auf "Templates". Du schaust dir an, welche Bereiche der Seite denn immer gleich bleiben, das sollten bei dir Header und Navigation oben und der Bereich rechts sein. Also lagerst du den HTML-Code dieser Bereiche in externe Dateien aus, z.B. header.html und footer.html - wenn diese Inhalte dynamisch sein sollen, natürlich als .php-Dateien.

Nun lässt du jede Unterseite diese beiden Templates an den richtigen Stellen einbinden, damit diese zum existierenden HTML-Gerüst der aktuellen Seite ein komplettes Dokument darstellen.

Nehmen wir als Beispiel http://www.meineURI.de/lebenslauf/ oder http://www.meineURI.de/lebenslauf.php - je nachdem wie man das strukturieren will. Die index.php (erstes Beispiel) oder lebenslauf.php wird also folgendermaßen zusammengesetzt :

Kopf (header.html per include() in die lebenslauf.php)
Inhalt
Fuss (footer.html per include() in die lebenslauf.php)

Da sich Kopf und Fuss ja nicht ändern, brauchst dich in der lebenslauf.php also nur auf den Lebenslauf konzentrieren. Wenn der Inhalt des Lebenslaufes allerdings etwas im Kopf oder Fuss beeinflussen soll, müssen diese zum einen ebenfalls .php-Dateien sein. Nun musst einfach nur vor dem Includen die Variablen setzen, mit welchen der php-Code im Kopf und Fuss arbeiten können (Beispiele wären hier Titelbilder für Unterseiten im Kopf usw.).

Zur Veranschlaulichung hier das ganze nochmal in vereinfachter Codeform :
Header.php :

<html>
<title>Example</title>
<body>
<div>
<h1>Example-Header - <?php print $title; ?></h1>
<ul>
<li><a href="">Nav-Item #1</a></li>
<li><a href="">Nav-Item #2</a></li>
<li><a href="">Nav-Item #3</a></li>
</ul>
</div>

Lebenslauf.php :

<?php
$title = "Example-Title";

include "/path/to/Header.php";
?>
<p>Example-Paragraph</p>
<?php
include "/path/to/Footer.php";
?>

Footer.php :

</body>
</html>Die Reihenfolge habe ich hier so gewählt, damit dir in etwa klar wird, wie du den "normalen" HTML-Seitenaufbau verteilen musst und wie du durch die Includes den oberen und unteren Teil in jede Unterseite das HTML-Konstrukt "komplettierst".

Auf diese Weise sparst du dir, die Seiten als Variable an eine Index.php übergeben zu müssen, du sparst dir Variablenprüfungen, damit dir niemand ne falsche Seite in dein Konstrukt unterjubeln kann usw. und du sparst dir viel Arbeit, da du so Änderungen am Kopf nur einmal in der statischen Template vornehmen musst und nicht in jeder Seite einzeln.

PatTheMav
2005-09-30, 13:40:22
OK, damit wäre das eigentliche Problem gelöst.

Aber jetzt interessiert mich doch, wie man ein Layout ohne Tabellen entwirft, nämlich mit CSS-Containern. Hat da jemand Ahnung?

Macht sowas Sinn? Kann man in einen Container einen Inhalt includieren, so dass der Container bei wechselndem Inhalt entsprechend länger oder kürzer wird?Oh oh oh, das würde ein noch längerer Artikel werden ;)

Also du kannst einem Box-Element ne feste Höhe und Breite geben und dann per overflow: auto; dafür sorgen, das es Scrollbalken erhält, wenn der Content mehr Platz beansprucht als die Box ihm gibt. IE würde normalerweise die Box erweitern wie es ihm passt, da es entgegen der Standards sich nicht an feste Grössen hält und min-width, bzw. min-height für wirkliche "minimal"-Angaben, welche erweitert werden dürften, nicht kennt (soviel zur IE-"Optimierung").

Das hat optisch denselben Effekt wie ein iFrame, wenn das ganze als <object> machst, kannst das evtl. sogar losgelöst von der Seite machen, aber ich bin mir nicht sicher, ob man innerhalb eines Objekts genauso losgelöst von der umgebenden Seite navigieren kann wie im iFrame.

Genaueres kannst du hier nachlesen, die Seite enthält Unmengen mit Beispielen versehene Hilfen und Dokumentation zu CSS, XHTML und vielem mehr, ich denke mal, daß diese Seite dir genauso helfen wird wie sie mir vor knapp 2 Jahren geholfen hat, als ich mich in CSS reingefuchst hab :

http://academ.hvcc.edu/~kantopet/old/css/index.php?page=css+clipping&parent=css+page+layout

darph
2005-09-30, 13:47:29
Zum PHP: Die "vernünftige" Art und Weise, wie man sowas macht, basiert auf "Templates".
Naja, aber so Templategefuddel kann für den Anfänger dann doch schon abschreckend wirken. Spätestens dann, wenn man dynamische Inhalte, wie variable Zeilenzahl in einer Tabelle, haben will.

Das mit den Header/Footer Files, was ich auch schon erwähnte, ist allerdings auch kein Template-System. :)

Drexel
2005-09-30, 14:15:08
Das mit den Header/Footer Files, was ich auch schon erwähnte, ist allerdings auch kein Template-System. :)

Das wollte ich gerade auch noch einwerfen und wierum man includiert ist für mich kein sonderlich großer Unterschied. Er wollte eine einfache Lösung und die hat er bekommen.

Für HTML und CSS empfehle ich dir: http://de.selfhtml.org/ ;)

Sergej
2005-09-30, 14:16:55
OK OK, hab das mit dem "Templates" jetzt mal probiert, funktioniert gut. Ist ja sozusagen genau andersherum gedacht, wie ich es haben wollte ;)

Aber eine Frage: Warum sollte ich nicht eine Seite machen, und komplett alles includieren? Also auch z.B. den inhalt des Lebenslaufes includieren? Was spricht dagegen?

darph
2005-09-30, 14:35:45
Was spricht dagegen?
Zunächst mal die Logik. Du sortierst ja auch net alle deine Akten in einen Ordner ohne da Trennblätter rein zu thun.

Zum Anderen die Übersicht.

Und die Suchmaschinenfreundlichkeit: Einfach nur eine Seite zu haben, ist für eine Suchmaschine nicht wirklich spannend. -> Schlechtes Ranking.

www.seite.de/news.html ist, völlig abgesehen davon, nunmal deutlich besser zu merken und sieht wesentlich schöner aus als www.seite.de/index.php?seite=news&andere_variable=blah etc...

Grundsätzlich solltest du soviel von den internen Werkeleien deiner Seite verbergen wie nur möglich. Je weniger die Leute davon sehen, desto weniger Schindluder können sie damit treiben. ;)

Sergej
2005-09-30, 15:17:20
So, hier mal die Preview nach der Änderung:

http://abiwinsen.ab.funpic.de/test/home.php

Gast
2005-09-30, 17:45:07
Auf diese Weise sparst du dir, die Seiten als Variable an eine Index.php übergeben zu müssen, du sparst dir Variablenprüfungen, damit dir niemand ne falsche Seite in dein Konstrukt unterjubeln kann usw. und du sparst dir viel Arbeit, da du so Änderungen am Kopf nur einmal in der statischen Template vornehmen musst und nicht in jeder Seite einzeln.

Nein. Man kann z.B. auch alles in einen Ordner schieben z.b. "content/" und keiner kann irgendwas einbinden.

Gast
2005-09-30, 17:46:46
...und man muss nihct in jede datei die Kopf/Fußzeile "includieren". Kann von Vorteil sein bei kleineren Seiten.

Sergej
2005-09-30, 18:54:58
So, ein neues Problem ;)

Der Vote auf der rechten Seite wird nicht korrekt aktualisiert. Man hat abgestimmt, aber wenn man sich eine andere Seite ansieht, kann man wieder abstimmen: Tut man es, sagt der Vote natürlich, man habe schon abgestimmt. Was tun?

Hier die Seite: www.deradel.de

PatTheMav
2005-10-01, 00:34:44
...und man muss nihct in jede datei die Kopf/Fußzeile "includieren". Kann von Vorteil sein bei kleineren Seiten.Egal ob kleine oder grosse Seite, Content der bei jeder Unterseite identisch ist, gehört ausgelagert, ansonsten mach man sich auch bei kleinen Projekten doppelt und dreifach Arbeit, wenn man z.B. nur etwas an der Navigation ändern will. Ich kenne keinen, der statt nur einer Datei alle Unterseiten einzeln abändern will. Zumal er den Include-Befehl in den Unterseiten ja nie wieder abändern muss normalerweise.

Und das das abschreckend wirken könnte: Mag sein, aber ich finde das nicht schlimm. Wer eine ordentliche Webseite erstellen will, der darf Arbeits- und Lernaufwand nicht scheuen, ich muss ja auch für einige Projekte ab und zu was neues Erlernen, um es vernünftig lösen zu können :)

Wegen dem Poll - es kann sein, daß man dort evtl. noch was am Codeschnipsel anpassen muss. Ich könnt mir höchstens vorstellen, daß dort ein Cookie nicht richtig gespeichert oder ausgelesen wird oder das Cookiescript sich mit den verschiedenen Unterseiten verheddert.

Kinman
2005-10-01, 03:52:20
Ich glaube das war so gemeint

den content in die index.php inkludieren und in der index ist das ganz header / footer zeugs drin


...
<body>
<?php include("content/" . $site . ".htm"); ?>
</body>
...


mfg Kinman

Kinman
2005-10-01, 03:54:01
Das würd ich aber so nicht machen, daß man jede Datei includieren kann.

Wenn, dann so:

switch ($_GET["seite"])
{
case: "news":
include("news.php");
break;

case: "kontakt":
include("contact.php");
break;

default:
include("indexfile.php");
break;
}

Ist zwar mehr Text, aber auf jedenfall fehlerresistent: Wenn irgendjemand was plöhtes eingibt, was es nicht gibt, oder was er nicht sehen darph, wird die Indexseite geladen.

Man kann aber einfach einen globalen header und einen globalen footer definieren, und die einfach zu Beginn und zu Ende einer jeden Seite includieren. Im Header kann man dann sein Navigationsmenü rein schreiben.

Som mach ich das sicher nie wieder.....viel zu viel schreibarbeit.
Da mach ich lieber ein Array wo alle gültigen verzeichnisse drinstehen und lass das vorher überprüfen.

mfg Kinman

Drexel
2005-10-01, 09:40:21
Ich glaube das war so gemeint

den content in die index.php inkludieren und in der index ist das ganz header / footer zeugs drin


Jap genauso ist es gemeint und auch programmiert. Das einzige Argument, was ich zählen lass ist das mit den Suchmaschinen, wobei es da auch mehr auf den Inhalt als den Namen der Datei ankommt.

cyrix1
2005-10-01, 13:56:36
Zu dem Include noch eine Frage meinerseits,
ich habe bisher ne reine html-seite, auf der ich nun einen php-basierten counter unten links hinklatschen will.
die php-datei vom counter funktioniert einwandfrei, wenn man sie direkt aufruft.
Binde ich diese Datei aber per include() in die html-datei an der richtigen stelle ein, erscheint nichts.
Mein webserver beherrscht jedoch php4, man kann die datei ja auch problemlos direkt aufrufen.

Habe die html-dateien auch mal als php definiert, da ich dachte es könnte daran liegen.
Es tut sich aber einfach nichts.
Was mache ich falsch?

wenn ich den php-counter per <ifame> einbinde, funktioniert dieser einwandfrei. allerdings habe ich dann das problem, dass ich eine feste framegröße festlegen muss, und somit ist der counter (ist grafisch mit zahlwerten) nicht mehr zentriert ist.

Weiß jemand rat?

edit:

problem gelöst, auch ohne php include.
musste einfach nur beim counter die echo-ausgabe zentrieren =)

Kinman
2005-10-01, 14:31:40
Jap genauso ist es gemeint und auch programmiert. Das einzige Argument, was ich zählen lass ist das mit den Suchmaschinen, wobei es da auch mehr auf den Inhalt als den Namen der Datei ankommt.

Soweit ich weis gelten index.php?site=news & index.php?site=about als eigene seiten. Bin mir aber nicht sicher.

mfg Kinman

darph
2005-10-01, 14:54:54
Soweit ich weis gelten index.php?site=news & index.php?site=about als eigene seiten. Bin mir aber nicht sicher.

mfg Kinman
Google verfolgt solche Links als einzelne Seiten, ja. Bei der Bewertung einer Seite sind aber "Permalinks" deutlich besser als Variablen. Da ignoriert Google get-Variablen offenbar.

astanoth
2005-10-01, 21:23:41
Egal ob kleine oder grosse Seite, Content der bei jeder Unterseite identisch ist, gehört ausgelagert, ansonsten mach man sich auch bei kleinen Projekten doppelt und dreifach Arbeit, wenn man z.B. nur etwas an der Navigation ändern will. Ich kenne keinen, der statt nur einer Datei alle Unterseiten einzeln abändern will. Zumal er den Include-Befehl in den Unterseiten ja nie wieder abändern muss normalerweise.


Der Gast war ich und du hast mich anscheinend nicht richtig verstanden. Wie Kinman es auch ausführt, birgt es KEIN Sicherheitsrisiko bzw. das selbe, ob man nun head|content|foot oder indexa|content|indexb verwendet. Man kann sehr einfach verhindern, dass eine falsche Seite includiert wird. Am einfachsten natürlich über die .htaccess, welche aber nicht jeder isp so einfach freigiebt. Bei beiden Methoden kann man problemlos das 'Falschincludieren' verhindern und dann die 404page definieren. Ich verwende beide Methoden, wobei bei kleineren Seiten die zweitere Methode wohl sinnvoller ist, da sie einiges an code und Arbeit spart. Wer möchte da schon auf jeder Seite head.inc und foot.inc includieren ;)

Du hast mit deinem post natürlich vollkommen Recht, aber leider überhaupt nicht auf meinen 'Senf' geantwortet.