mschomacker
I'm new here

Metadaten-abhängige Veröffentlichung in verschiedene Zielverzeichnisse

Hallo zusammen,

wir möchten freigegebene Inhalte aus FirstSpirit generieren und anhand eines gesetzten Metadatums in verschiedene Zielverzeichnisse auf dem FS-Server veröffentlichen.

Nun gilt es, nachdem alle relevanten PageRef-Objekte identifiziert wurden, deren Abhängigkeiten zu finden und in ihrer Gesamtheit in die jeweiligen Zielverzeichnisse zu kopieren. Leider wissen wir nicht, wie dies am effizientesten zu bewerkstelligen ist.

Für Tipps wären wir sehr dankbar Smiley Happy

Mit den besten Grüßen aus Nürnberg,

Alex Kätscher, Michi Schomacker

DATEV eG

0 Kudos
13 Replies
Peter_Jodeleit
Crownpeak employee

Wo wird das Metadatum denn gesetzt?

Erzeugt ihr im Template absolute Links?

Umfasst die Generierung immer die komplette Seite oder zumindest vollständig abgeschlossene Bereiche?

Peter
0 Kudos

Hallo Peter,

das Metadatum wird an Seiten im Pagestore gesetzt.

Wir erzeugen relative Links im Template und arbeiten aktuell mit einer Vollgenerierung.

Viele Grüße

Alex

0 Kudos
hoebbel
Crownpeak employee

Hallo Alex,

ich bin mir nicht sicher, ob ich es richtig verstehe.

Die entsprechenden Knoten liegen irgendwo im Projekt [also Teilprojektgenerierungen über entsprechende Teilbäume und deren Veröffentlichung ist keine Lösung]?

Die Verlinkung der auf die unterschiedlichen Server verteilten Knoten wird irgendwie sichergestellt?

Für jeden Knoten gibt es genau ein Ziel?

Wenn das alles so zutrifft, würde ich das so lösen:

- entweder mehrere Aufträge definieren (parallele Ausführung möglich) oder einen Auftrag mit vielen Generierungs- und Veröffentlichungsaktionen, die nacheinander ausgeführt werden.

- in jeder Generierungsaktion über eine Variable definieren, für welches Ziel die Seiten generiert werden sollen

- über eine entsprechende Abfrage am Anfang jedes Seitentemplates prüfen, ob die entsprechende Seite für das aktuelle Ziel erzeugt werden muss. Wenn nein, die Generierung der Seite abbrechen [$CMS_SET(#global.stopGenerate,true)$]

- Die erzeugten Seiten auf das passende Ziel veröffentlichen

ACHTUNG: Durch das #global.stopGenerate wird die Erzeugung der Seite abgebrochen. Links auf diese Seite müssen manuell korrigiert werden, sofern das notwendig ist (siehe entsprechende Frage oben)

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos

Hallo,

vielen Dank für die rasche Antwort.

Die entsprechenden Knoten liegen irgendwo im Projekt?

Ja, sie liegen verteilt im Projekt.

 

Die Verlinkung der auf die unterschiedlichen Server verteilten Knoten wird irgendwie sichergestellt?

Die Verlinkung ist relativ, d.h. die auf einem Server abgelegten Seiten verlinken sich nur untereinander.

Für jeden Knoten gibt es genau ein Ziel?

Nein, eine Seite kann auch auf mehreren Server liegen.

Zwei Beispiele:

  • eine für alle Server gekennzeichnete Seite soll mit allen abhängigen Objekten (z.B. Bilder) auf allen drei Servern verfügbar sein
  • eine für Server B gekennzeichnete Seite (Metadatum) soll mit allen abhängigen Objekten nur auf Server B verfügbar sein

Wir fürchten, dass wir nach einer anderen Lösung suchen müssen, da z.B. auch verlinkte Dateien nur für ein Server gedacht sein können.

Unsere aktuelle Idee auf Basis eines Blog-Posts:

import de.espirit.firstspirit.access.schedule.*;

deltaGeneration = DeploymentUtil.createDeltaGeneration(context); //(1)

DeltaGeneration.ChangeSet changeSet = deltaGeneration.calculateChangeSet(); //(2)

// Unsere Idee: ChangeSet anhand gesetzter Metadaten filtern

changeSet.configureGenerateTask(); //(3)

Quelle: https://community.e-spirit.com/community/developer/blog/2013/04/03/deltageneration--what-is-that-and...

Gibt es hier eine Möglichkeit?

Viele Grüße,

Alex Kätscher, Michi Schomacker

0 Kudos

Ich habe eine Vermutung, was hier versucht wird...

So ganz verstehe ich aber nicht, wofür die Metadaten im "pagestore" sind. Disjunkte Sites würde ich im "sitestore" abbilden. Das Trennen auf die Ziele kann dann im Deployment vorgenommen werden. Meiner Meinung nach ist das auch für Redakteure bzw. "Site-Architects" besser nachzuvollziehen. Inhalte werden unabhängig verfasst und dann in die Strukturen eingebunden.

Peter
0 Kudos

Hallo zusammen,

Nein, eine Seite kann auch auf mehreren Server liegen.

Zwei Beispiele:

  • eine für alle Server gekennzeichnete Seite soll mit allen abhängigen Objekten (z.B. Bilder) auf allen drei Servern verfügbar sein
  • eine für Server B gekennzeichnete Seite (Metadatum) soll mit allen abhängigen Objekten nur auf Server B verfügbar sein

Das wäre noch mit dem Lösungsansatz umsetzbar, den ich geschrieben hatte.

Wir fürchten, dass wir nach einer anderen Lösung suchen müssen, da z.B. auch verlinkte Dateien nur für ein Server gedacht sein können.

Das Linkziele nicht auf den entsprechenden Server veröffentlicht werden, ist schon bedeutend aufwändiger (wäre aber über entsprechende Abfragen in den Linktemplates lösbar)

Berücksichtigt man nun noch, dass die Navigation wahrscheinlich auch diese Unterscheidungen berücksichtigen muss, ist die von Peter angesprochene Lösung bedeutend einfacher.

Also einfach in der Struktur für jeden Zielserver einen entsprechenden Teilbaum aufbauen und bei der Veröffentlichung die Root-Knoten dieser Teilbäume als Startknoten verwenden.

Oder getrennte Projekte aufbauen und über Corporate Content die gemeinsamen Inhalte von einem Masterprojekt in die Slaveprojekte verteilen.

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos

Also einfach in der Struktur für jeden Zielserver einen entsprechenden Teilbaum aufbauen und bei der Veröffentlichung die Root-Knoten dieser Teilbäume als Startknoten verwenden.

S.o. (mein letzte Posting) Smiley Wink

Oder getrennte Projekte aufbauen und über Corporate Content die gemeinsamen Inhalte von einem Masterprojekt in die Slaveprojekte verteilen.

Das ist natürlich die sauberste Lösung. Für kleine Redaktionen aber potentiell ein "overkill".

Peter
0 Kudos

Hallo zusammen,

die Aufteilung in Teilbäume ist aus fachlichen Gründen leider nicht möglich. Aus diesem Grund präferieren wir die Prüfung in den Templates. Bezüglich der Seitentemplates konnten wir den Tipp bereits umsetzen (vielen herzlichen Dank dafür):

$CMS_SET(serverToDeployTo, server)$

$CMS_SET(targetServer, #global.page.metaFormData.get(null, "md_server").get.toString)$

$CMS_IF(!serverToDeployTo != "all")$

     $CMS_IF(serverToDeployTo == "serverA" && targetServer != "serverA")$

          $CMS_SET(#global.stopGenerate, true)$

          ...

     $CMS_END_IF$

$CMS_END_IF$

Nun stehen wir vor der Herausforderung, verlinkte Dateien (Bilder, PDFs, etc.) nur dann zu generieren, wenn diese für den jeweiligen Zielserver gekennzeichnet wurden.

Das Linkziele nicht auf den entsprechenden Server veröffentlicht werden, ist schon bedeutend aufwändiger (wäre aber über entsprechende Abfragen in den Linktemplates lösbar)

Wie würden diese Abfragen aussehen?

Für einen kurzen Sample-Code wären wir sehr dankbar Smiley Happy

Vielen Dank im Voraus.

Viele Grüße,

Alex Kätscher, Michi Schomacker

0 Kudos

Hallo zusammen,

[vorsicht, ungetesteter Code]

Ich würde es so machen:

Navigation {[un]selectedHTML}: $CMS_IF(#nav.ref.page.meta("myVar","none").toString != "all" && #nav.ref.page.meta("myVar","none").toString != targetServer.toString)$<<Ausgabe Navigationspunkt>>$CMS_END_IF$

Link (Annahme, sowohl Medien als auch Seitenreferenzen können verlinkt werden):

$CMS_IF(!st_mediaref.media.isEmpty)$

$CMS_IF(sitestoreref.media.meta("myVar","none").toString != "all" && sitestoreref.media.meta("myVar","none").toString != targetServer.toString)$

$CMS_ELSE$

$CMS_IF(sitestoreref.page.meta("myVar","none").toString != "all" && sitestoreref.page.meta("myVar","none").toString != targetServer.toString)$

$CMS_END_IF$

Wenn man mehr Prüfungen als die zwei benötigt, würde ich den aus den Metadaten ausgelesen String vorher in eine Variable schreiben und diese für die Prüfung nutzen:

$CMS_SET(linkTarget,#nav.ref.page.meta("myVar","none").toString)$

Hinweis: Wenn die Generierung einer Seite unterbrochen wird, so werden auf dieser Seite verlinkte Medien nicht erzeugt, sofern deren Verlinkung nicht vor dem setzen von #global.stopGenerate,true erfolgt. Hier muss also keinerlei Prüfung mehr stattfinden. Es gehtnur darum, ob die Verlinkungen auf die abgebrochenen Seiten erzeugt werden sollen.

Viele Grüsse aus Dortmund,

  Holger Höbbel

0 Kudos