Vorschau von strukturierten Inhalten aus Inhaltsanwendungen
Juni 14, 2022
--
Previewing Content From Content Apps 1200x628

Vorschau von strukturierten Inhalten aus Inhaltsanwendungen

Mit dem Headless CMS von Magnolia können Sie Inhalte in einem zentralen Hub verwalten und dann an mehreren Touchpoints verwenden. Vermarkter und Autoren von Inhalten können strukturierte Inhalte mit einer Inhalts-App verwalten. Content-Apps erleichtern die Eingabe von Inhalten wie Produkten oder Veranstaltungen über ein Formular.

Die zentralisierte Verwaltung von Inhalten hat mehrere praktische Vorteile. Zum Beispiel müssen Änderungen nur an einer Stelle vorgenommen werden, um den Inhalt in jedem Frontend automatisch zu aktualisieren. Außerdem können die Rechte so konfiguriert werden, dass verschiedene Abteilungen ihre eigenen Bereiche innerhalb desselben Content-Management-Systems haben.

Während Magnolia einen visuellen Editor zum Erstellen und Gestalten von Seiten bietet, gibt es bei den Content-Apps keine Vorschau. Eine Vorschau kann jedoch sehr nützlich sein, um zu prüfen, ob der erstellte Inhalt wie gewünscht aussieht, z. B. ob ein Titel korrekt umbrochen wird oder ein Bild richtig aussieht.

In diesem Blog-Artikel möchte ich Ihnen zeigen, wie Sie auf einfache Weise eine Vorschau für Content-Apps erstellen können. Sie können diese Funktionalität in Ihrer Umgebung nachbilden, indem Sie meine Code-Beispiele kopieren.

Sie benötigen eine Webanwendung, ein zusätzliches Maven-Modul und ein Magnolia Light-Modul:

  • blog-vorschau-webapp

  • blog-vorschau-konfig

  • blog-vorschau-light

Erstellen der App für Veranstaltungsinhalte

Zunächst erstellen wir einen Inhaltstyp und eine Inhalts-App für Veranstaltungen mit Magnolia Light Development, unserem Low-Code-Ansatz. Wenn Sie noch nicht mit Inhaltstypen und Apps in Magnolia vertraut sind, empfehle ich Ihnen, das Tutorial zu Inhaltstypen zu lesen.

Erstellen der Content-Type-Modell-Definition

Wir erstellen eine sehr einfache Definition des Inhaltstyps "Ereignisse" gemäß der Dokumentation zum Inhaltstyp.

Datei: blog-preview-light/contentTypes/events.yaml

YAML
  datasource: workspace: events autoCreate: true model: nodeType: event properties: - name: name label: Ereignisname required: true i18n: true - name: location label: Ort i18n: true - name: startDate label: StartDate type: Datum - name: endDate label: EndDate type: Date - name: abstract label: Abstract i18n: true - name: description label: Beschreibung Typ: RichText i18n: true  

Erstellen der App für Veranstaltungsinhalte

Für die App "Events" verwenden wir den zuvor definierten Inhaltstyp. Halten wir die App vorerst einfach: Verweisen Sie auf den Inhaltstyp "Events" und weisen Sie ihr einen Namen und eine Bezeichnung zu.

Dateipfad: blog-preview-light/apps/events-app.yaml

YAML
  !content-type:events name: events-app label: Veranstaltungen  

Wir werden die Definition später erweitern.

Erstellen der Seitenvorlage für die Veranstaltungsvorschau

Für die Vorschau von Inhalten außerhalb einer Webanwendung benötigen wir eine Seitenvorlage für deren Darstellung. Wir können diese Seitenvorlage nur für die Vorschau verwenden, oder wir können die Seitenvorlage der eigentlichen Webanwendung verwenden.

Da wir noch keine Seitenvorlagen erstellt haben, müssen wir jetzt eine neue Vorlage für die Vorschau erstellen.

Erstellen der Vorlagendefinition für die Ereignisseite

Zunächst erstellen wir eine einfache Seitendefinition, ohne einen Benutzerdialog zu definieren.

Datei: blog-preview-light/templates/pages/event.yaml

YAML
  Titel: Event templateScript: /blog-vorschau-licht/templates/seiten/event.ftl renderType: freemarker  

Schreiben des Skripts für die Ereignisseitenvorlage

Der zweite Schritt besteht darin, ein einfaches Vorlagenskript zu erstellen, das alle Ereigniseigenschaften anzeigt.

Datei: blog-preview-light/templates/seiten/event.ftl

XML/HTML
  <!DOCTYPE html>
<html>
 <head>
   [@cms.page /] <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /><style>.container {/* Fügen Sie Ihren Container-Stil ein*/} .element {/* Fügen Sie Ihren Element-Stil ein*/} </style></head>
 <body>
   <!-- ${cmsfn.dump(content, 5, true)} uncomment to see all the properties -->
   <div class="container">
       <div class="element">Name: ${content.name}</div>
       <div class="element">Standort: ${content.location}</div>
       <div class="element">StartDatum: ${content.startDate}</div>
       <div class="element">EndDate: ${content.endDate}</div>
       <div class="element">Zusammenfassung: ${content.abstract}</div>
       <div class="element">Beschreibung: ${cmsfn.decode(content).description!""}</div>
   </div>
 </body>
</html>

Aktualisieren der Maven-Modulkonfiguration

Um die gleiche Logik in der Vorschau zu verwenden, die auch in der Web-App verwendet wird, müssen wir zwei Änderungen im Maven-Modul vornehmen.

Modul.xml aktualisieren

Wir nehmen die erste Änderung in module.xml vor, indem wir die neuen Komponenten nach folgendem Muster in die Komponentendefinition aufnehmen: app-<app name>-<subapp name>.

Datei: blog-preview-config/src/main/resources/META-INF/magnolia/blog-preview-config.xml

XML/HTML
  <!-- For the event preview -->
<components>
 <id>app-events-app-preview</id>
 
 <component>
   <type>info.magnolia.pages.app.detail.PageEditorStatus</type>
   <implementation>info.magnolia.pages.app.detail.PageEditorStatus</implementation>
   <scope>Singleton</scope>
 </component>
 <component>
   <type>info.magnolia.ui.framework.ContentClipboard</type>
   <implementation>info.magnolia.pages.app.detail.action.clipboard.ComponentContentClipboard</implementation>
   <scope>Singleton</scope>
 </component>
 <component>
   <type>info.magnolia.ui.vaadin.editor.PageEditorView</type>
   <implementation>info.magnolia.ui.vaadin.editor.PageEditorViewImpl</implementation>
 </component>
</components>

Bootstrapping URI2RepositoryMapping

Die zweite Änderung nehmen wir vor, indem wir das URI2RepositoryMapping hinzufügen. Um die Änderung beim Starten der Umgebung zu aktivieren, verwenden wir den Bootstrap-Mechanismus des Maven-Moduls.

Datei: blog-preview-config/src/main/resources/mgnl-bootstrap/blog-preview-config/config.server.URI2RepositoryMapping.mappings.event.yaml

YAML
  Ereignis": "URIPrefix": "/events-app" "handlePrefix": '' "repository": "events  

Erstellen der Vorschau-Subapp für Ereignisse

Nachdem nun alle notwendigen Teile vorhanden sind, können wir die eigentliche Vorschau-Subapp für die Event-App erstellen. Die folgenden Codeänderungen sind besonders interessant:

Aktion:

Wir definieren eine Aktion, die unsere unten definierte Vorschau-Subapp aufruft.

Aktionsleiste:

In der Aktionsleiste aktivieren wir die zuvor definierte Aktion ShowPreview.

Detail subapp:

In der Details-Subapp fügen wir für jedes neu erstellte Ereignis eine versteckte Eigenschaft "mgnl:template" mit dem Standardwert "blog-preview-light:pages/event" hinzu. Dies ist der Zauber, der es uns ermöglicht, die Rendering-Engine der Webanwendung zu verwenden.

Vorschau subapp:

In der Vorschau-Subapp definieren wir die 'extensionViews' aus der Magnolia Pages App sowie einige Aktionen in der Aktionsleiste. Die 'extensionViews' sind dafür verantwortlich, dass z.B. der Sprachwechsler im unteren Bereich der Vorschau angezeigt wird.

Datei: blog-preview-light/templates/pages/event.yaml

YAML
  !content-type:events name: events-app label: Ereignisse subApps: browser: actions: showPreview: $type: openDetailSubappAction label: Vorschau anzeigen icon: icon-view viewType: view appName: events-app subAppName: preview availability: writePermissionRequired: true nodeTypes: event: event actionbar: sections: item: groups: addActions: items: showPreview: {} detail: label: Event form: properties: mgnl:template: $type: hiddenField defaultValue: 'blog-preview-light:pages/event' preview: class: info.magnolia.pages.app.detail.PageDetailDescriptor extensionViews: title: class: info.magnolia.pages.app.detail.extension.PageTitleViewDefinition status: class: info.magnolia.pages.app.detail.extension.PublishingStatusViewDefinition link: class: info.magnolia.pages.app.detail.extension.NativePagePreviewLinkViewDefinition language: class: info.magnolia.pages.app.detail.extension.LanguageSelectorViewDefinition itemProvider: $type: jcrNodeFromLocationProvider actions: activate: $type: jcrCommandAction icon: icon-publish catalog: default command: publish params: recursive: true availability: writePermissionRequired: true rules: isPublishable: &isPublishable $type: jcrPublishableRule deactivate: $type: jcrCommandAction icon: icon-unpublish catalog: default command: unpublish availability: writePermissionRequired: true rules: isPublishable: *isPublishable notDeleted: $type: jcrIsDeletedRule negate: true isPublished: $type: jcrPublishedRule actionbar: sections: previewActions: label: Vorschau Aktionen Gruppen: veröffentlichen: Elemente: - Name: aktivieren - Name: deaktivieren Verfügbarkeit: Regeln: inPreview: Klasse: info.magnolia.pages.app.detail.action.availability.IsPreviewRuleDefinition  

Herzlichen Glückwunsch! Wenn Sie nun Ihren Server starten und die App "Events" öffnen, können Sie eine Vorschau Ihrer Events anzeigen.

content_app_preview1

Sie werden jedoch feststellen, dass auf der Registerkarte Vorschau der Name des Ereignisknotens nicht angezeigt wird. Sehen wir uns an, wie wir das beheben können.

Anzeige des Knotennamens in der Vorschau

Um den Knotennamen in der Registerkarte "Vorschau" anzuzeigen, müssen wir die Welt von Light Development verlassen und eine kleine Java-Anpassung vornehmen. Diese Änderung ist notwendig, weil das Standardverhalten der Titelgenerierung für Inhaltstypen nicht funktioniert.

Erstellen eines benutzerdefinierten DetailDeskriptors

Zunächst erstellen wir einen DetailDescriptor, um unsere Subapp bekannt zu machen.

Datei: blog-preview-config/src/main/java/info/magnolia/blog/preview/preview/NodePreviewDetailDescriptor.java

Java
  package info.magnolia.blog.preview.preview; import info.magnolia.pages.app.detail.PageDetailDescriptor; public class NodePreviewDetailDescriptor extends PageDetailDescriptor { public NodePreviewDetailDescriptor() { setSubAppClass(NodePreviewDetailSubApp.class); } }  

Erstellen einer benutzerdefinierten DetailSubApp

In der DetailSubApp überschreiben wir die getCaption-Methode, um den Knotentitel in einer Vorschau-Registerkarte zu erstellen.

Datei: blog-preview-config/src/main/java/info/magnolia/blog/preview/preview/NodePreviewDetailSubApp.java

Bash
  package info.magnolia.blog.preview.preview; import info.magnolia.pages.app.detail.PageDetailDescriptor; import info.magnolia.pages.app.detail.PageDetailSubApp; import info.magnolia.pages.app.detail.PageEditorStatus; import info.magnolia.pages.app.detail.context.MoveComponentContext; import info.magnolia.ui.api.app.SubAppContext; import info.magnolia.ui.contentapp.detail.ContentDetailSubApp; import info.magnolia.ui.vaadin.editor.PageEditorView; import javax.inject.Inject; public class NodePreviewDetailSubApp extends PageDetailSubApp { private final PageEditorStatus pageEditorStatus; @Inject public NodePreviewDetailSubApp(SubAppContext subAppContext, PageDetailDescriptor subAppDescriptor, ContentDetailSubApp.LocationContext locationContext, MoveComponentContext moveComponentContext, PageEditorStatus pageEditorStatus, PageEditorView pageEditorView) { super(subAppContext, subAppDescriptor, locationContext, moveComponentContext, pageEditorStatus, pageEditorView); this.pageEditorStatus = pageEditorStatus; } @Override public String getCaption() { return pageEditorStatus.getNodePath().substring(pageEditorStatus.getNodePath().lastIndexOf('/') + 1).trim(); } }  

Aktualisieren der Vorschau-Subapp-Klasse

Schließlich ändern wir die Definition der Ereignis-App. Anstatt die Standardklasse info.magnolia.pages.app.detail.PageDetailDescriptor zu verwenden, definieren wir die neue Klasse info.magnolia.blog.preview.preview.NodePreviewDetailDescriptor in Zeile 33.

Datei: blog-preview-light/templates/pages/event.yaml

YAML
  subApps: [...] preview: Klasse: info.magnolia.blog.preview.preview.NodePreviewDetailDescriptor [...]  

So sieht die Vorschau-Registerkarte jetzt aus:

content_app_preview2

Die Erstellung einer Vorschau für die Content App ist einfach und hilft den Autoren

Mit relativ einfachen Mitteln ist es möglich, schnell eine Vorschau beliebiger Inhalte zu erstellen. Eine Vorschau für Content-Apps kann das Redaktionserlebnis wirklich verbessern. Autoren können mit nur einem Klick prüfen, wie ihre Inhalte aussehen werden, was Zeit und Nerven spart.

Über den autor

Tobias Kerschbaum

Solution Architect, Magnolia

Als Solution Architect arbeitet Tobias eng mit Kunden und Partnern zusammen und teilt sein Wissen und seine Erfahrung. Er hilft Unternehmen dabei, zu bewerten und zu verstehen, wie Magnolia die Projektanforderungen erfüllen kann. Er trägt zum Projektplan bei und stellt sicher, dass die richtigen Module und Technologien ausgewählt werden. Neben der Durchführung von maßgeschneiderten Workshops wird Tobias auch aktiv, wenn Kunden und Partner neue Funktionen oder individuelle Anforderungen implementieren müssen.