Hallo Udo,
vorweg: beschrieben mag sich das Ganze recht aufwändig anhören, ist aber in 30 Minuten gebaut.
1. Füge im Ausgabekanal des Projekteinstellungs-Templates folgendes hinzu:
$CMS_IF(!#global.preview && #global.scheduleContext.getProperty("gv_urlMap")==null)$
$CMS_SET(void,#global.scheduleContext.setProperty("gv_urlMap",{:}))$
$CMS_END_IF$
Hintergrund: Der Ausgabekanal der Projekteinstellungen wird zwar nicht "ausgegeben", aber zu Beginn jeder Generierung ausgewertet - und zwar pro Sprache und Ausgabekanal. Dieser Code legt eine leere Map in die Property "gv_urlMap" des Generierungskontextes. Diese Properties "leben" im Auftrag. Vor allem über mehrere Tasks im Auftrag. Nach Ausführung des Auftrages werden sie entsorgt.
2. Rendertemplate
Erstelle ein Rendertemplate (=Formatvorlage, z.B. "save_url_map") mit folgendem Inhalt:
$CMS_IF(!#global.preview && #global.scheduleContext.getProperty("gv_urlMap")!=null)$
$CMS_SET(set_infoMap,{
"nodeUid":#global.node.uid,
"lang":#global.language.abbreviation,
"templateSet":#global.templateSet.uid,
"datasetTable":#global.dataset.entity.entityType.name,
"datasetId":#global.dataset.entity.id
})$
$CMS_SET(set_url)$$CMS_REF(#global.ref, abs:2)$$CMS_END_SET$
$CMS_SET(void,#global.scheduleContext
.getProperty("gv_urlMap")
.put(set_url.toString,set_infoMap)
)$
$CMS_END_IF$
Die infoMap kannst Du nach Deinen Bedürfnissen anpassen, im Beispiel landen darin die UID der Seitenreferenz, die Sprache usw. Es muss nicht unbedingt eine Map sein. Du kannst auch das gv_urlMap bei Bedarf als Liste statt Map nutzen - je nachdem was am praktikabelsten ist. Da ich es aber so verstanden habe, dass Du zu den einzelnen Dateien diese Infos brauchst, macht eine Map mit den absoluten URLs als Keys hier wahrscheinlich am meisten Sinn.
Dieses Rendertemplate bindest Du in alle Seitenvorlagen ein (die Stelle ist relativ egal):
$CMS_RENDER(template:"save_url_map")$
Bis hierher hast Du also nach der Generierung eine Map mit den absoluten Pfaden als Key und einigen Infos als "Sub-Map". Diese Map "lebt" als Property im ScheduleContext.
Die Frage ist: Wie kommt man da jetzt sinnvoll ran? 😉
Man könnte hier jetzt einen Script-Task bauen, der das irgendwohin schreibt, am einfachsten ist das aber über ein spezielles Seitentemplate:
3. Seitentemplate zum Erzeugen der Map
Erstelle ein neues Seitentemplate, z.B. "url_map" mit der Dateiendung ".json" und folgender Ausgabe:
$CMS_IF(!#global.preview && #global.scheduleContext.getProperty("gv_urlMap")!=null)$
$CMS_VALUE(#global.scheduleContext.getProperty("gv_urlMap").toJSON())$
$CMS_END_IF$
Erstelle dazu - am besten jeweils "außerhalb" der Website-Ordner - eine Inhaltsseite basierend auf diesem Template und eine Seitenreferenz und gib beides frei.
4. Map im Auftrag erzeugen
Füge dem Generierungsauftrag einen weiteren Generierungstask NACH allen anderen hinzu:
Typ: Teilgenerierung, einziger Startknoten ist die in (4.) angelegt Seitenreferenz.
Wichtig: Nur in EINER Sprache (egal welche) und nur für EINEN (egal welcher) Ausgabekanal erzeugen. Zum Generierungszeitpunkt liegen ja schon alle Infos in der Map.
5. Generieren
Nach dem Generieren (im Auftrag) hast Du dann eine weitere Datei im JSON-Format, die diese Map mit den ganzen Infos enthält. Wenn Du nicht willst, dass sie deployt wird, kannst Du den entsprechenden Generierungstask einfach hinter den Deployment-Task packen.
Viele Grüße
Michael