Search the FirstSpirit Knowledge Base
Hallo Community,
für gewöhnlich schreibe ich nur "normale" Templates, sehe aber für die bestehende Anforderung keine Möglichkeit die Aufgabe ohne Scripting zu lösen...
Aufgabe ist wie folgt:
_____________________________________________________________________________________________________
Aus einem bestimmten Bestand an Bildern sollen Keyvisuals wöchtenlich ausgetauscht werden. Diese Keyvisuals müssen alle einmal verwendet werden, bevor sich eines wiederholen darf. Eine bestimmte Reihenfolge ist irrelevant.
Ich dachte dabei die Bilder in eine Datenquelle zu legen und mit Flags zu arbeiten.
D.h. ich mache ein ContentSelect auf die Datenquelle, nehme mir das erste Element aus der Liste, markiere dieses als "current" und lese bei der Verwendung des KV das Bild mit dem Flag "current" aus.
Beim nächsten Durchlauf wird bei dem Bild mit dem Flag "current" das Flag "current" entfernt und ein Flag "used" gesetzt und ein neues Bild ausgewählt und entsprechend markiert.
Ein Kollege meinte, ich solle mir vom Redakteur die Reihenfolge definieren lassen und damit arbeiten. Dies hätte den Vorteil, dass ich die DQ nicht manipulieren muss, in meinen Augen jedoch den Nachteil, das ich mir den "aktuellen Status" irgendwie merken muss... Da mir kein "einfacher Weg" einfällt, wie ich mir das merken kann, fällt die Option für mich ganz aus...
Mir fällt gerade ein, ich muss sicherlich noch darauf achten, dass die geänderten Datensätze freigegeben werden...
_____________________________________________________________________________________________________
So, jetzt mein Anliegen:
Freue mich auf hilfreiche Antworten.
Viele Grüße
Dann müsste es möglich sein, den Weg aus dem Ursprungspost zu gehen die Flags in der Datenquelle zu speichern. Die anderen Aufträge holen sich dann einfach den Datensatz auf dem das "current" Flag gesetzt ist.
So als kleines Beispiel, habe ich mal ein paar Schnipsel an Scriptcode zusammengestellt:
Das Holen aller Entities:
private Project p = context.getProject();// get the master language
Language lang = p.getMasterLanguage();
// get the stores
ContentStoreRoot cs = (ContentStoreRoot) p.getUserService().getStore(Store.Type.CONTENTSTORE, false);
// get pressReleases contentStore element
Content2 contentStore = (Content2) cs.getStoreElement("<tabellenname>", IDProvider.UidType.CONTENTSTORE);
// get database schema and session
Schema schema = contentStore.getSchema();
Session session = schema.getSession();
// get entity from datasource
Select select = session.createSelect(contentStore.getEntityType().getName());
EntityList entityList = session.executeQuery(select);
Durch diese Liste kann dann iteriert werden und geprüft werden ob auf dem jeweiligen Entity aktuell das "current" Flag gesetzt ist. Wenn ja, dann einfach auf "used" setzen. Das erste Entity mit dem "unused" Flag kann man dann z.B. auf current setzen.
Daten setzen und holen geht ungefähr so:
try {
contentStore.lock(entity);
Dataset dataSet = contentStore.getDataset(entity);
FormData data = dataSet.getFormData();
// add text to headline into database
FormField formField = data.get(lang, "cs_flag");
//pruefen ob Bild aktuell verwendet wird
if(formField.get().equals("current")) {
//dann den Status ändern
formField.set("used");
// Speichern und Freigeben
dataSet.setFormData(data);
dataSet.save();
contentStore.release(entity);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
contentStore.unlock(entity);
}
Ich hoffe das reicht erstmal als erster "Schubser" für eine grobe Richtung.
Viele Grüße
Rouven
EDIT: "csPressreleases" durch "contentStore" ersetzt
Ich schubse ja eigentlich sonst niemanden...
Man kann Werte über die verschiedenen Ausführungen eines Auftrages hinweg retten:
$CMS_SET(_void, #global.scheduleContext.setVariable("index_keyvisual", index))$
Reicht das als Hinweis? Die Lösung würde damit sogar ohne "Scripting" auskommen
Hallo,
Ich freue mich auf weitere "sachdienliche Hinweise"
Wenn ich die Variable in den ScheduleContext schreibe, habe ich diese doch nur in meinem Auftrag zur Verfügung.
Hast du dir die API-Doc der Methode durchgelesen? Da steht etwas anderes..
Und ich schrieb doch auch: "Man kann Werte über die verschiedenen Ausführungen eines Auftrages hinweg retten".
Also, ich hab in die Doc geguckt.
A context with access to schedule entry execution-related objects.
Klingt für mich jetzt eher so, als würde die Variable zwar durchaus über die Ausführung EINES Auftrages hinaus retten, aber immer noch nicht, dass sie im Kontext eines anderen Auftrages ebenfalls zur Verfügung steht. Daher habe ich mir die Beschreibung der Methode gar nicht erst weiter angeguckt.
Und selbst bei näherer Betrachtung der Methode würde ich nicht wagen anzunehmen, das mir das weiterhilft.
Sets a variable to this context. This variable will be hold persistent beyond the schedule execution.
Use
ScheduleContext.setProperty(String, Object)
to set a property only for the time of the schedule execution.
Da steht für mich ganz klar "dieser Kontext", was für mich in dem Fall eineindeutig bedeutet, dass der Kontext dieser Auftrag ist und nicht alle anderen Aufträge auch.
Daraus folgend bedeutet das für mich, das ich bei durchführung dieses Auftrags sehr wohl immer noch weiß, welcher Wert bei der letzten Durchführung gesetzt war und somit mir auch bei der nächsten Durchführung noch zur Verfügung steht.
Zusammenfassend und in kurz beschrieben, was ich benötige:
Ich brauche ein Skript, welches mir in einem festen Turnus (wöchentlich) einen Wert setzt, welcher bis zur nächsten Durchführung des Skriptes in allen anderen Aufträgen gültig ist.
Wieviele verschiedene Aufträge sind das denn?
Wir befinden uns zur Zeit noch in der Entwicklungsphase. Zur Zeit sind ca. 10 verschiedene Aufträge definiert. Ich denke, sobald das Projekt in die Fachbereiche geht, werden hier jedoch noch ein Paar hinzukommen...
Ich war von einem Auftrag ausgegangen.
Dann würde ich einfach eine Liste der "Visuals" erstellen und dann jeweils das an Index "aktuelle Kalenderwoche minus eins modulo Anzahl der Visuals" nehmen.
Pseudocode:
$CMS_VALUE(visual_list[(#global.startDate.week_of_year - 1) % visual_list.size])$
Die Liste der Visuals kann man z.B. per Content-Select aus einer Datenquelle erstellen.
[Anmerkung: "week_of_year" fängt bei 1 an zu zählen]
Ja, aber das funktioniert am besten, wenn die Anzahl der Visuals der Anzahl der KWs entspricht, oder kleiner ist. Wir haben aber jetzt schon um die 60 und es werden eher mehr.
Hinzukommt, dass eine Änderung der Liste durch Löschen von Elementen, dazu führt, dass Elemente übersprungen werden, bevor wir an das Ende der Liste kommen und die Wiederholung anfängt.
Und zum Verständnis: der Code müsste dann bei jedem Deployment ausgeführt werden, oder?!?
Mein allerletzter Vorschlag: An den Visuals wird ein Gültigkeitszeitraum definiert.