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.md passt deshalb auch auf den Slot introduction. Wer beide Slots nutzt, legt den Slot introduction als introduction.blade.php an, 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.