Zum Hauptinhalt springen
Die Gestaltung der Storefront bei WEBSALE ist flexibel und ermöglicht individuelle Anpassungen, erfordert jedoch fortgeschrittenes Know-how in HTML, CSS und JavaScript. Anders als bei anderen Shopsystemen gibt es bei WEBSALE keine vorgefertigten Designs oder Drag-and-Drop-Builder. Stattdessen arbeiten Webdesigner und Frontend-Entwickler direkt mit den HTML-Templates, CSS- und JavaScript-Dateien, um das gewünschte Design zu realisieren. Ein wesentlicher Vorteil dieses Ansatzes ist, dass die Software von WEBSALE strikt vom Design resp. der Storefront getrennt ist. Änderungen oder Updates an der Software betreffen nicht die Templates. Die Storefront bleibt somit immer unverändert. Neue Funktionen aus Software-Updates können bei Bedarf manuell in die Templates integriert werden.

Verzeichnisstruktur

Die WEBSALE Storefront ist logisch in verschiedene Verzeichnisse unterteilt, die die Templates und zugehörigen Ressourcen wie CSS, JavaScript und Bilder strukturieren.

Template-Verzeichnis

Das Verzeichnis templates/ enthält alle HTML-Templates der Storefront. Diese sind in Unterverzeichnisse organisiert, die nach den entsprechenden Controllern benannt sind. Diese Struktur trennt die Vorlagendateien nach den spezifischen Frontend-Bereichen, auf die sie sich beziehen.
Bedeutung der Unterverzeichnisse:
  • templates/components/: Wiederverwendbare Template-Elemente (Includes), beispielsweise Produktboxen.
  • templates/layouts/: Basis-Templates (Layout-Templates), die das allgemeine Grundgerüst aller Shopseiten definieren, beispielsweise Header, Footer und Navigation.
  • templates/mails/: Templates für automatisch versendete E-Mails, beispielsweise Bestellbestätigungen oder Versandbenachrichtigungen. Das Verzeichnis mails ist fest vorgegeben und kann nicht umbenannt oder verschoben werden. E-Mail-Templates müssen direkt in diesem Verzeichnis liegen. In den E-Mail-Konfigurationen wird beim template-Parameter nur der Dateiname ohne das Präfix mails/ angegeben (siehe E-Mails & E-Mail Einstellungen).
  • templates/pdfs/: Templates für PDF-Ausgaben, beispielsweise Rechnungen oder Lieferscheine.
  • templates/views/: Seiten-Templates (View-Templates) für die einzelnen Shopseiten, beispielsweise Startseite oder Kategorieseiten.
Von diesen Unterverzeichnissen sind nur zwei fest vorgegeben, da das System sie direkt auswertet. Sie dürfen nicht umbenannt werden!
  • templates/mails/: enthält alle Mail-Templates.
  • templates/views/: enthält alle renderbaren Shop-Seiten (die einzigen von außen per Link adressierbaren Templates).
Alle übrigen Verzeichnisse (beispielsweise components/, layouts/, pdfs/) sind eine empfohlene Organisationsstruktur und können frei benannt bzw. angelegt werden.

Medien-Verzeichnis

Das Verzeichnis media/themes/default/ enthält die Ressourcen für die Gestaltung der Storefront, wie Schriftarten, SCSS-Dateien, Bilder und Icons. Dieses Verzeichnis befindet sich auf der gleichen Ebene wie templates/.
Die Templates im Verzeichnis templates/ greifen auf die Ressourcen im Verzeichnis media/themes/default/ zu, um das Layout, die Farben, Schriftarten und Bilder der Storefront zu definieren. Dies ermöglicht eine saubere Trennung von Struktur (HTML) und Design (CSS und Medien). Beispiel für die Einbindung von Ressourcen:

Basis-Template (Layout-Template)

Das Basis-Template, auch als Layout-Template bezeichnet, legt das allgemeine Grundgerüst für alle Seiten der Storefront fest. Es definiert zentrale Inhalte und Bereiche, die auf den meisten Shopseiten wiederverwendet werden, und sorgt so für eine einheitliche Struktur und Benutzerführung. Das Layout-Template ist keine eigenständige Shopseite und kann daher nicht direkt von außen per Link aufgerufen werden. Es wird stattdessen von den spezifischen Seiten-Templates (Views) erweitert oder eingebunden. Das Basis-Template befindet sich im Verzeichnis
Je nach Anwendungsfall können hier ein oder mehrere Layout-Templates abgelegt werden, beispielsweise für das allgemeine Layout, das Kundenkonto, das Checkout-spezifische Layout oder die E-Mails. Das Layout-Template enthält üblicherweise die folgenden zentralen Elemente:
  • Technischer <head>-Bereich:
    • Meta-Angaben für Suchmaschinenoptimierung (beispielsweise Title, Description, Keywords).
    • Verweise auf die CSS- und JavaScript-Dateien der Storefront.
    • Integration von externen Ressourcen wie Schriftarten oder Tracking-Codes.
  • Sichtbarer Headerbereich:
    • Logo: Darstellung des Shop-Logos.
    • Suche: Eingabefeld für die Produktsuche.
    • Login-Bereich: Zugriff auf das Kundenkonto.
    • Warenkorb und Merkliste: Übersicht über gespeicherte Produkte.
    • Navigation: Primäre Navigation des Shops (beispielsweise Kategorien).
  • Breadcrumb:
    • Anzeige des aktuellen Navigationspfads zur besseren Orientierung der Benutzer.
  • Footer:
    • Weiterführende Verlinkungen wie Impressum, Datenschutz, AGB.
    • Kontaktinformationen oder andere zusätzliche Inhalte.
Ein Layout-Template wird in den Seiten-Templates (Views) über den extends-Befehl eingebunden:

Template-Blöcke

Template-Blöcke bilden die grundlegende Struktur eines Basis-Templates und ermöglichen eine einfache und flexible Anpassung der Storefront. Sie gruppieren die Storefront-Komponenten in kleine, isolierte Blöcke, die unabhängig voneinander bearbeitet oder überschrieben werden können. Dieses Block-System sorgt für eine saubere Struktur und Wiederverwendbarkeit von Inhalten. Template-Blöcke sind klar definierte Bereiche innerhalb eines Templates, die durch das Element block gekennzeichnet sind. Sie dienen dazu, die einzelnen Komponenten der Storefront (beispielsweise Header, Footer und Navigation) voneinander zu trennen, sodass sie unabhängig voneinander angepasst werden können. Beispiel eines Blocks:

Template-Blöcke überschreiben

Ein Template-Block kann in einem View-Template überschrieben werden, um spezifische Anpassungen für einzelne Seiten vorzunehmen. Dazu wird das block-Element einfach mit dem gewünschten Quellcode in das View-Template integriert. Das Basis-Template bleibt dabei unverändert. Beispiel: Überschreiben des Headers für die Startseite

Template-Blöcke erweitern

Es ist auch möglich, bestehende Blöcke zu erweitern, ohne deren ursprünglichen Inhalt zu entfernen. Dafür gibt es die Schlüsselwörter prepend (Inhalt voranstellen) und append (Inhalt anhängen). Beispiel: Versandkostenfrei-Banner im Header hinzufügen:
Mehr Informationen zu den Template-Blöcken sowie deren Verwendung und Anpassung finden sich in der Referenzdokumentation zu Template-Blöcken.

View-Templates (Seiten-Templates)

View-Templates definieren die individuellen Inhalte für spezifische Shopseiten und sind die einzigen Templates, die von außen per Link adressierbar sind. Sie basieren in der Regel auf einem Basis-Template und verwenden dessen Blöcke, um eine konsistente Struktur und Gestaltung beizubehalten. View-Templates befinden sich im Verzeichnis
View-Templates können direkt verlinkt werden, indem ihre URL über den folgenden Befehl generiert wird:
In diesem Beispiel wird auf das View-Template impressum.htm verlinkt.

Direkter URL-Aufruf eines View-Templates

Intern erzeugt $wsViews.viewUrl() eine URL mit den Query-Parametern wsvc=View und view=<dateiname>. Ein View-Template lässt sich damit auch direkt über die Browser-URL aufrufen:
Zusätzliche Query-Parameter (beispielsweise ?wsvc=View&view=account/orderHistory.htm&orderHistorySelect=<ID>) werden an das Template weitergereicht und können dort über $wsViews.params.<name> ausgelesen werden. Verwenden Sie im Template-Code bevorzugt die Funktion $wsViews.viewUrl(), damit URLs korrekt generiert werden und Änderungen am URL-Schema zentral berücksichtigt werden. Ein View-Template sollte immer ein Basis-Template verwenden. Dadurch wird sichergestellt, dass alle grundlegenden Strukturen wie Header, Footer oder der technische <head>-Bereich aus dem Basis-Template übernommen werden. Die Zuweisung erfolgt immer mit dem Befehl extends:
Wenn mit dem Befehl extends ein Basis-Template zugewiesen wird, darf im View-Template ausschließlich mit Blöcken gearbeitet werden. Bei jedem View-Template kann dann entschieden werden, welche Blöcke des Basis-Templates übernommen, überschrieben oder erweitert werden sollen. Außerhalb von Blöcken darf sich kein Code befinden.

System-Templates

Es gibt drei vordefinierte System-Templates, die nicht umbenannt oder verschoben werden dürfen:
  1. start.htm: Definiert die Startseite des Shops.
  2. category.htm: Template für die Kategorieseiten.
  3. product.htm: Template für die Produktseiten.
Diese Templates sind fester Bestandteil des Systems und dienen als Grundlage für die zentralen Shopseiten.

CMS-Seitentemplate

Statische Inhaltsseiten, deren Inhalte in strapi gepflegt werden (beispielsweise AGB, Impressum, Zahlungsarten, „Über uns”), werden mit einem eigenen View-Template gerendert. Es gilt für alle CMS-Seiten gemeinsam, es gibt kein Template pro Seite. Anders als bei den drei System-Templates ist der Name hier frei konfigurierbar. Die Datei ist im Auslieferungszustand nicht enthalten und muss zunächst angelegt werden. Der Aufruf erfolgt nicht über $wsViews.viewUrl(), sondern über die SEO-URL der Seite. Der Shop registriert die Seite, lädt das passende Dokument aus dem Objektspeicher und rendert es mit diesem Template. Wie die Seiten in den Shop gelangen und wie die URL entsteht, ist unter Auslieferung von CMS-Seiten in den Shop beschrieben.

Das Seitendokument $wsCmsPage

Das komplette Seitendokument steht 1:1 als $wsCmsPage bereit, in derselben Struktur wie die JSON-Datei, ohne Umbenennung oder Umsortierung. Die vollständige Referenz des Moduls steht unter $wsCmsPage: Auf allen Seiten, die keine CMS-Seite sind, ist $wsCmsPage leer (null) und damit im Template als „falsch” prüfbar. Ein gemeinsames Basis-Template kann so gefahrlos auf CMS-Inhalte prüfen:
Inhalte ausgeben. Die Darstellung von fields ist vollständig Aufgabe des Templates. Der Shop liefert nur die Rohdaten und interpretiert sie nicht. Welche Feldnamen und Komponenten es gibt, ergibt sich aus der strapi-Modellierung des jeweiligen Shops. Für den Zugriff wird die Liste einmalig in ein Name/Wert-Objekt überführt:
Das Muster gilt auf jeder Ebene gleich, auch innerhalb von Komponenten (value.fields) und für die Blöcke von Inhaltsblöcken. Ausführlich beschrieben unter Schritt 4: Feldzugriffe umstellen und Schritt 5: Inhaltsblöcke anpassen.
Behalten Sie beim Rendern der Inhaltsblöcke einen {{ else }}-Zweig für unbekannte Komponenten. Sonst verschwindet ein neu angelegter Block still aus der Seite, statt aufzufallen:
SEO-Angaben ausgeben. Der Shop setzt Meta-Title und Meta-Description selbst. Sie werden im Basis-Template wie bei allen anderen Seitentypen über $wsViews.metaTitle() und $wsViews.metaDescription() ausgegeben. Robots-Angaben und Alternativsprachen rendert das Basis-Template im Auslieferungszustand dagegen nicht. Wer sie benötigt, gibt sie im CMS-Seitentemplate selbst aus:
$wsViews.current.robotOptions enthält die aus $wsCmsPage.meta.robots und der Shop-Konfiguration zusammengeführten Angaben. $wsCmsPage.meta.hreflang wird nicht automatisch in die hreflang-Ausgabe des Shops übernommen und $wsViews.current.getHreflangAutomatic() liefert für CMS-Seiten nichts aus.

Benutzerdefinierte Templates

Für alle anderen Shopseiten gibt es keine Systemvorgaben. Sie sind frei definierbare View-Templates, die erstellt und frei benannt werden können. Beispielsweise:
  • account.htm: Für das Kundenkonto
  • search.htm: Für die Suche
  • impressum.htm: Für die Impressumsseite

Components (Includes)

Components, auch Includes genannt, sind wiederverwendbare Template-Elemente, die flexibel in verschiedenen Bereichen des Shops eingesetzt werden können. Sie dienen dazu, HTML-Code oder andere Anweisungen (beispielsweise CSS oder JavaScript) zu bündeln und an mehreren Stellen im Shop zu nutzen. Im Gegensatz zu Basis- oder View-Templates enthalten Components keine vollständigen HTML-Seitenstrukturen mit doctype, <html> oder <body>, sondern nur ausgewählte Code-Schnipsel. Components befinden sich im Verzeichnis:
Ein typisches Beispiel für eine Component ist die Produktbox (Vorschauansicht eines Produkts). Diese wird an verschiedenen Stellen im Shop benötigt:
  • In der Kategorieübersicht, um Produkte in einer Liste darzustellen.
  • In den Suchergebnissen, um die Treffer anzuzeigen.
  • Auf der Merkliste, um gespeicherte Produkte darzustellen.
  • Im Cross-Selling-Bereich auf der Produktdetailseite, um verwandte oder empfohlene Produkte anzuzeigen.
Anstatt den Code für die Produktbox mehrfach in verschiedenen Templates zu schreiben, wird dieser einmal als Component erstellt, beispielsweise als components/productBox.htm:
Anschließend kann die Produktbox überall im Shop eingebunden werden, wo sie benötigt wird. Das Produkt übergeben Sie mit with an die Component:
Wie Blöcke und Includes zusammenspielen, beschreibt die Referenz zu Template-Blöcken.

Storefront API

Als Alternative zu den Templates kann auch die Storefront-API genutzt werden, um den Shop aufzubauen.