Freecastle
I'm new here

URLs von Links via Skript modifizieren

Jump to solution

Hallo,

wir haben verschiedene Absatztemplates mit CMS_INPUT_DOM-Elementen und CMS_INPUT_CONTENTAREALIST-Elementen die wiederrum CMS_INPUT_LINKLIST-Elemente enthalten.

Hier gibt es viele externe Links (basierend auf 2-3 Linktemplates) bei denen wir bei manchen nun die URLs modfizieren müssen.

Ein Ansatz hierfür wäre jetzt grob folgendes gewesen:

  1. Für jedes Absatz-Template via getIncomingReferences() die "Instanzen" davon im PageStore holen.
  2. Für jeden Absatz entweder das DOM-Editor-Feld  (z.B. getData().get("st_myDom")) oder das Contentarealist-Feld auslesen.
  3. Den enthaltenen Textwert entsprechend parsen (d.h. suchen nach den Links die geändert werden sollen) und die entsprechenden Ersetzungen einfügen.
  4. Die Änderungen setzen + speichern (vorher natürlich die umgebende Page sperren)
  5. Die umgebende Page ggfalls wieder freigeben und entsperren

Unschön ist hier natürlich, dass man bei Punkt 3 direkt die FS-Interne Grammatik modifiziert und nicht wie sonst einzelne Attribute über getData und setData modifiziert.

Gibts hierfür noch elegantere bzw. bessere Wege?

1 Solution

Accepted Solutions
boesebeck
Crownpeak employee

Hallo,

zu 1) Hier sollten man über die Referenze der jeweiligen Linkvorlage gehen um die menge der Absätze zu begrenzen.

zu 3) Den DOM und die jeweiligen Links kann man mittels API bearbeiten siehe DomNode -> DefaultDomNode bzw das Beispiel für den DOMEditorValue. Nun muss man über die DomNodes iterieren, den Typ abfragen damit nur über die LinkDomNode den jeweiligen Link bearbeitet.

View solution in original post

0 Kudos
10 Replies
jan
I'm new here

Lösung 3 funktioniert direkt auf dem Link-Objekt. Wir ersetzen an dieser Stelle z.B. die Endung .jsp durch .htm (per String-Operation). Auch, wenn das vielleicht grundsätzlich ein "Performance-Killer" ist - es funktioniert recht gut. Mit etwas Nachdenken könnte man vielleicht auch dort das Objekt ändern, um nicht auf Strings arbeiten zu müssen. Ich denke nur, das Link-Template wäre eigentlich der geeignete Ort dafür, es sei denn, man möchte die Links auch tatsächlich in der Revision geändert haben und nicht nur beim Generieren.

0 Kudos
boesebeck
Crownpeak employee

Hallo,

zu 1) Hier sollten man über die Referenze der jeweiligen Linkvorlage gehen um die menge der Absätze zu begrenzen.

zu 3) Den DOM und die jeweiligen Links kann man mittels API bearbeiten siehe DomNode -> DefaultDomNode bzw das Beispiel für den DOMEditorValue. Nun muss man über die DomNodes iterieren, den Typ abfragen damit nur über die LinkDomNode den jeweiligen Link bearbeitet.

0 Kudos

Ok, werde ich dann so durchführen. Danke für die Tipps.

0 Kudos

Hallo zusammen,

je nach Anwendungsfall könnte man auch noch über Project#getExternalReferences()


gehen.

0 Kudos

Hallo,

ich habe jetzt einmal mit dem Skript begonnen, und habe dazu jetzt doch noch ein paar Fragen:

  • Wenn ich ein Link-Objekt in der Hand habe kann ich ja mit folgendem (Pseudo-)Code darauf zugreifen:
    Link.getData().get("ref").getEditor().get(LANGUAGE);
    Die Sprachangabe spielt hier keine Rolle oder? Ein Link ist in meinem Fall z.B. in einer sprachabhängigen Absatz-Eingabekomponente eingebettet, und diese lese ich ja selbst schon sprachabhängig aus. Ich habe es bis jetzt so gemacht, dass ich einfach immer die Masterlanguage als Angabe verwende.

  • Wie "rekursiv" müssen die setter-Befehle bei Änderung an einem Link-Objekt durchgeführt werden damit die Änderungen auch tatsächlich persistiert werden? Beispiel: Ich ändere ein normales Eingabefeld an einer Seite, so habe ich prinzipiell immer folgenden folgenden (Pseudo-)Code:
    Data data = page.getData();
    .... //Do Modifications on data object
    page.setData(data);
    page.save();
    ...

    Wenn ich aber nun ein Link-Objekt in der Hand habe, so habe ich mir dieses z.B. über LinkDomNode.getLink() beschaffen (das LinkDomNode-Objekt kommt wiederrum letztlich von DomEditorValue.get(...)). Auf dem Link-Objekt selbst rufe ich dann wieder die entsprechenden getData() und setData()-Methoden auf. Muss ich nun aber ebenso danach z.B. wieder LinkDomNode.setLink(link) aufrufen und danach nochmal DomEditorValue.set(...)? Oder reicht der erste setData()-Aufruf schon.

  • Eine allgemeinere Frage: Wenn ich z.B. die Felder einer Page modifizieren will, dann hole ich über Page.getData() das Data-Objekt und führe darauf Änderungen durch, und setze es anschließend wieder über Page.setData(data) zurück. Davor muss ich die Page über setLock(....) sperren. Jetzt ist die Frage, ob ich den setLock-Befehl schon VOR dem Data data = Page.getData()-Befehl aufrufen muss, oder reicht es auch wenn ich den ERST KURZ vor dem Page.setData(data) aufrufe?
0 Kudos
Wenn ich ein Link-Objekt in der Hand habe kann ich ja mit folgendem (Pseudo-)Code darauf zugreifen:
Link.getData().get("ref").getEditor().get(LANGUAGE);
Die  Sprachangabe spielt hier keine Rolle oder? Ein Link ist in meinem Fall  z.B. in einer sprachabhängigen Absatz-Eingabekomponente eingebettet, und  diese lese ich ja selbst schon sprachabhängig aus. Ich habe es bis  jetzt so gemacht, dass ich einfach immer die Masterlanguage als Angabe  verwende.

Das ist auch richtig. Project#getMasterLanguage() ist der richtige Weg.

Wie "rekursiv" müssen die setter-Befehle bei Änderung an einem  Link-Objekt durchgeführt werden damit die Änderungen auch tatsächlich  persistiert werden? Beispiel: Ich ändere ein normales Eingabefeld an  einer Seite, so habe ich prinzipiell immer folgenden folgenden  (Pseudo-)Code:
Data data = page.getData();
.... //Do Modifications on data object
page.setData(data);
page.save();
...

Wenn ich aber nun ein Link-Objekt in der Hand habe, so habe ich mir  dieses z.B. über LinkDomNode.getLink() beschaffen (das  LinkDomNode-Objekt kommt wiederrum letztlich von  DomEditorValue.get(...)). Auf dem Link-Objekt selbst rufe ich dann  wieder die entsprechenden getData() und setData()-Methoden auf. Muss ich  nun aber ebenso danach z.B. wieder LinkDomNode.setLink(link) aufrufen  und danach nochmal DomEditorValue.set(...)? Oder reicht der erste  setData()-Aufruf schon.

Der äußere #setData() Aufruf sollte ausreichend sein.

Eine allgemeinere Frage: Wenn ich z.B. die Felder einer Page  modifizieren will, dann hole ich über Page.getData() das Data-Objekt und  führe darauf Änderungen durch, und setze es anschließend wieder über  Page.setData(data) zurück. Davor muss ich die Page über setLock(....)  sperren. Jetzt ist die Frage, ob ich den setLock-Befehl schon VOR dem  Data data = Page.getData()-Befehl aufrufen muss, oder reicht es auch  wenn ich den ERST KURZ vor dem Page.setData(data) aufrufe?

Theoretisch können Sie den #setLock() Aufruf auch später machen, allerdings laufen Sie dann Gefahr, dass konkurrierende Änderungen vorhanden sind. Wenn das der Fall ist kann es dazu kommen, dass Änderungen verloren gehen.

Bitte beachten Sie auch die Hinweise zum Setzen von Locks

Hallo,

danke für Hilfe. Hab ich jetzt auch so umgesetzt und es hat geklappt.

0 Kudos

Hi Clemens,

ich möchte etwas ähnliches durchführen.

Würdest du deinen Code evtl. öffentlich machen oder mir zukommen lassen ?

Ich könnte mir damit etwas Zeit sparen.

Ansonsten muss ich es selbst nachbauen.

Ich wäre dir sehr dankbar :-).

Viele Grüße

Jan

0 Kudos

Hallo Jan,

ist ja doch schon etwas länger her nun. Ich habe den Skript-Code mal ausgegraben und im Anhang hochgeladen.

Man kann vieles sicherlich einfacher machen, aber ich denke es könnte dir evtl. bei deiner Sache schon helfen.

Das ganze Skript ist natürlich auch stark an unsere Absatz-Templates angepasst, d.h. hier wirst du sicher viel anders machen müssen...

Ansonsten ist es so, dass man im User-Dialog das Linktemplate angeben muss, für welches alle Absätze gesucht werden, in denen dieses Linktemplate vorkommt. D.h. wenn man mehrere Linktemplates hat, muss man das Skript mehrmals ausführen.

Wenn du sonst noch Fragen hast, nur zu. Ist wie gesagt schon eine Weile her, und ich müsste es mir auch erst wieder genauer anschauen... zudem war es so, dass uns damals die readonly-Variante gereicht hat, d.h. wir haben einfach nur anhand des Skriptes geschaut, wo die gesuchten Links vorkommen.