Programmieren > Sprachen > PHP

Just-PHP

Eine sehr einfach gehaltene PHP-Applikation. Sie hat den Vorteil, dass man hierzu keinerlei Kenntnisse eines Frameworks oder höherer Programmiertechniken benötigt, sondern nur sehr rudimentäres PHP. Deshalb eignet sie sich sehr gut, um darauf weitere Dinge auszuprobieren, ohne, dass die darunterliegende PHP-Applikation unverständliche Dinge tut.

Die grundlegende Applikation besteht nur aus den paar Dateien, die hier auf der Seite dargestellt sind und der Navigation, die auf der Seite Navigation vorgestellt wird. Schon diese einfache Applikation ist problemlos in der Lage als einfache Knowledge-Base zu funktionieren, da man mit ihr einfach Seiten und Unterseiten generieren kann.

Die Dateien-Struktur ist dabei wie folgt:

index.php

Diese Datei ist sehr einfach gehalten. Es wird am Anfang die Datei top.php und am Schluss die Datei bottom.php eingelesen. Dazwischen ist der eigentliche Inhalt der Seite. Die beiden eingebundenen Dateien erlauben es auf einfache Weise viele verschiedene Webseiten zu bauen, die zwar einen unterschiedlichen Inhalt, aber dieselbe Struktur und Design haben.

<?php include("templates/top.php"); ?>

<h1>Knowledge-Base</h1>

<p>Hier der Text der Seite</p>

<?php
include("templates/bottom.php");

top.php

Diese Datei wird von allen Seiten eingebunden und enthält den kompletten Beginn und Kopf der HTML-Seite, also Dinge wie Titel, Einbindungen von CSS und Javascript-Dateien und anderer Dinge. Des weiteren baut sie eine einfache Struktur auf. Eine Kopfzeile mit Titel der Webseite und einer Top-Navigation. Darunter ein zweispaltiges Design, mit Navigation auf der linken Seite und eigentlichem Inhalt der Seite rechts davon. Der DIV für den eigentlichen Inhalt wird hier nur geöffnet und kann dann in der Seite, die diese Datei einfügt gefüllt werden.

Ebenfalls eingebunden wird hier eine Datei load.php, die an anderer Stelle erklärt wird.

<!DOCTYPE html>
<?php
date_default_timezone_set('Europe/Berlin');
require_once("classes/load.php");
?>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title><?php echo $title ? $title : 'Knowledge'; ?></title>
        <link rel='stylesheet' id='ewstyle-css'  href='/css/erichweigand.css' type='text/css' media='all' />
    </head> 
    <body>
        <div class="navbar-top">
            <a class="navbar-brand" href="/">Knowledge</a>
            <ul>
                <li><a href="/">Beispiel-Seite</a> | </li>
            </ul>
        </div>
        <div class="container" role="main">
            <div class="col-nav">
                <ul>
                    <li>
                        <a href="/index.php">Wissens-Seite</a>
                    </li>
                </ul>
            </div>
            <div class="col-content">

load.php

PHP-Klassen werden der Übersicht halber am besten in separaten Dateien implementiert (Beispiel: Navigation.php). In dieser Software kommen diese in das Verzeichnis classes. Zusammengehörige Klassen kommen hier in eigene Unterverzeichnisse. Damit dies Klassen dann im Programm verwendet werden können müssen sie (mit include, include_once, require, require_once) eingelesen werden.

Komplexe Frameworks haben hier ausgefeilte Autoloader die sicherstellen, dass die Dateien eingebunden werden. Für diese einfache Software binde ich alle Dateien, die ich irgendwo brauche in der Datei über die Datei load.php ganz weit oben direkt in der Datei top.php ein. Damit ist sichergestellt, dass die Dateien vorhanden sind, wenn ich sie benötige. Ein weiterer Vorteil ist: Wenn ich die Klassen in manchen Fällen doch früher brauche genügt ein Einbinden der Datei load.php. Deswegen sind alle Dateien mit require_once geladen. So ist sichergestellt, dass sie in einem solchen Fall nicht zweimal geladen werden.

Der Nachteil ist natürlich, dass ich auf den allermeisten Seiten Dateien einbinde, die ich nicht brauche. Aber in einer Zeit, in der CPU-Taktfrequenzen sich im GHz-Bereich bewegen und Arbeitsspeicher in GByte bemessen sind, ergibt sich selbst bei hunderten eingelesener Dateien kein merklicher Geschwindigkeitsunterschied.

<?php
//Navigation
require_once("classes/Navigation.php");

// Allgemeine Datenbank-Klassen 
// ...

bottom.php

Diese Datei ist wieder weniger aufregend. Hier werden nur alle im top.php geöffneten DIVs wieder geschlossen. Wer möchte, kann in dieser Datei noch einen Footer unterbringen, der dann auf jeder Seite eingefügt wird.

            </div>
        </div>
    </body>
</html>

template.php

Das Template-File ist als Vorlage gedacht für alle weiteren Seiten, die mit JustPHP umgesetzt werden. Über die Variable $title kann der Name der Seite in den Header der HTML-Seite gesetzt werden. Die while - Schleife ist ein Trick, wie man einfach mit tiefer verschachtelten Seitenstrukturen umgehen kann. Wenn man Unterseiten baut, die in eignenen Unterverzeichnissen einsortiert sind, geht das PHP-Skript eigenständig den Verzeichnisbaum so lange nach oben, bis es die benötigte include - Datei findet. Da das Skript danach dann im Root-Verzeichnis der Applikation ist, funktionieren dann auch alle includes innerhalb von top.php die wahrscheinlich relativ zum Web-Root definiert sind.

<?php
// In das Root-Verzeichnis wechseln, damit die include-Befehle korrekt funktionieren.
while(!file_exists("templates/top.php")) {
    chdir("..");
}
$title = "Mein Leben";
include("templates/top.php");
?>
<h1>Template</h1>
<p>
    Hier der Inhalt der Seite.
</p>
<?php
include("templates/bottom.php");

erichweigand.css

Auch die CSS-Datei ist sehr knapp gehalten. Sie setzt die Titelzeile mit der Top-Navigation auf schwarzen Hintergrund mit weisser Schrift und auch weissen Links. Dazu definiert sie das 2-spaltige Layout mit der linken Navigation und dem Seiteninhalt rechts.

body {
    margin: 0;
    background-color: #fff;
}
* {
    box-sizing: border-box;
}
a {
    text-decoration: none;
}
.container {
    width: 100%;
}
.col-nav, .col-content {
    position: relative;
    float: left;
}
.col-content {
    width: 75%;
}
.col-nav {
    width: 25%;
}
.navbar-brand {
    font-size: 20px; 
}
.navbar-top {
    background-color: #000;
    color: #ddd;
    padding: 15px;
}
.navbar-top a {
    color: #ddd;
}
.navbar-top ul {
    list-style-type: none;
    display: inline;
}
.navbar-top li {
    display: inline;
}