Knowledge
In diesem Tutorial bauen wir mit Freezed eine kleine Website von Grund auf: eine Startseite, zwei Unterseiten und ein Menü im Header. Als Beispiel dient die fiktive „Rösterei West“, eine Kaffeerösterei in Bochum.
Dabei lernen Sie,
freezed.config.php liegen,variables.php entstehen,freezed:link verlinkt werden.Das Theme bleibt bewusst klein. Es kommt mit purem CSS aus, ohne JavaScript und ohne Build-Tool. Das Stylesheet liegt schon fertig vor, die Fluid-Templates bauen wir Schritt für Schritt gemeinsam.
Zuerst prüfen wir kurz die PHP-Version:
php -v
Schritt 1
Den Einstieg macht das
freezed-skeleton, ein
Starter-Projekt mit gerade mal einer composer.json, einem Docker-Setup
und einer .gitignore. Alles Weitere erzeugt Freezed beim Installieren.
Freezed ist noch Beta, deshalb braucht Composer beim Anlegen das Flag
--stability=beta:
composer create-project --stability=beta neuedaten/freezed-skeleton my-site
cd my-site
Composer lädt die Engine neuedaten/freezed und führt danach automatisch
freezed install aus. Dieser Befehl legt die Projektordner an und
kopiert ein Standard-Theme samt drei Beispielseiten hinein:
Wir bauen die Seite einmal, um zu sehen, dass alles funktioniert. Freezed meldet den Build in einer Zeile:
./vendor/bin/freezed build
Built 3 pages (3 files, 2 resources) in 14 ms
Das Ergebnis liegt in public/. Zum Anschauen starten wir am besten den
Entwicklungsmodus: Er baut die Seite, startet einen lokalen Webserver und baut bei
jeder Änderung neu.
./vendor/bin/freezed run
Wir öffnen http://localhost:8080 und sehen das Standard-Theme mit
den Beispielseiten:
Schritt 2
Das Standard-Theme taugt gut zum Abgucken, für dieses Tutorial starten wir aber lieber bei null. Wir löschen die Beispielseiten und das Standard-Theme:
rm -rf content/pages/* themes/00_default
Danach legen wir die Ordnerstruktur für das eigene Theme an. Es heißt
simple:
mkdir -p themes/simple/assets/css
mkdir -p themes/simple/templates/layouts
mkdir -p themes/simple/templates/partials
mkdir -p themes/simple/templates/templates
Ein Theme besteht aus drei Teilen. Freezed sucht sie an festen Pfaden:
Das CSS ist fertig, wir müssen es im Tutorial nicht mehr anfassen. Wir legen es
unter themes/simple/assets/css/style.css ab. Gestaltet werden drei
Bereiche: der Header mit Seitenname und Navigation, der Inhaltsbereich und der
Footer.
Schritt 3
Alle Einstellungen liegen in freezed.config.php im Projektstamm. Die
Datei gibt ein PHP-Array zurück. Wir ersetzen den Inhalt durch diese Fassung:
Die drei Blöcke im Überblick:
siteUrl und sitemap: Die Basis-URL
braucht Freezed nur für absolute Links, zum Beispiel in der Sitemap. Mit
enabled => true schreibt jeder Build eine
public/sitemap.xml.variables: Diese Werte stehen in jedem Template
als {siteName}, {pageTitle} und so
weiter zur Verfügung. pageTitle und pageDescription
sind hier Standardwerte, die jede Seite in ihrer eigenen
variables.php überschreibt.contentTypes: Jeder Ordner direkt unter
content/ ist ein Content-Type und braucht hier einen Eintrag.
pages wird in den Stamm von public/ gebaut, mit der
Endung .html.Schritt 4
Jetzt entsteht das Gerüst, in dem später jede Seite steckt. Es besteht aus einem Layout und zwei Partials.
Das Layout ist das HTML-Grundgerüst. Wir legen
themes/simple/templates/layouts/page.html an:
Drei Dinge passieren hier:
1{freezed:resource(...)} bindet
das Stylesheet ein. Der ViewHelper kopiert die Datei beim Build nach
public/ und gibt den öffentlichen Pfad zurück. Mit
context: 'theme' sucht er die Datei relativ zum Theme-Ordner.
2<f:render partial="header" arguments="{_all}" />
rendert das Partial partials/header.html und reicht ihm alle Variablen
weiter, also auch siteName.
3<f:render section="content" /> ist der
Platzhalter für den Seiteninhalt. Jede Seite füllt diese Section in ihrem eigenen
Template.
Header und Footer sind auf jeder Seite gleich, deshalb landen sie in eigenen
Partials. Der Header zeigt vorerst nur den Seitennamen als Link zur Startseite.
Wir legen themes/simple/templates/partials/header.html an:
Der Footer nutzt die Variablen currentYear und siteName
aus der Konfiguration. Wir legen
themes/simple/templates/partials/footer.html an:
Zum Schluss bekommt das Theme ein Fallback-Template unter
themes/simple/templates/templates/index.html. Freezed nutzt es für
jede Seite, die kein eigenes index.html mitbringt:
<f:layout name="page" /> wählt das Layout
layouts/page.html. Die Section content liefert den
Inhalt, den das Layout an der Stelle von
<f:render section="content" /> einsetzt.
Um das Gerüst zu sehen, braucht es mindestens eine Seite. Wir legen
content/pages/home/variables.php an:
Der Ordnername bestimmt normalerweise den Dateinamen der gebauten Seite, aus
home/ würde home.html. Mit targetFileName
legen wir stattdessen index.html fest, damit die Seite unter
/ erreichbar ist.
Das Theme sieht jetzt so aus:
Wir bauen die Seite:
./vendor/bin/freezed build
Built 1 page (1 file, 1 resource, sitemap) in 18 ms
In public/ liegen jetzt die Startseite, das Stylesheet und die
Sitemap:
Im Browser sehen wir jetzt Header, Footer und dazwischen den Inhalt aus dem
Fallback-Template. Viel ist das noch nicht, aber das Gerüst steht. Überschrift und
Beschreibung kommen aus variables.php und
freezed.config.php:
Schritt 5
Eine Seite ist ein Ordner mit zwei Dateien: variables.php für die
Daten und index.html für das Fluid-Template. Zuerst ergänzen wir
content/pages/home/variables.php um zwei eigene Variablen:
Danach legen wir das Template content/pages/home/index.html an. Es
wählt das Layout page und füllt die Section content:
Sobald ein index.html neben der variables.php liegt, hat
es Vorrang vor dem Fallback-Template des Themes. Überschrift und Einleitung kommen
aus den Variablen, der restliche Text steht direkt im Template.
Wir bauen neu und öffnen die Startseite:
./vendor/bin/freezed build
Schritt 6
Unterseiten funktionieren genauso wie die Startseite: ein Ordner, eine
variables.php, ein index.html. Der Ordnername wird zum
Dateinamen, aus ueber-uns/ wird ueber-uns.html.
Wir legen content/pages/ueber-uns/variables.php an:
Und das Template content/pages/ueber-uns/index.html:
Die Kontaktseite zeigt, dass Variablen auch verschachtelt sein können. Wir legen
content/pages/kontakt/variables.php an:
Im Template content/pages/kontakt/index.html greifen wir mit
Punktnotation auf die verschachtelten Werte zu, zum Beispiel
{address.city}:
Der Content-Ordner enthält jetzt drei Seiten:
Wir bauen neu:
./vendor/bin/freezed build
Built 3 pages (3 files, 1 resource, sitemap) in 8 ms
Die Unterseiten liegen als public/ueber-uns.html und
public/kontakt.html und sind unter
http://localhost:8080/ueber-uns.html und
http://localhost:8080/kontakt.html erreichbar:
Von einer Seite zur anderen kommen wir bisher nur über die Adresszeile. Das ändert der letzte Schritt.
Schritt 7
Die Menüpunkte definieren wir als Variable in der Konfiguration, gerendert werden sie im Header-Partial. So stehen sie auf jeder Seite zur Verfügung, ohne dass ein Seitentemplate davon wissen muss.
Wir ergänzen in freezed.config.php innerhalb von
variables den Eintrag navigation:
Statt einer festen URL steht in href eine Content-Referenz:
CONTENT:pages/ueber-uns meint den Ordner ueber-uns im
Content-Type pages. Freezed löst die Referenz beim Build in die
tatsächliche URL auf. Benennen wir später eine Datei um oder machen aus einer Seite
ein Verzeichnis, bleibt der Link intakt.
Wir erweitern themes/simple/templates/partials/header.html um eine
<nav>. Eine f:for-Schleife läuft über die
Menüpunkte, der ViewHelper freezed:link erzeugt daraus die Links:
freezed:link rendert ein normales <a>-Tag. Zeigt
eine Referenz auf eine Seite, die es nicht gibt, erzeugt Freezed statt des Links
ein <span class="dead-link"> und gibt beim Build eine Warnung
aus. So fallen Tippfehler sofort auf.
Wir bauen ein letztes Mal:
./vendor/bin/freezed build
Im gebauten HTML sind die Referenzen zu echten Pfaden geworden:
<nav class="site-nav" aria-label="Hauptnavigation">
<a href="/">Start</a>
<a href="/ueber-uns.html">Über uns</a>
<a href="/kontakt.html">Kontakt</a>
</nav>
Das Menü erscheint rechts im Header, auf der Startseite wie auf jeder Unterseite:
Die fertige Website besteht aus wenigen Dateien. Alles, was wir selbst angelegt
haben, liegt in content/, themes/ und
freezed.config.php:
Zum Veröffentlichen kopieren wir den Inhalt von public/ auf einen
beliebigen Webserver oder Static-Host. Mehr braucht es nicht, die Seite besteht
nur aus HTML und CSS.
themes/
überlagern sich. Ein zweites Theme kann einzelne Partials des ersten
überschreiben, ohne es zu kopieren.<f:render partial="..." arguments="{...}" /> aus
Variablen befüllen.content/posts/
plus ein Eintrag in contentTypes ergibt zum Beispiel einen Blog.
Mit freezed:contentTypeCollection lassen sich dessen Einträge auf
einer Übersichtsseite.freezed:image skaliert und
konvertiert Bilder beim Build.Die vollständige Dokumentation liegt im Repository der Engine: