Testen Sie Scrivito 30 Tage lang kostenlos
Testen Sie Scrivito 30 Tage lang kostenlos

Mehrere Websites betreiben

Mehrere Websites betreiben

Mit Scrivito können Unternehmen mehrere Websites ausliefern und die Inhalte der verschiedenen Webauftritte mit nur einem CMS pflegen. Ob es dabei um Länderseiten, ein Kundenportal oder Websites für Marketing- oder Bildungszwecke geht – nicht nur können alle Auftritte aus demselben CMS mit Inhalten versorgt werden, sondern sie sind darüber hinaus in der Bedienoberfläche getrennt und komfortabel bearbeitbar.

Technisch betrachtet ist Scrivitos Ansatz, mehrere Websites zu unterstützen, ebenso einfach wie flexibel, weil Websites mit einigen wenigen Zeilen Code hinzugefügt werden können (optional sogar von Redakteuren, d.h. ohne Code-Änderungen) und man bei der Arbeit an Inhalten mit einem einzigen Klick zwischen den Websites umschalten kann.

Hauptmerkmale des Multisite-Betriebs

  • Wie oben angedeutet, brauchen beim Betrieb mehrerer Websites mit einem einzigen CMS keine Inhalte (beispielsweise Bilder) mehr dupliziert zu werden, nur weil sie auf mehr als einer Website verwendet werden. Auch sorgt der Umstand, dass es nur noch eine Webanwendung gibt, dafür, dass kein von mehreren Anwendungen genutzter Code zum Zwecke der Wiederverwendbarkeit ausgelagert werden muss.
  • Um eine auf Scrivito basierende Applikation auf mehrere Websites umzustellen, sind lediglich zwei Callbacks erforderlich, die es dem SDK erlauben, die ID einer jeden Website sowie deren Basis-URL zu ermitteln, um das richtige Routing durchzuführen.
  • Alle CMS-Objekte, d.h. alle Seiten, Bilder, andere Medien usw. sind entweder genau einer Website zugeordnet oder allen Websites. Hierfür gibt es das Attribut siteId.
  • Sämtliche Vorgänge in der Webapplikation (etwa Navigationen darstellen) beziehen sich auf die gegenwärtig aktive Website. Die aktive Website wird über die gerade angezeigte Seite bestimmt. Permalinks werden ausschließlich im Kontext der aktiven Website aufgelöst, Suchanfragen ebenfalls. Zusätzlich gibt es ein API, mit dem man über alle Websites hinweg suchen kann.
  • Die Benutzeroberfläche stellt sich automatisch auf die aktive Website ein. Wo immer angebracht, gibt es die Möglichkeit, eine Website auszuwählen, beispielsweise in der Hierarchie-Seitenleiste. Im Content Browser werden nicht website-spezifische, also globale Inhalte gekennzeichnet, so dass sie klar von den Inhalten unterscheidbar sind, die zur aktuellen Website gehören. Inhalte können über Websites hinweg verlinkt, eingebettet, kopiert oder verschoben werden.
  • Workflows unterstützen Sie dabei, Redakteure nur Inhalte auf bestimmten Websites erstellen und bearbeiten zu lassen. So können versehentliche Änderungen an Website-Inhalten vermieden werden.

Grundlagen der Website-Einrichtung

Wie oben erwähnt, kann im Multi-Website-Betrieb jeder Inhalt in einem CMS Scrivito entweder global sein und damit zu allen Websites gehören, oder aber genau einer Website zugeordnet sein. Die Website-Zuordnung eines CMS-Objekts ist in seinem Attribut siteId hinterlegt. Im Single-Website-Betrieb gehören alle CMS-Objekte zu derselben Website, und das siteId-Attribut hat in diesem Fall den Wert default.

Eine auf Scrivito basierende Applikation lässt sich mit Hilfe zweier Callbacks, siteforUrl und baseUrlForSite, für den Betrieb mit mehreren Websites einrichten. Die Callbacks bilden eine siteID auf die dazu gehörende URL ab (und umgekehrt), so dass die Applikation die gerade angezeigte Website ermitteln und die dazu passenden URLs generieren kann. Fügen Sie beide Callbacks zur Konfiguration der Applikation in Scrivito.configure hinzu.

Das folgende Beispiel zeigt, wie siteForUrl und baseUrlForSite implementiert werden könnten, sofern es für jede Website eine eigene Domain gibt:

config/scrivito.js  Beispiel für eigene Domain je Website
Scrivito.configure({ baseUrlForSite(siteId) { switch (siteId) { case "international": return "https://example.com"; case "german": return "https://example.de"; } }, siteForUrl(url) { switch (new URL(url).hostname) { case "example.com": return { siteId: "international", baseUrl: "https://example.com", }; case "example.de": return { siteId: "german", baseUrl: "https://example.de", }; } }, // other keys … });

Scrivito ruft baseUrlForSite auf, um den Ausgangspunkt der Website mit der übergebenen ID zu ermitteln. Die Funktion muss eine absolute URL zurückgeben.

siteForUrl wird aufgerufen, um die ID zu ermitteln, zu der eine bestimmte absolute URL gehört. Wenn die Website die Domain insgesamt belegt (wie in obigem Beispiel), braucht siteForUrl nur diese ID zurückzugeben. Teilen sich mehrere Websites jedoch eine Domain (wie im folgenden Beispiel), sollte siteForUrl sowohl die ID der Website als auch deren Basis-URL zurückgeben.

config/scrivito.js Beispiel für Websites unter URL-Pfaden
function baseUrlForSite(siteId) { switch (siteId) { case "international": return `${window.location.origin}/intl`; case "german": return `${window.location.origin}/de`; } } function siteForUrl(url) { let siteId; switch (new URL(url).pathname.split("/")[1]) { case "intl": siteId = "international"; return { siteId, baseUrl: baseUrlForSite(siteId) }; case "de": siteId = "german"; return { siteId, baseUrl: baseUrlForSite(siteId) }; } } Scrivito.configure({ siteForUrl, baseUrlForSite, // other keys … });

Können die Callbacks mit der übergebenen siteId oder url nichts anfangen, müssen sie undefined zurückgeben, um dies anzuzeigen. Bei baseUrlForSite interpretiert Scrivito undefined als “Website nicht gefunden”, während undefined als Ergebnis eines siteForUrl-Aufrufs nichts weiter bewirkt, da die hereingereichte URL offenbar zu keiner der Websites gehört.

Websites und URLs dynamisch zuordnen

In den obigen Beispielen sind die Website-IDs den Basis-URLs fest zugeordnet. Dies ist ein einfacher und vollkommen ausreichender Ansatz, wenn es nur um einige wenige Websites geht. Sollen Websites jedoch spontan angelegt werden können, wäre es zu umständlich, jedes Mal die Konfiguration anpassen und die Applikation wieder deployen zu müssen. Stattdessen können Sie die Daten, die zur Ermittlung der jeweiligen Website-ID und Basis-URL erforderlich ist, in den Inhalten selbst hinterlegen, beispielsweise in einem Attribut namens hostname, subdomain oder pathPrefix.

Im folgenden Code-Beispiel wird angenommen, dass alle CMS-Objekte vom Typ Homepage mit einem hostname-Attribut ausgestattet sind, dessen jeweiliger Wert für genau eine Website steht.

config/scrivito.js Beispiel für dynamische Website-Erzeugung
function baseUrlForSite(siteId) { const siteRoot = Scrivito.Obj.onSite(siteId).root(); const hostname = siteRoot?.get("hostname"); if (hostname) return `https://${hostname}`; } Scrivito.configure({ baseUrlForSite, siteForUrl(url) { const siteId = Scrivito.Obj.onAllSites() .where("hostname", "equals", new URL(url).hostname) .first() ?.siteId(); if (siteId) { return { siteId, baseUrl: baseUrlForSite(siteId) }; } }, // other keys … });

In diesem Beispiel ist zu sehen, dass die beiden Callback-Funktionen Zugriff auf CMS-Inhalte haben. In diesen Funktionen dürfen jedoch keine APIs verwendet werden, die auf diese Callbacks zurückgreifen, um die aktuelle Website oder Seite zu ermitteln. Scrivito.Obj.where, als Beispiel, durchsucht die aktuelle Website, jedoch würde es zu einer Rekursion kommen, wenn diese Methode in den Callback-Funktionen ausgeführt werden würde. Stattdessen sollte Scrivito.Obj.onAllSites().where verwendet werden.

In Verbindung mit einem Platzhalter-DNS-Eintrag (und einem entsprechenden SSL-Zertifikat) würde der obige Ansatz es Redakteuren erlauben, neue Websites ohne Unterstützung durch einen Entwickler oder Administrator einzurichten. Wenn Sie nur über eine einzige Domain verfügen, können Sie anstelle von homepage ein Pfad-Präfix als Attribut bearbeitbar machen und die Callbacks entsprechend anpassen.

Die Homepages der Websites anlegen

Unter der Annahme, dass Ihre Website-Infrastruktur statisch ist, d.h. keine redaktionell festgelegten Bestandteile wie Domainnamen oder URL-Pfade berücksichtigt werden müssen, können Sie die von den Callbacks unterstützten Websites mit jeweils einem einzigen Kommando in der Browser-Konsole anlegen:

Scrivito.getClass("Homepage").create({_siteId: "international", _path: "/", title: "International Homepage"})

Sofern eine geeignete Arbeitskopie ausgewählt wurde, legt das obige Kommando ein CMS-Objekt vom Typ „Homepage“ an, setzt dessen Pfad auf / und dessen Titel provisorisch auf einen thematisch passenden Wert. Bitte beachten Sie, dass alle Homepages den Pfad / haben müssen, damit Redakteure Unterseiten anlegen, d.h. die Seitenhierarchie aufbauen und daran arbeiten können. Auch erkennt die Methode Obj.root die Homepage einer Website an diesem Pfad.

Nachdem das Kommando für die „International Homepage“ und die „German Homepage“ ausgeführt wurde, enthält die „Websites“-Seitenleiste diese beiden Websites.

Denken Sie bei der Migration eines Scrivito-CMS von einer einzelnen Website zu mehreren Websites bitte daran, dass sich die default-Zuordnung der bestehenden Inhalte nicht ändert. Sollten Sie diese Inhalte weiter verwenden wollen, können Sie entweder die Callbacks entsprechend erweitern oder die siteId der betreffenden CMS-Objekte ändern, oder beides. Um beispielsweise sämtliche Inhalte der default-Website auf die english-Website umzuschichten, können Sie das folgende kleine Skript in der Browser-Konsole ausführen (wiederum, nachdem die zu verwendende Arbeitskopie ausgewählt wurde):

objs = await Scrivito.load(() => Scrivito.Obj.onSite("default").all().toArray()) objs.forEach(obj => obj.update({ _siteId: "english" }))

Was noch erwähnt werden sollte …

  • Wie Sie bestimmt schon vermutet haben, können die beiden Callbacks für die Zuordnung von Website-IDs zu URLs alle Daten nutzen, auf die sie zugreifen können, um eine Website-ID oder URL zu ermitteln. Man könnte also beispielsweise den Hostnamen oder den Pfad-Präfix vom Wert einer bestimmten Umgebungsvariablen abhängig machen.
  • Die Konfigurationsparameter routingBasePath und origin von Scrivito.configure sind ausschließlich für den Betrieb von Scrivito mit einer einzigen Website gedacht. Diese Parameter werden nicht benötigt, wenn die beiden Callbacks angegeben wurden. Ist origin oder routingBasePath dennoch belegt, gilt dies als Fehler.
  • Wenn Sie eigenständige Domains für Ihre Websites haben, können deren Inhalte nur über edit.scrivito.com bearbeitet werden, weil die Bearbeitungsschnittstelle, die zusammen mit dem SDK ausgeliefert wird, nicht mit mehreren Hostnamen umgehen kann.