philippr
Returning Spectator

Projekteinstellungen aus globaler Datenquelle auslesen

Jump to solution

Hallo zusammen,

Ausgangssituation:

Auf einem Server mit vielen Projekten sollen Konfigurationsbestandteile der Projekte in eine globale Datenquelle ausgelagert werden. So können Einstellungen für viele Projekte in einer globalen Datenquelle verwaltet werden und ein Administrator muss sich bei Änderungen nicht in jedes Projekt einloggen. (Zum Beispiel der Tracking-Account könnte so pro Projekt konfiguriert werden)

Lösungsansatz:

Eine Datenquelle in einem entfernten Projekt wird angelegt. Pro Zeile wird ein Projekt beschrieben (identifikation via Projektname oder ProjektID), die Spalten der Tabelle repräsentieren die Konfigurationsparameter. Nun wird mit einem Script innerhalb des Zielprojektes auf die (entfernte) Datenquelle zugegriffen, um dort in der besagten Konfigurationstabelle einen Eintrag zu finden, der dem Projekt entspricht. Diese werden in eine Hashmap gespeichert und dann via result.setValue(HASHMAP) übergeben. In jeder Vorlage soll dann über die HashMap auf den entsprechenden Konfigurationswert zugegriffen werden können.

Script: accessglobalsettings:

// Name of project with global setting datasoruce

REMOTEPROJECT = "<Name des globalen Projektes>";

// Name of datasource

CONFIGTABLE = "projectsettings";

// Get Connection

Connection conn = context.getConnection();

thisProjectName = context.getProject().getName();

projectWithGlobalSettings = conn.getProjectByName(REMOTEPROJECT);

remoteUserService = projectWithGlobalSettings.getUserService();

contentStoreRoot = remoteUserService.getStore(Store.Type.CONTENTSTORE, true);

// Object: Datasets

globalSettingsDatasource = contentStoreRoot.getContent2ByName(CONFIGTABLE).getDatasets();

configurationNotFound = true;

//Iterate each dataset in global settings datasource

for (dataset : globalSettingsDatasource) {

  entity = dataset.getEntity();

 

  // Find a dataset which matches with this project

  if(entity.getValue("projectName").equals(thisProjectName)) {

    configurationNotFound = false;

    context.logInfo("Key:Value-List of project settings for: " + thisProjectName);

    globalSettings = new HashMap();

    // Get all key-value pairs

    for (attributeName : entity.getAttributeNames()) {

      globalSettings.put(attributeName, entity.getValue(attributeName));

      context.logInfo(attributeName + ": " + entity.getValue(attributeName));

    }

  }

}

if(configurationNotFound) {

  context.logError("Can't find global configuration for project: " + thisProjectName + " in " + REMOTEPROJECT + "[table:"+projectsettings+"]");

  result.setValue(0);

} else {

  result.setValue(globalSettings);

}

Problem:

Die Überlegung war den Zugriff auf das Script über die globalen Einstellungen vorzunehmen, damit auf entfernte Datenquelle nur einmal bei der Generierung zugegriffen wird und die HashMap dann über die globalen Einstellungen innerhalb des Projekts verfügbar ist.

Da hängt es aktuell wie erfolgt der Zugriff auf die HashMap am besten?

So wird lediglich ein String erzeugt:

$CMS_SET(projectsettings)$$CMS_RENDER(script:"accessglobalsettings")$$CMS_END_SET$

Gibt es Ideen oder ist der Ansatz über die HashMap falsch?

Mit der HashMap skaliert es sehr schön jede weitere Spalte in der Konfigurationstabelle kann direkt über ihren "attributeName" in der HashMap angesprochen werden.

Vielen Dank,

Philipp

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Philipp,

das "zweiteilige CMS_SET" definiert hier nur ein sog. Templatefragment, Du kannst nicht einfach einen beliebigen Typ "übergeben".

Allgemein kann man das schon über eine HashMap lösen. Was funktionieren müsste (ungetestet): Die vom Skript befüllte (bzw. zu befüllende) HashMap schon von außen als Parameter übergeben anstatt im Skript eine neue zu erzeugen.

$CMS_SET(projectsettings,{"":""})$

$CMS_RENDER(script:"accessglobalsettings",globalSettings:projectsettings)$

... also OHNE ein umschließendes CMS_SET.

Im Skript dann die Zeile


globalSettings = new HashMap();


weglassen und am besten am Ende mit


result.setValue("");


dafür sorgen, dass das Skript selbst keine Ausgabe erzeugt.

Bei den Variablen sollte aber mit einem Präfix gearbeitet werden: ps_projectsettings.

Viele Grüße

Michael


View solution in original post

0 Kudos
2 Replies
mbergmann
Crownpeak employee

Hallo Philipp,

das "zweiteilige CMS_SET" definiert hier nur ein sog. Templatefragment, Du kannst nicht einfach einen beliebigen Typ "übergeben".

Allgemein kann man das schon über eine HashMap lösen. Was funktionieren müsste (ungetestet): Die vom Skript befüllte (bzw. zu befüllende) HashMap schon von außen als Parameter übergeben anstatt im Skript eine neue zu erzeugen.

$CMS_SET(projectsettings,{"":""})$

$CMS_RENDER(script:"accessglobalsettings",globalSettings:projectsettings)$

... also OHNE ein umschließendes CMS_SET.

Im Skript dann die Zeile


globalSettings = new HashMap();


weglassen und am besten am Ende mit


result.setValue("");


dafür sorgen, dass das Skript selbst keine Ausgabe erzeugt.

Bei den Variablen sollte aber mit einem Präfix gearbeitet werden: ps_projectsettings.

Viele Grüße

Michael


0 Kudos

Nun getestet, funktioniert.

Besten Dank.

0 Kudos