Inhalte im CMS können publiziert werden. Diese publizierten Inhalte werden als Dateien im Datei-System abgelegt. Der IES kann mehrere Publikationsbereiche verwalten. Für jeden Publikationsbereich gibt es ein separates Verzeichnis in dem die Dateien abgelegt werden.

In Produktiv-Umgebungen wird häufigt das CMS-System vom Webserver getrennt. Der Webserver ist von außen erreichbar und das CMS ist im internen Netzt. Über Werkzeuge wie rsync wird dann das Publikationsverzeichnis vom CMS-Server auf dem Webserver übertragen und bei Änderungen synchronisiert.

Im weiteren wird beschrieben, in welchen Verzeichnis-Strukturen die Dateien vom CMS abgelegt werden.

Für jeden Publikations-Bereich muss ein Resource-Root (ehemals Document-Root) angegeben werden. Diese sollte folgende Form haben:

Beispiel:

/var/www/domain.de/www/resources

oder

/var/www/domain.de/preview/resources

Ab diesem Verzeichnis beginnt das Publisher-Layout: RESOURCES.

/var/www/domain.de/www/resources
  + context.php
  + index/
  + media/
    + public/
    + protected/
  + objects/
  + redirects/
  + security/

Folgende Dateien und Verzeichnis-Strukturen werden hier abgelegt:

context.php

Die context.php-Datei enthalt die Informationen um welchen Publikations-Bereich des CMS es sich handelt. Die PHP-Datei liefert ein PHP-Array zurück.

<?php
return [
    'server' => [ ... ],
    'client' => [ ... ],
    'publisher' => [ ... ],
];

Dies ist in folgende Bereiche aufgeteilt:

  • server : Daten des IES-Server.
  • client : Daten des Mandante zu dem der Publikationsbereich zugeordnet ist.
  • publisher : Daten des Publikationsbereichs

objects/

In diesem Verzeichnis werden die publizierten Artikel abgelegt. Im CMS liegen diese Artikel in Ordnerstrukturen und besitzen Dateinamen. Diese Struktur wird in dem objects/-Verzeichnis übernommen. Die Artikel-Daten werden in strukturierter Form abgelegt, die von den Aggregatoren festgelegt wird. Meistens werden die Daten als PHP-Dateien abgelegt. Ergänzende Mehrsprachigkeits-Definitionen vom CMS aber z.B. in JSON.

Die Verzeichnis-Struktur könnte beispielhaft so aussehen:

objects/
  index.php
  musterseiten/
    + artikeltypen/
      + index.php
      + standardartikel.php
  lang/
    + de.json
  errors/
    + 401.php
    + 404.php

media/public/

In diesem Verzeichnis liegen die, im CMS, hinterlegten Medien, die ohne eine Art von Authentifizierung vom Website-Nutzer aufgerufen werden können. Diese Verzeichnis wird direkt vom Webserver gelesen und die Dateien ausgeliefert.

media/protected

Die im CMS hinterlegten Medien, die nur von bestimmten Website-Nutzers erreicht werden sollen, liegen in diesem Ordner. Diese Dateien werden nicht direkt vom Webserver ausgeliefert. Hier muss zunächste eine Authentifizierung erfolgen und die Authorisierung geprüft werden, bevor das Medium zurück geliefert werden.

index/ (in Konzeption)

Die für die Webseite notwendigen Daten liegen auschließlich im Dateisystem. Es wird hier keine Datenbank benötigt. Mit Ausnahme des Volltext-Indexes (Solr) gibt es nur die Möglichkeit die Daten anhand des Datei-Pfades abzufragen. Es ist aber in einigen Fällen erforderlich die aggregierten Datei über die entsprechende Artikel-Id zu ermitteln. Hierzu dient das index/ Verzeichnis. Es enthält Symlinks, wobei der Name der Artikel-Id entspricht und auf den Datei-Pfad des Artikels verweist.

Die Symlinks werden in Unterverzeichnissen abgelegt, um zu verhindern, dass zu viele Dateien in einem einzelnen Verzeichnis liegen. Für eine gute Verteilung der Symlinks in den Verzeichnissen werden die letzen 3 Ziffern der ID als Verzeichnis verwendet. Besitzt die ID weniger als 3 Ziffern werden 0 linkseitig aufgefüllt.

Ist für den Artikel musterseiten/artikeltypen/standardartikel.php z.B die ID 4352892 so würde der Eintrag in dem index/-Verzeichnis wie folgt aussehen.

index/
  + 892
    + 4352892 -> ../../objects/musterseiten/artikeltypen/standardartikel.php

Hätte der Startseiten-Artikel index.php die ID 7 würde der Eintrag in dem index/-Verzeichnis wie folgt aussehen.

index/
  + 007
    + 7 -> ../../objects/index.php

redirects/

Über das CMS lassen sich Weiterleitungen definieren. Diese werden in dem redirects/ abgelegt. Hierbei gibt es zwei Typen

  1. Kurz-Adressen (Redirects) - Bei Kurz-Adressen wird der Nutzer fu die richtige URL weitergeleitet
  2. Aliases - Bei Aliases werden die Seite unter der angegeben URL direkt angezeigt.

In dem redirects/ - Verzeichnis werden die Definitionen in PHP-Dateien abgelegt. Im CMS wird pro Weiterleitung ein eigener Artikel mit eindeutigem Dateiname angelegt. So könnte z.B. ein Weiterleitungs-Artikel Standard mit dem Dateinamen standard angelegt werden. In diesem Artikel wird die Kurz-Adresse (z.B. /standard) und die Ziel-Adresse (z.B. /musterseiten/artikeltypen/standardartikel.php) angegeben.

Das CMS würde draus eine Datei

redirects/standard.php

mit dem Inhalt

<?php
return [
        [
            'pattern' => '/standard',
            'replacement' => '/musterseiten/artikeltypen/standardartikel',
            'alias' => false
        ]
];

anlegen.

security/

Um Inhalte der Webseite nur für bestimmte Personen-Gruppen zugänglich zu machen, können diese geschützt werden.

Hier bietet das System zwei Möglichkeiten. Zum können Nutzer und Nutzer-Gruppen innerhalb des CMS angelegt werden. Diese Nutzer können sich über eine Login-Funktion auf der Webseite anmelden. Im CMS können Artikel und Artikel-Pools geschützt und für die angelegten Nutzer-Gruppen freigegeben werden. Hierüber können sehr komplexe Rechtestrukturen abgebildet werden.

In einigen Fällen wir aber z.B. nur ein einfacher Schutz auf Verzeichnis-Ebene mit wenigen Nutzer und einfacher Rechte-Struktur benötigt. Für diese Fälle werden in dem security/-Verzeichnis diese Rechtedefinitionen hinterlegt.

Dies kann z.B. so aussehen:

Definition eines Nutzers editor mit der Rolle editor:

security/editor.user.php

<?php
return [
        ['username' => 'pan', 'password' => '$2y$13$vV1mHLjROSuUimaNqwnwX.IvX4.zWIg5xWOqIZwP2lWfuZtdX0RBW', 'roles' => ['editor']],
];

Zugriff-Definition für die Rolle editor

security/main.access.php

<?php
return [
        ['path' => '^/bildung/', 'roles' => ['editor']],

];

Nutzer-Definitionen enden mit .user.php, Zugriffs-Definitionen mit .access.php

Öffentliche Medien können so nicht geschützt werden, das sie nicht über PHP ausgeliefert werden. Hier wäre eine Lösung dafür zu sorgen, das die entsprechenden Medien in dem media/protected/-Verzeichnis aggregiert werden.

Webserver Integration

Das Resources-Verzeichnis bildet den Datenbestand, der über die Webseite ausgespielt werden soll und ist als Dateisystem basierte Datenbank anzusehen.

Für den Betrieb der Webseite sind zusätzlich zu den Resorucen noch weitere Kompenenten notwendig.

  • Ein Frontend-Projekt, das korrespondierend zu dem serverseitigen die frontendseitige Logik für die Webseite bereit stellt.
  • Ein FEDS-Projekt, das korrespondierend zu dem Frontend die serverseitige Logik für die Webseite bereit stellt.

Diese Komponenten werden über eine Apache-Konfiguration zusammengeführt. Dies wird von dem Apache-Macro fedsSite übernommen.