imperia CMS logo   +   mongoDB logo

 

Statischer Content, dynamische Auslieferung. Ein Traum an Flexibilität!

Der Klassiker

Betrachtet man das klassische imperia-Projekt, wird das imperia Content Management System dazu genutzt, um statisches HTML auf ein oder mehrere Zielsysteme zu verteilen. Zumeist sind das Server, auf denen ein Apache-Webserver fertig gerenderte HTML-Dateien ausliefert. Damit möglichst wenig Redundanz entsteht, kann man wiederverwendbare Bausteine, wie beispielsweise Header, Navigation, Teaser-, Kontaktboxen oder Footer, mittels Copy-Page Mechanismus als einzelne HTML-Snippets speichern. Via Server Side Includes (SSI) werden diese Bausteine im HTML eingebunden.

Beispiel Webseite

 

Dateisystemstruktur

www
 |-- index.html
 |
 +-- ssi
      |
      |-- header
      |     |
      |     +-- header.ssi
      |
      |-- nav
      |     |-- breadcrumb-index.ssi
      |     +-- leftnav-index.ssi
      |
      |-- content
      |     |-- teaser-1-index.ssi
      |     +-- teaser-2-index.ssi
      |
      |-- margin
      |     |-- search.ssi
      |     |-- contact.ssi
      |     +-- map.ssi
      |
      +-- footer
            |
            +-- footer.ssi

Der Vorteil dieser Vorgehensweise besteht darin, dass man seine Webseite mit geringem Aufwand sehr schnell ausliefern kann. Da der Webserver lediglich statischen Content ausliefern muss, ist der Google PageSpeed durch einfache Caching Maßnahmen einfach optimierbar.

Der Nachteil dieser Methode besteht darin, dass man in komplexen Webanwendungen sehr viele statische Dateien generieren muss, um mehrere Systeme mit Content bedienen zu können.

 

Ein vereinfachtes Beispiel – Ihr Unternehmen betreibt

  • einen Internetauftritt zur Kundeninformation
  • einen Webshop (bspw. osCommerce) zum Vertrieb Ihrer Produkte
  • eine nativen App für Android und iPhone
  • ein Intranet (bspw. Intrexx) mit diversen Mitarbeiterservices
  • weitere Applikationen: Onlineforum, Issue-Tracking, Bewerbungsportal, etc.

und möchte Kontaktinformationen zentral über imperia CMS verwalten.

 

Das würde zur Folge haben, dass man für alle Systeme genau zugeschnittene Kontaktdaten in sämtlichen Ausprägungen bereitstellen müsste:

imperia CMS - Beispiel komplexe Serverumgebung

 


 

Die Weiterentwicklung – MongoDB als zentrale Content-Datenbank

Wieso also nicht Content zentral ablegen und von den jeweiligen Anwendungen abholen lassen?

 

imperia CMS - Beispiel komplexe Serverumgebung mit zentraler mongoDB

 

Der Kontaktdatensatz wird über ein Hermes-Plugin als JSON-Objekt in die mongo-collection „elements“ abgelegt:

{
    "id":42,
    "type":"contact",
    "language":"en",
    "model": {
        "firstname":"John",
        "name":"Doe",
        "street":"Some Street",
        "number":1,
        "location":"Somewhere",
        "zip":123
    }
}

 

Die Vorteile auf einen Blick

Es ergeben sich schlagartig folgende Vorteile:

  • CMS Entwickler implementieren genau 1 Ausgabeformat
  • Anwendungsentwickler adaptieren den Content nach ihren Anforderungen – sie kennen ihre Anwendung ja schließlich am Besten
  • Content wird durchsuchbar!
    • Attribute lassen sich indexieren und somit schnell auffinden
    • über den MongoDB Text-Index wird eine mächtige Volltextsuche frei Haus mitgeliefert
    • mittels GEO-Index lassen sich Umgebungssuchen realsieren (z.B. für eine Umkreissuche Ihrer Firmenstandorte)
  • kein Datenbankdesign notwendig
    verschwenden Sie nicht wertvolle Zeit mit Anpassung von Datenbanktabellen nur weil sich im Laufe der Zeit Ihr Content-Objekt ändert

    • imperia CMS Deployments beziehen sich nur auf die Anwendung, nicht auf die Datenbank
  • kein Markup-Overhead wie bei HTML oder XML – lassen Sie die jeweilige Anwendung entscheiden, wie die Daten interpretiert und weiterverarbeitet werden sollen

 


 

Aber wie speicher ich imperia CMS Dokumente als MongoDB Datensätze ab?

Ich habe hierzu ein Framework entwickelt, das imperia Dokumente als JSON-Objekte rendert und CREATE-, READ-, UPDATE- und DELETE-Operationen (CRUD) via Hermes-Notification auf eine MongoDB durchführen kann.

Das Framework ist strukturell wie folgt aufgebaut:

 

site
 |
 |-- config
 |     |
 |     + project_mongodb.conf
 |
 |-- include
 |     |
 |     |-- htms
 |     |    |
 |     |    |-- contact.htms
 |     |    |-- footer.htms
 |     |    |-- gallery.htms
 |     |    |-- header.htms
 |     |    |-- searchBox.htms
 |     |    |-- title.htms
 |     |    +-- ...
 |     |
 |     +-- edit_element.pl
 |
 +-- modules
       |
       + -- core
             |
             |-- Dynamic
             |     |
             |     +-- MessageCheck
             |     |     |
             |     |     +-- ICMSController.pm
             |     |
             +-- Project
                   |
                   +-- MongoDB
                   |     |
                   |     |-- Factory
                   |     |     |
                   |     |     +-- StructFactory.pm
                   |     |
                   |     |-- Model
                   |     |     |-- Element.pm
                   |     |     |-- Page.pm
                   |     |     +-- Template.pm
                   |     |
                   |     |-- Services
                   |     |     |-- MongoDB.pm
                   |     |     +-- REST.pm
                   |     |
                   |     +-- Structs
                   |           |
                   |           |-- Element
                   |           |     |-- contact.pm
                   |           |     |-- footer.pm
                   |           |     |-- gallery.pm
                   |           |     |-- header.pm
                   |           |     |-- searchBox.pm
                   |           |     |-- title.pm
                   |           |     +-- ...
                   |           |
                   |           +-- Page
                   |                 |-- Error404.pm
                   |                 |-- Start.pm
                   |                 |-- ...
                   |                 +-- XMLSitemap.pm
                   |
                   |-- ICMSController.pm
                   +-- Site.pm

 

Alles beginnt im imperia Template

Das Template bestimmt das Zusammenspiel der Perl-Module. Angenommen sie möchten die oben abgebildete Beispielseite mit Ihrem imperia CMS als JSON-Objekte generieren, dann inkludieren Sie lediglich die einzelnen Seitenelemente über das Include-File edit_module.pl:

[...]
 <div id="header"><!--CODEINCLUDE:edit_module.pl:PARAMETERS=header--></div>
 <div id="content"><!--INSERT_FLEXMODULE:INDEX=1:VALIDCODE=content:VIEW=standard.html:DND=1:JS_OPERATIONS=1--></div>
 <div id="margin">
 <div id="searchBox"><!--CODEINCLUDE:edit_module.pl:PARAMETERS=searchBox--></div>
 <div id="contact"><!--CODEINCLUDE:edit_module.pl:PARAMETERS=contact--></div>
 <div id="map"><!--CODEINCLUDE:edit_module.pl:PARAMETERS=map--></div>
 </div>
 </div>
[...]

 

Das Codeinclude edit_module.pl erzeugt die korrekten Eingabemasken für den Redakteur über die Namenskonvention von site/include/htms/ELEMENT.htms. Zudem werden Metainformationen im imperia Dokument hinterlegt, welche im weiteren Verlauf benötigt werden.

 

Die Publikation

Das MessageCheck PlugIn s/m/c/Dynamic/MessageCheck/ICMSController.pm (s/m/c = site/modules/core) liest die zuvor gesetzten Metainformationen und führt eine der folgenden Methoden aus:

package Project::Site;
sub validateAndSavePage();
sub validateAndSaveElement();

Handelt es sich bei dem freigeschalteten Dokument um eine vollständige Seite, wird ein Page-Objekt instantiiert. Das Page-Objekt generiert über die StructFactory das JSON seines eigene Seitentyps (Startseite, 404 Error Seite, …) inklusive der darin enthaltenen Elemente.

Handelt es sich um ein eigenständiges Seitenelement, wird ein Element-Objekt instantiiert und rekursive Abhängigkeiten aufgelöst. Beispielsweise, wenn der Header ein Breadcrumb-Objekt enthält, welches wiederum aus Link-Elementen besteht.

Schließlich rufen die validateAndSave-Methoden CRUD-Operationen des Moduls site/ICMSController.pm auf. Je nach Konfiguration nutzt der ICMSController den MongoDB-Service oder den REST-Service, um die JSON-Daten in der MongoDB zu persistieren.

 

UML imperia CMS mongoDB Framework

 

In der MongoDB sieht das Ergebnis folgendermaßen aus:

collection "page"
{
    "id":1,
    "type":"startpage",
    "language":"en",
    "parentId":null,
    "url":"/",
    "references": {
        "header": {"type":"ref", "id":100},
        "searchBox": {"type":"ref", "id":101},
        "contact": {"type":"ref", "id":102},
        "map": {"type":"ref", "id":103}
    }
}
collection "element"
{
    "id":100,
    "type":"header",
    "language":"en",
    "references": {
        "logo": {"type":"ref", "id":104},
        "breadcrumb": {"type":"ref", "id":105}
    }
}
collection "element"
{
    "id":101,
    "type":"searchBox",
    "language":"en",
    "model": {
        "formTitle": "Search",
        "buttonText": "Search",
        "errorMsg": "Please insert search value"
    }
}
collection "element"
{
    "id":102,
    "type":"contact",
    "language":"en",
    "model": {
        "title": "Contact",
        "gender": "male",
        "firstname":"John",
        "name":"Doe",
        "street":"Some Street",
        "number":1,
        "location":"Somewhere",
        "zip":123
    }
}
collection "element"
{
    "id":103,
    "type":"map",
    "model": {
        "latitude": 50.957245,
        "longitude": 6.9673224
    }
}

 

tl;dr

imperia CMS Entwickler, die mittels imperia-Dokumente JSON-Datensätze in einer MongoDB speichern möchten benötigen:

  • imperia CMS
  • imperia CMS MongoDB Framework

Für neue Seitenelemente benötigt man lediglich:

  • ein Include-File mit der Eingabemaske für das Template
  • ein JSON-Element-Struct

Für neue Seitentypen:

  • ein JSON-Page-Struct

 

Fertig! Alles weitere erledigt das Framework.

 

Anregungen? Fragen? Immer her damit 😉

 

Aber wo bleibt nur die Seitenstruktur? Hier geht es weiter: imperia CMS und mongoDB – Content bekommt Struktur

Bitte bewerten Sie meinen Beitrag:
grauenhafteinfach nur schlechtich habe es geschafft ohne einzuschlafengut ist gut genugsehr gut, bitte mehr davon (4 Bewertungen, Ø: 5,00 von 5)
Loading...