Dynamischer Title im Header

L

LastChaosTyp

Guest
Hallo PCGHler,

ich bin relativ neu im Webdesign und bin aktuell dabei, die Homepage meiner Gilde (die ich auch ursprünglich geschrieben habe) komplett zu überarbeiten. Das ganze soll jetzt deutlich dynamischer und leichter zu pflegen sein.
Vorher hatte ich für jede Seite eine eigene PHP-Datei, dazu kamen sämtliche Config-Files und Includes wie Header, Footer etc. Da hatte ich aber das Problem, dass ich bei jeder einzelnen Seite immer wieder das Menü statisch einpflegen musste und sobald ich dort z.B. etwas ändern wollte, einmal durch alle Seiten durch musste und manuell überall die Änderung eintragen musste. Ebenfalls wurde beim Aufruf des User-internen Bereichs der Seite immer alles geladen, und dann wurde lediglich per Buttondruck in einem Untermenü der entsprechende Teil eingeblendet und alles andere ausgeblendet => Das war sehr unschön und unperformant!
Nun habe ich mir ein neues System überlegt, wobei ich aber noch ein paar Fragen habe. Eigentlich habe auch nicht ich mir dieses Prinzip überlegt, es ist wohl sehr verbreitet. Man schreibt eine index.php, in die alles wie das Menü, der Header, der Footer etc. reinkommt. Dazu wird dann lediglich der Content aus einer ausgelagerten Datei geladen und fertig ist die Seite (Wie eine kleine Art eines CMS). Bisher sieht meine index.php wie folgt aus:

<?php
session_start();
require_once("config.php");
require_once("functions.php");

if(isset($_GET["page"]) == true) {
$parameter["page"] = $_GET["page"];
} else {
$parameter["page"] = "default";
}
$page["content"] = getPage($parameter["page"]);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $page_title; ?> - Hordentlich Vendetta</title>
<?php require_once("header.php"); ?>
</head>
<body>
<div id="header-wrapper">
<div id="header" class="container">
<div id="logo">
<span class="icon icon-cog"></span>
<h1><a href="/">Hordentlich Vendetta</a></h1>
</div>
<div id="menu">
<ul>
<li><a href="/" accesskey="1" title="">Home</a></li>
<li><a href="/about" accesskey="2" title="">About</a></li>
<li><a href="/downloads" accesskey="3" title="">Add-Ons</a></li>
<li><a href="/intern" accesskey="4" title="">Intern</a></li>
<li><a href="/kontakt" accesskey="5" title="">Kontakt</a></li>
</ul>
</div>
</div>
</div>
<?php include("error.php"); ?>
<?php echo $page["content"]; ?>
<?php require_once("footer.php"); ?>
</body>
</html>

(Ich kann den Code leider nicht in code-Tags hauen, da er sonst als HTML interpretiert wird und dementsprechend formatiert wird :D )

Jetzt ist mir aber nicht ganz klar, wie ich so Sachen wie den aktiven Menüpunkt oder den Header-Title am besten an die index.php übergeben kann. Liegt daran, dass ich den Content erst im body einbinde, der header ja aber schon vorher beschrieben werden muss. Klar könnte man die ganzen Daten in eine Datenbank oder so schreiben und dann beim Aufruf der Seite auslesen, finde ich aber doch sehr umständlich... Gibt es da eine einfachere Methode für oder sollte ich nochmal das Konzept der Seite überarbeiten und das ganze etwas umstrukturieren?

Danke schonmal für Vorschläge, ich bin offen für alles ;)

Henri
 
Du lädst den Content deiner Seite doch direkt mit der Funktion getPage(). Somit lädst du den gesamten Content doch als erstes und nicht den Header. Zumindest zeigt mir das dein Code.

Aber beschreibe am besten mal, was du mit "aktiven Menüpunkt" meinst bzw. was du damit vorhast. Den Kopf-Titel kannst du einfach mit einer globalen Variable erledigen und diese im Subscript deiner Unterseite neu zuweisen.
 
Der "aktive Menüpunkt" hat einfach die Klasse "active" zugewiesen bekommen und wurde dann per CSS anders formatiert(hat einfach einen weißen anstatt von einem blauen Hintergrund in der Menü-Bar bekommen).
Das sind die Methoden wie getPage().

functions.php
Code:
<?php
	function getPage($parameter) {
		global $pages;
		
		$path = "$pages/$parameter.php";
		if(file_exists($path)) {
			return openPage($path);
		} else {
			return openPage("$pages/default.php");
			$_SESSION["errorid"] = 26;
		}
	}
	
	function openPage($url) {
		$file = fopen($url, "r");
		$content = fread($file, filesize($url));
		fclose($file);
		return $content;
	}
?>

Das mit der globalen Variable ist eine sehr gute Idee, warum bin ich da denn nicht selbst draufgekommen? >.<

Edit: Mir ist gerade ein Problem aufgefallen: Ich lese die Datei ja nur ein, aber der PHP-Code wird ja gar nicht ausgeführt, da ich die Datei ja nicht im include einbinde. Hat da jemand eine passende Lösung bzw. Struktur, wie ich den Content und die anderen Variablen gut trennen kann? Nachfolgend noch die Startseite(default.php) als Beispiel für jede x-beliebige Seite.

default.php
Code:
<?php
        gloabl $page_title;
	$page_title = "Startseite";
?>
<h1>Hier ist dann der ganze weitere HTML-Code</h1>

index.php
Code:
<?php
	session_start();
	require_once("config.php");
	require_once("functions.php"); 
	
	$page_title = "";
	if(isset($_GET["page"]) == true) {
		$parameter["page"] = $_GET["page"];
	} else {
		$parameter["page"] = "default";		
	}
	$page["content"] = getPage($parameter["page"]);
?>
< html >
    < head >
          < title ><?php echo $page_title ?> - Hordentlich Vendetta< /title >
	   <?php require_once("header.php"); ?>
    < /head >
< /html >
 
Zuletzt bearbeitet von einem Moderator:
Ja mit Include einbinden. Um den Content in eine Variable zu schieben, kannst du den OutputBuffer verwenden: PHP: Output-Control-Funktionen - Manual

Damit kannst du alle Echo's oder HTML-Ausgaben puffern. Du rufst vor dem Include ob_start auf und nach dem Include schreibst du die Rückgabe von ob_get_clean in die Content-Variable.

EDIT:
Verwende statt ob_get_clean lieber ob_get_contents und direkt danach ob_end_clean. Ansonsten kann es passieren, das deine Seite nicht angezeigt wird, da mit ob_get_clean der Puffer aktiviert bleibt ^^

PS: Du solltest bei deiner Funktion getPage im Else-Block die beiden Zeilen return ... und $_SESSION ... einmal tauschen. Denn alles nach Return wird ignoriert und du würdest keine Error-ID in die Session bekommen. Ich gehe sowieso davon aus, das du die Error-ID in der error.php verarbeitest. Da kannst du das ganze ebenfalls mit einer globalen Variable machen. Denn der Error wird ja noch vor der ersten Ausgabe ermittelt und du willst den Error ja auch in der Ausgabe angezeigt bekommen. Da brauchst du keine Session für. Die macht nur Sinn, wenn diese Info in den nächsten Request muss. Das ist aber bei dir nicht der Fall. Sessions sollten sowieso mit Fingerspitzengefühl eingesetzt werden. Denn je nach Serverkonfiguration kann das ständige schreiben in Sessions massive Probleme bereiten (was Performance angeht und bei Servern mit SSD vor allem bei der Lebensdauer).
 
Zuletzt bearbeitet:
DANKE! Das ist echt eine sehr geile Funktion, wusste gar nicht, dass sowas mit PHP geht :D Jetzt läuft das mit dem Titel, wenn es nochmal ein Problem gibt, melde ich mich ;)
 
Zurück