Questions & Answers

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

Type a product name