Messbarer Erfolg «10 Punkte-Checkliste für ein zukunftssicheres CMS» White Paper
Messbarer Erfolg - White Paper

Das Datenmodell von Scrivito

Das Datenmodell von Scrivito

Bei Scrivito werden sämtliche bearbeitbaren Inhalte in CMS-Objekten gespeichert. Solche Objekte enthalten die Daten von beispielsweise Seiten oder Bildern und sind die einzigen Entitäten, die einzeln gespeichert und ausgelesen werden, zusammen mit den gegebenenfalls darin enthaltenen Widgets.

Sieht man sich eine einfache Webseite einmal an, findet man darin mehrere Komponenten, die Widgets. Die Bestandteile des Layouts (auf dem Screenshot außerhalb des rot umrandeten Bereichs zu sehen) betrachten wir hier nicht, denn sie werden größtenteils von der Web-Anwendung bereitgestellt und nur durch wenige Inhalte aus dem CMS ergänzt, um beispielsweise Navigationen zu erzeugen.

  • Wie jede Seite, wird auch diese von einem einzigen CMS-Objekt repräsentiert. CMS-Objekte werden in einer Datenbank gespeichert und belegen darin jeweils genau einen Eintrag.

  • Die Überschrift, der Textblock sowie das Bild sind Widgets und keine CMS-Objekte, sondern in einem Attribut des Objekts gespeichert.

  • Das Bild befindet sich in einem Image-Widget, ist jedoch ein eigenständiges CMS-Objekt. Würde man das Widget oder die Seite, auf der es sich befindet, löschen, bliebe das Bild weiterhin im CMS, weil es vom Widget nur referenziert wird. (Einzelheiten dazu weiter unten.)

Woraus besteht ein CMS-Objekt?

Alle CMS-Objekte basieren auf einem Modell, das ihre Eigenschaften definiert. Bei Scrivito wird ein solches Modell „Objektklasse“ genannt, und Eigenschaften sind „Attribute“. Die Objektklasse für einfache Seiten wie die obige könnte so aussehen:

Scrivito.provideObjClass('Page', {
  attributes: {
    title: "string",
    body: "widgetlist",
  }
});

Die Flexibilität und der Nutzen dieser Objektklasse für den Redakteur ergeben sich aus dem body-Attribut, eine widgetlist. Scrivito legt sämtliche Widgets, die man auf einer solchen Seite platziert, in diesem Attribut ab. Neben widgetlist gibt noch etliche weitere Attributtypen 🇺🇸für andere Arten von Inhalten.

Ergänzend zu einer solchen Objektklasse benötigen wir noch eine React-Komponente, die die Instanzen der Objektklasse, d.h. die eigentlichen Seiten darstellt. Diese Komponente braucht lediglich das jeweilige body-Attribut zu rendern:

Scrivito.provideComponent("Page", ({ page }) => (
  <Scrivito.ContentTag tag="div" content={page} attribute="body" />
));

Auch Widgets haben Attribute

Als Redakteur kann man bei der Arbeit an Seiten aus den Widgets wählen, die in der Web-Anwendung zur Verfügung gestellt werden. Wie oben angedeutet, wird das gewählte Widget zu einem widgetlist-Attribut hinzugefügt.

Welche Art von Inhalten die Widgets eines bestimmten Typs enthalten sollen, kann analog zu Objektklassen mit einem Modell, der Widget-Klasse, festgelegt werden:

Scrivito.provideWidgetClass('HeadlineWidget', {
  attributes: {
    headline: "string",
    level: ["enum", {values: ["h1", "h2", "h3", "h4", "h5", "h6"]}],
  }
});

Die obige Widget-Klasse umfasst zwei Attribute, headline and level. Es ist möglich, auch Attribute vom Typ widgetlist zu einem Widget-Modell hinzuzufügen. Dadurch können Widgets verschachtelt werden, wodurch Redakteure Inhalte leichter strukturieren können, etwa mit Hilfe von Spalten- oder Box-Widgets.

Wie die Instanzen von Objektklassen werden auch die Instanzen einer Widget-Klasse von einer React-Komponente gerendert.

Hinter den Kulissen: Speicherung

Wie erwähnt, speichert Scrivito die CMS-Objekte mit ihren Attributen in einer Datenbank. Die obige Beispielseite wird durch eine ähnliche Datenstruktur abgebildet, wie sie hier zu sehen ist. Ein Attribut vom Typ widgetlist, hier body, ist ein Array, dessen Elemente die darin enthaltenen Widgets beschreibt.

Die Attribute, mit denen Objekte über ihre Objektklasse ausgestattet werden können, sind frei wählbar. Jedes CMS-Objekt verfügt aber auch über einige vorgegebene System-Attribute 🇺🇸wie id (zur Identifikation) oder _path (für die Position eines Objekts in der baumartigen Objekthierarchie). Die zu einem Objekt gespeicherten Daten umfassen stets alle Attribute, also sowohl die zusätzlich verwendeten als auch die vorgegebenen.

Wie oben erläutert, ist jedes Bild ein eigenes CMS-Objekt, das dort referenziert wird, wo es eingebunden ist. Folglich ist der Wert des image-Attributs im ImageWidget eine ID, die auf das Bildobjekt im CMS verweist.

{
  id: "b7db5bde279ce347",
  _path: "/articles/b7db5bde279ce347",
  _objClass: "ArticlePage",
  title: "On something relevant",
  body: [
    {
      id: "be4d9ac4",
      _objClass: "HeadlineWidget",
      headline: "Headline",
    },
    {
      id: "76c2af09",
      _objClass: "TextWidget",
      body: "Eu quis ullamco cillum…",
    },
    {
      id: "d1f794dd",
      _objClass: "ImageWidget",
      image: "82d466cf4a9df6e1",
    },
  ],
}

Besonderheiten binärer Objekte

Scrivito erkennt binäre Inhalte wie Bilder, Videos, PDF-Dateien usw. an Attributen des Typs binary in CMS-Objekten. Werfen wir einmal einen Blick auf eine typische Definition des Image-Modells.

Der hier verwendete Attributname lautet blob, was Scrivitos voreingestelltem Namen für Zugriffe auf Binärdaten entspricht, um diese beispielsweise zu rendern.

Scrivito.provideObjClass('Image', {
  attributes: {
    blob: "binary",
    caption: "html",
  }
});

Lädt man eine binäre Datei in ein Image-Objekt, überträgt Scrivito es zu Amazons S3-Dateispeicher und legt die Bild-URL im binary-Attribut namens blob des CMS-Objekts ab. Dies alles geschieht transparent im Hintergrund. Man braucht beispielsweise Bilder nicht zu entfernen, nachdem die Widgets oder Objekte, die es referenzieren, gelöscht wurden.

Ein Wort zur Indizierung für die Suche

Scrivito erzeugt und aktualisiert Suchindizes sowohl für die veröffentlichten Inhalte als auch für sämtliche Arbeitskopien. Alle Attribute eines CMS-Objekts wie beispielsweise der obigen Seite einschließlich der Attribute in den darin enthaltenen Widgets werden indiziert und dem betreffenden Objekt zugeordnet. Demzufolge gehört zu jedem CMS-Objekt nicht nur genau ein Eintrag in der Datenbank, sondern auch genau ein Eintrag im Suchindex.

Kurz zusammengefasst, ...

CMS-Objekte und ihr gesamter in Textform vorliegender Inhalt, einschließlich der Metadaten werden in einer Datenbank gespeichert. Binäre Daten werden mittels Diensten zur Dateispeicherung persistiert und mit den Objekten in der Datenbank assoziiert. Scrivito pflegt Suchindizes für sämtliche Inhalte in allen Arbeitskopien.