Optimaler Aufbau der Homepage mit PHP

RiceHigh

Grünschnabel
Hi,

ich habe mich schon durch diverse php Tutorials gearbeitet.
Was ich jetzt aber gerne wissen würde, ist, wie ich die Struktur meiner Homepage am optimalsten Aufbaue.
Mir geht es in erster Linie um das Gerüst der Page, damit unter Anderem die Wartung der Page auch leichter ist.
Macht es Sinn, die ganzen Elemente wie Header, Menu, Content etc. in einzelne php Dateien zu packen, und dann in die Index.php zu includen?
Wie handhabt ihr das?
Habt ihr für jeden Menupunkt eine .php Datei, oder wirklich nur die index.php?
Oder wenn man für einen Menupunkt an verschiedenen Stellen, Content einfügen will etc. wie macht man das dann am besten?
Wie würde denn eure Struktur der Homepage aussehen, wenn ihr ne Minipage mit ein paar Menupunkten machen müsstet?
Da gibt es ja sicherlich einige Ansätze, was gut und was weniger gut ist.

Danke vorab.

Gruß
RH
 
Zuletzt bearbeitet:
Hi,

also, wenn es sich nur um eine kleine Privat-Seite mit wenigen Links handelt, würde mir persönlich eine index.php ausreichen, aber ich denke, dass das jeder anders handhabt. Ich mag es nicht, wenn zu viele Dateien gibt, weil man irgendwann die Übersicht verliert.
Aber eigentlich includet man nicht extra das Menü, den Header, usw.

Ich denke es kommt auf den Aufwand an. Aber meistens besteht ein Header z.B. nur aus einer Grafikdatei, weshalb man dafür nicht Extra eine PHP Datei erstellen sollte. Das würde ich einfach mit CSS formatieren.
 
Hmm, gehen wir mal von 8-10 Menupunkten aus, wo es bei diversen Menupunkten vielleicht noch Unterpunkte gibt.
Ich dachte eher an so eine Struktur.
 
Bei Projekten die ich von Grund auf selber schreibe, lege ich mir meistens eine kleine vorgefertigte Ordnerstruktur an.
Code:
/control/
/controller/
/css/
/images/
/includes/
/views/
/index.php

/control/ beinhaltet evtl. ein Administrationscenter o. ä.
/controller/ beinhaltet den ausführbaren PHP Code der einzelnen Module.
/includes/ ist der Platz für eigene oder externe Bibliotheken die eingebunden werden sollen
/views/ beinhaltet die Templatedateien, ob jetzt reiner HTML Code, eine Templateengine oder ähnliches

Die index.php setzt dabei nur Variablen fest, holt z. B. die config.inc.php aus /includes/ und behandelt die Requests, sprich bindet je nach URL den richtigen Controller ein.
Und ja, bei mir ist alles aufgetrennt in eigene Dateien, sprich head.php hat eine eigene, als auch das die eigene head.tpl.
 
Ich finde, dass da auch nichts extra includet werden muss.

HTML:
<ul>
<li>Obermenüpunkt 1</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
<li>Obermenüpunkt 2</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
<li>Obermenüpunkt 3</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
</ul>

... usw

Also, ich verzichte da lieber auf einen Extra-Include Befehl. Und wenn man das ganze noch dynamisch erstellt mit PHP, hat man noch mehr Übersicht.
 
Ich handhabe das immer so:

index.php:
PHP:
<html>
  <head>
    <title>Bla</title>
  </head>
  <body>
  <div>menü: <a href="./index.php?site=home">Home</a>
  <div<?php loadContent(); ?>
  </body>
</html>
und die Funktion loadContent() sieht dann so aus:
PHP:
function loadContent(){
  $valid_pages = array("home" => "home.php", "seite2" => "was_anderes.php");
  $page = (isset($_GET["site"]) && isset($valid_pages[$_GET["site"]))?$_GET["site"]:"home";
  include $valid_pages[$page];
}


}
 
Schon interessant zu sehen, wie verschieden die Ausführungen da sind.
Hat noch jemand ein paar Beispiele ?
Mich würde interessieren, wie genau ihr den php Code einsetzt.
 
Ich finde, dass da auch nichts extra includet werden muss.

HTML:
<ul>
<li>Obermenüpunkt 1</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
<li>Obermenüpunkt 2</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
<li>Obermenüpunkt 3</li>
   <ul>
           <li>Unterpunkt 1</li>
           <li>Unterpunkt 2</li>
           <li>Unterpunkt 3</li>
   </ul>
</ul>

... usw

Also, ich verzichte da lieber auf einen Extra-Include Befehl. Und wenn man das ganze noch dynamisch erstellt mit PHP, hat man noch mehr Übersicht.

Also sowas geht mal gar nich find ich ... Heutzutage wird versucht so wenig Statik wie möglich zu haben.

Bei mir ist das von Fall zuFall unterschiedlich, je nachdem was für Laune ich habe oder wie groß das Projekt werden soll. Aber generell verwende ich eine ähnliche Vorgehensweise wie Felix Jacobi, sinnvolle Unterteilungen machen und MVC verwenden, das heißt ausführende Module (Controller) haben und zu jedem dieser Module ein entsprechendes Template für die Darstellung (View), die Verwendung variiert dabei immer. Mal verwende ich Klassen, mal einfach prozeduralen Code in PHP-Dateien unterteilt. Eigentlich verwende ich aber meist Klassen, daher werden einfach im Kopfteil von index.php alle benötigten Klassen includet und normale Includes fallen komplett weg, weil ich kann das irgendwie nicht leiden, wenn mitten im Code eine include-Anweisung kommt, ich bekomm dabei die Krätze, keine Ahnung. Menüs z.B. lasse ich immer generieren, also nicht wie Lisali statischen HTML-Code, sondern auf irgendeine Weise dynamisch generieren. Das kann man mit Arrays in entsprechenden PHP-Dateien machen, also die Menüeigenschaften wie Menüpunkte, Ziele etc. Das Problem dabei ist, dass man dann aber auch wieder die PHP-Datei selbst anpassen muss, falls neue Menüs hinzukommen oder welche geändert werden. Ich bevorzuge daher inzwischen die Datenbankvariante. Da werden dann einfach entsprechend Tabellen für erstellt und gefüllt. Sollte sich was ändern, so wird dann einfach in der Datenbank an der entsprechenden Stelle gefummelt und gut is. Das Gleiche mit dem Content. Sowas kommt bei mir nicht in eine PHP-Datei, sondern in die Datenbank. Dafür braucht man etwas Erfahrung und muss Ideen für die Umsetzung haben, aber das geht dann dafür umso besser, auch wenn es mehr Zeit beansprucht. Außerdem kann man das System dann für weitere Projekte gut verwenden, da sich der generelle Aufbau nicht großartig ändert, das Prinzip bleibt ja, bekommt nur ein anderes Aussehen.

Wie gesagt, nach Möglichkeit so wenig Statik aufbauen, wie nur geht. Alles, was in irgend einer Weise generierbar ist, generieren lassen und die Dateien so klein wie Möglich halten. Es gibt keine wirklichen Richtlinien, aber man sagt "Alles, was länger als eine Seite ist und wo man scrollen muss, ist Mist". So krass wird das natürlich nicht gesehen, aber soll heißen, dass man alles, was irgendwie ausgelagert werden kann auch ausgelagert werden sollte. Natürlich braucht man nicht übertreiben, aber kleinere Codeschnippsel zu lesen ist angenehmer als übertrieben lange Codes, wo man immer hin- und herscrollen muss und nachher gar nicht mehr weiß wo man zum Schluss war.

EDIT:
Wie man vorgeht ist im Endeffekt davon abhängig, wie groß die Sache wird. Aber gewöhn dir trotzdem eine saubere Struktur an, wie Felix Jacobi es gezeigt hat. Meine sieht z.B. so aus:
/index.php
/inc/
/inc/classes/
/inc/config/
/inc/images/
/inc/css/
/inc/tpl/
/inc/js/

/inc/classes/ kann dabei (je nach Umfang) noch die Unterordner controller/ und utils/ etc. enthalten. Hin und wieder kommen noch Ordner hinzu oder werden weggelassen, kommt auf den Fall dann an. Eine saubere Ordnerstruktur ist das A&O, aber im Vorfeld festlegen und daran halten. Wenn du die Struktur im Nachhinein noch änderst, dann könnten Verweise nicht mehr stimmen und dann ist der Spaß groß ^^ Deswegen plant man ein Projekt auch möglichst gut durch bevor man auch die erste Datei anlegt, im Nachhinein Änderungen machen zu müssen ist einfach schrecklich.

EDIT2:
Für einen leichteren Umgang mit den Pfaden kann man Konstanten in jeder PHP-Datei definieren (falls noch nicht definiert) und mit diesen Arbeiten. Sollte sich dann doch mal ein Pfad ändern, dann braucht man nur noch den Wert der Konstante ändern, also wenig Aufwand. Das kann z.B. so aussehen:
PHP:
if(!defined('INC_DIR_CLASS')) {
	define('INC_DIR_CLASS', './');
}

In index.php werden dann einfach alle Konstanten definiert, da die Pfade vom Startpunkt (index.php) ausgehend verwendet werden (die Definitionen in den anderen PHP-Dateien sind nur sicherheitsrelevant, falls doch mal eine Konstante vergessen wurde, weil es sich nicht lohnte). Das kann dann so aussehen:
PHP:
// Verzeichnis-Konstanten
if(!defined('INC_DIR_CLASS')) {
	define('INC_DIR_CLASS', './inc/class/');
}
if(!defined('INC_DIR_CONFIG')) {
	define('INC_DIR_CONFIG', './inc/config/');
}
if(!defined('INC_DIR_TPL')) {
	define('INC_DIR_TPL', './inc/tpl/');
}

// Dateien importieren
include_once INC_DIR_CONFIG . "mysql.conf.php";
include_once INC_DIR_CLASS . "MySqlDbConnector.class.php";
include_once INC_DIR_CLASS . "LoginController.class.php";
include_once INC_DIR_CLASS . "MenuController.class.php";
include_once INC_DIR_CLASS . "System.class.php";
 
Zuletzt bearbeitet:
Wenn man eigene Klassen benutzt kann man natürlich auch noch eine eigene [phpf]__autoload[/phpf] Funktion schreiben. Dann brauch man nämlich nur noch eine Konfigurationsdatei einbinden, in der die Funktion liegt, und dann kann man einfacher mit den Klassen arbeiten.
 
Ja klar, hab ja nur geschrieben, wie ich das mache. Ist zwar weit davon entfernt perfekt zu sein, aber es erleichtert das Arbeiten an mancher Stelle sehr.
 
Zurück