Content und CMS
Wie freie Inhalte (Markdown, HTML, Blade, PlantUML) im Content-Pfad abgelegt werden, welche Slots und Hooks die Seiten anbieten und welche Grenzen Version 0.2.1 hat.
Prinzip
swark ist kein klassisches CMS mit Editor. Freier Inhalt liegt als Datei im Content-Pfad und wird an definierten Stellen in die Frontend-Seiten eingeblendet. Es gibt drei Mechanismen:
| Mechanismus | Wofür | Dateiort |
|---|---|---|
| Slots | Textblöcke, die eine Seite ausdrücklich erwartet (zum Beispiel Vision, Zielbild) | relativ zur URL der Seite |
| Kapitel-Hooks | Zusätzlicher Inhalt vor oder nach jedem Kapitel einer Seite | relativ zum Routennamen der Seite |
| Diagrammdateien | PlantUML-Quelltext, zum Beispiel die Systemlandschaft | relativ zum Routennamen der Seite |
Content-Pfad
| Umgebung | Pfad |
|---|---|
| Standard (ohne Variable) | storage/app/swark/_default |
| Variable | SWARK_CONTENT_PATH, relativ zum Anwendungsverzeichnis /var/www/html |
| Hosting Nerd-IT | SWARK_CONTENT_PATH=./swark_content → /var/www/html/swark_content, Docker-Volume swark_content |
Inhalte bleiben im Volume über Neustarts und Updates erhalten. Der nächtliche Demo-Reset löscht sie nicht.
Dateiformate
| Endung | Verarbeitung |
|---|---|
.md |
Markdown (CommonMark mit GitHub-Erweiterungen: Tabellen, Aufgabenlisten, Autolinks). Eingebettetes HTML wird entfernt. Ein YAML-Frontmatter am Anfang wird ignoriert. |
.html, .htm |
Wird unverändert als HTML ausgegeben |
.blade.php |
Laravel-Blade-Vorlage; erlaubt Komponenten wie x-swark-plantuml und Zugriff auf Daten. Blade-Dateien haben Vorrang vor Markdown und HTML. |
.plantuml, .txt |
Nur für Diagramme |
.yaml |
Nur für die Seitenkonfiguration page.yaml |
Blade-Dateien führen PHP-Code aus. Wer Schreibzugriff auf den Content-Pfad hat, kann damit beliebigen Code in der Anwendung ausführen. Schreibzugriff ist deshalb auf Administratoren zu beschränken.
Slots
Ein Slot wird über die URL der Seite (ohne /swark/) plus Slotnamen gefunden. Datei: <content-pfad>/<url-pfad>/<slot>.<endung>.
Strategie-Übersicht (/swark/strategy/overview)
| Slot | Datei | Erscheint in |
|---|---|---|
company_introduction |
strategy/overview/company_introduction.md |
Kapitel Einleitung |
vision_title |
strategy/overview/vision_title.html |
Kopf der Vision-Karte |
vision_quote |
strategy/overview/vision_quote.md |
Text der Vision-Karte |
big_picture |
strategy/overview/big_picture.md |
Kapitel Zielbild |
introduction |
strategy/overview/introduction.md |
Einleitung im Kapitel Strategie, vor der Mindmap |
Die Endung ist jeweils frei wählbar (.md, .html, .blade.php).
Beispiel strategy/overview/big_picture.md:
## Zielbild 2029
Alle Fachanwendungen laufen in zwei Rechenzentren in der Zone **CORE**.
Externe Partner greifen ausschliesslich über die Zone **B2X** zu.
| Bereich | Heute | 2029 |
|---|---|---|
| Identitäten | lokal | zentral, MFA |
| Betrieb | manuell | automatisiert |
Beispiel strategy/overview/vision_title.html:
Digitale Verwaltung 2029
Hinweise zur Namensauflösung:
- Gesucht wird rekursiv im Ordner
strategy/overview/nach Dateien, deren Name auf den Slotnamen endet.company_introduction.mdpasst deshalb auch auf den Slotintroduction. Wer beide Slots nutzt, legt den Slotintroductionalsintroduction.blade.phpan, weil Blade-Dateien Vorrang haben. - Solange ein Kapitel-Slot leer ist, zeigt die Seite «Content für Pfad ~big_picture wurde noch nicht hinterlegt» und darunter einen Hinweis, welche Datei anzulegen ist.
Weitere Seiten
Die übrigen Seiten (Findings, Zielerreichung, IT-Architektur, Infrastruktur, Cluster, Ressourcen, Software, Richtlinien, Glossar) füllen ihre Kapitel vollständig aus der Datenbank und haben in 0.2.1 keine Slots. Für zusätzlichen Text dienen dort die Kapitel-Hooks.
Kapitel-Hooks
Vor und nach jedem Kapitel prüft swark, ob eine passende Datei existiert, und gibt sie aus. Der Ordner ergibt sich aus dem Routennamen ohne swark., Punkte werden zu Schrägstrichen (zum Beispiel swark.strategy.index → strategy/index).
| Datei | Wann sichtbar |
|---|---|
<kapitel-id>-before-chapter.blade.php |
vor der Kapitelüberschrift |
<kapitel-id>-before.blade.php |
nach der Überschrift, vor dem Kapitelinhalt |
<kapitel-id>-after.blade.php |
nach dem Kapitelinhalt |
Für Hooks sind nur .blade.php und .html geeignet; Markdown-Dateien werden an dieser Stelle nicht unterstützt.
Ordner und Kapitel-IDs je Seite
| Seite | Hook-Ordner | Kapitel-IDs |
|---|---|---|
| Strategie-Übersicht | strategy/index/ |
introduction, vision, big_picture, strategy |
| Findings | strategy/findings/ |
overview, details, timeline, dazu die numerische ID jedes Ziels |
| IT-Architektur | it_architecture/index/ |
data-classification, zone-model, zone-matrix |
| Baremetal-Systeme | infrastructure/baremetal/index/ |
summary, items |
| Cluster-Detail | infrastructure/cluster/detail/ oder infrastructure/cluster/detail/<cluster-id>/ |
overview, application-instances |
| Richtlinie | policies/detail/ oder policies/detail/<policy-id>/ |
rules, dazu die numerische ID jeder Regel |
| Glossar | glossary/index/ |
swark, nis2 |
| Zielerreichung, Cluster-Liste, Ressourcen, Software-Katalog, Systemlandschaft | – | keine Kapitel |
Bei Seiten mit Parameter (Cluster, Richtlinie) gilt eine Datei im Unterordner mit der numerischen ID nur für dieses Objekt, eine Datei direkt im Seitenordner für alle. Die offizielle swark-Dokumentation erwähnt zusätzlich Ordner mit Scomp-ID statt numerischer ID; das ist in 0.2.1 nicht umgesetzt.
Beispiel: Glossar ergänzen mit glossary/index/swark-after.blade.php:
<table class="table">
<thead><tr><th>Begriff</th><th>Bedeutung</th></tr></thead>
<tbody>
<tr><td>CORE</td><td>Interne Zone für geschäftskritische Daten</td></tr>
<tr><td>B2X</td><td>Zone für den Zugriff externer Partner</td></tr>
</tbody>
</table>
Beispiel: Erläuterung unter der Zugriffsmatrix mit it_architecture/index/zone-matrix-after.blade.php:
<p>Ausnahmen von der Matrix sind im Ausnahmeregister (Ticket-System) dokumentiert.</p>
In Blade-Hooks stehen die Variablen $chapter (Kapitel-Objekt mit id und label) und $context zur Verfügung. Die Daten der Seite selbst werden an Hooks nicht übergeben; Datenbankabfragen sind in Blade aber über die Modelle möglich.
Diagrammdateien
Die Systemlandschaft erwartet infrastructure/index/landscape.plantuml (oder .txt). Beispiel:
!include <C4/C4_Container>
Person(user, "Mitarbeitende")
System(erp, "ERP", "Zone CORE")
System_Ext(saas, "Microsoft 365", "Zone SAAS")
Rel(user, erp, "nutzt", "HTTPS")
Rel(erp, saas, "synchronisiert", "Graph API")
@startuml und @enduml ergänzt swark selbst. Details im Kapitel Diagramme.
Seitenkonfiguration page.yaml
Liegt im URL-Ordner einer Seite eine Datei page.yaml (zum Beispiel strategy/overview/page.yaml), wertet swark sie aus:
fragments:
headline: Einleitung und Ziele
toc:
- vision: {}
- strategy: {}
chapters:
labeling:
number:
prefix: ""
concat: "."
suffix: ". "
label:
prefix: ""
suffix: ""
| Schlüssel | Wirkung |
|---|---|
toc |
Liste der Kapitel-IDs; nur diese Kapitel und in dieser Reihenfolge erscheinen. Unterkapitel werden dabei nicht einzeln gesteuert. |
chapters.labeling.number |
Präfix, Trennzeichen und Suffix der Kapitelnummern |
chapters.labeling.label |
Präfix und Suffix der Kapiteltitel |
fragments |
Textbausteine, die eine Seitenvorlage über $page->__('schlüssel') abruft; in den mitgelieferten Seiten wird das kaum genutzt |
Das Abschalten der Kapitelnummern über chapters.labeling.enable_numbering ist in 0.2.1 wegen eines Schreibfehlers im Code wirkungslos; Kapitel sind immer nummeriert.
Inhalte in der Datenbank (swark:import:content)
Der Befehl swark:import:content <ordner> liest alle Unterordner von <ordner> und speichert .md-, .html- und .txt-Dateien in der Tabelle content. Die Scomp-ID wird aus Unterordner und Dateiname gebildet, zum Beispiel strategy/vision.md → strategy_vision. Ein bereits vorhandener Eintrag wird nur ersetzt, wenn die Datei im Frontmatter ein neueres updated_at trägt:
---
updated_at: 2026-10-09
---
Text …
Einschränkung 0.2.1: Die Slots suchen in der Datenbank nach Schlüsseln der Form strategy__overview__big_picture (URL-Teile mit doppeltem Unterstrich). Die vom Import erzeugten Schlüssel (strategy_big_picture) passen dazu nicht. Importierte Inhalte erscheinen deshalb im Frontend in der Regel nicht. Empfehlung: Inhalte als Dateien im Content-Pfad ablegen.
Inhalte ins Hosting bringen
Der Content-Pfad liegt im Docker-Volume swark_content des Containers. Bei einer selbst betriebenen Installation gelangen neue Dateien zum Beispiel mit docker cp datei.md <container>:/var/www/html/swark_content/strategy/overview/ dorthin. Bei einer Instanz von Nerd-IT übernimmt das Betriebsteam das Einspielen; die Dateien lassen sich per E-Mail oder als Archiv übergeben.
Danach ist kein Neustart nötig; Änderungen sind beim nächsten Seitenaufruf sichtbar. Bei Blade-Dateien kann der View-Cache eine alte Fassung zeigen; dann hilft php artisan view:clear.
Für grössere Inhalte empfiehlt sich, den Content in einem Git-Repository zu pflegen und bei Änderungen in das Volume zu kopieren.