Search the FirstSpirit Knowledge Base
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
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
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
Nun getestet, funktioniert.
Besten Dank.