rbitdd
Returning Responder

Scripting-Frage

Jump to solution

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:

  1. Ich hab keine Ahnung, ob meine geplante Vorgehensweise überhaupt geeignet ist.
  2. Ich hab keine Ahnung, wie ich ansetzen soll.
  3. Ich hab überhaupt keine Ahnung vom Scripting, würde diesen Umstand jedoch gerne ändern...
    D.h. mir wäre vermutlich lerntechnisch am meisten damit geholfen, wenn mich jemand "in die richtige Richtung schubsen würde". Ich nehme jedoch auch gerne Lösungsvorschläge entgegen, welche ich nur noch anpassen muss und vielleicht daran dann etwas lerne. Smiley Wink

Freue mich auf hilfreiche Antworten.

Viele Grüße

1 Solution

Accepted Solutions

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

View solution in original post

0 Kudos
24 Replies
Peter_Jodeleit
Crownpeak employee

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 Smiley Wink

Peter
0 Kudos

Hallo,

  1. danke für die Antwort.
  2. so richtig hilft mir das nicht weiter. Wenn ich die Variable in den ScheduleContext schreibe, habe ich diese doch nur in meinem Auftrag zur Verfügung. D.h. wenn ich mir einmal wöchentlich einen Auftrag ausführen lasse, der die Logik des Wechsels übernimmt, habe ich den aktuellen Wert doch nur in diesem Auftrag zur Verfügung stehen und nicht in dem der eigentlichen Veröffentlichung durchführt, oder?

    Wenn ich die Logik in die Veröffentlichung schreibe, erfolgt der Wechsel zu häufig, oder ich habe gar nicht erst den aktuellen Wert zur Verfügung.

Ich freue mich auf weitere "sachdienliche Hinweise" Smiley Wink

0 Kudos

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".

Peter
0 Kudos

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.

0 Kudos

Wieviele verschiedene Aufträge sind das denn?

Peter
0 Kudos

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...

0 Kudos

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]

Peter
0 Kudos

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?!?

0 Kudos

Mein allerletzter Vorschlag: An den Visuals wird ein Gültigkeitszeitraum definiert.

Peter
0 Kudos