- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
URLs von Links via Skript modifizieren
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:
- Fรผr jedes Absatz-Template via getIncomingReferences() die "Instanzen" davon im PageStore holen.
- Fรผr jeden Absatz entweder das DOM-Editor-Feld (z.B. getData().get("st_myDom")) oder das Contentarealist-Feld auslesen.
- Den enthaltenen Textwert entsprechend parsen (d.h. suchen nach den Links die geรคndert werden sollen) und die entsprechenden Ersetzungen einfรผgen.
- Die รnderungen setzen + speichern (vorher natรผrlich die umgebende Page sperren)
- 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?
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok, werde ich dann so durchfรผhren. Danke fรผr die Tipps.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo zusammen,
je nach Anwendungsfall kรถnnte man auch noch รผber Project#getExternalReferences()
gehen.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo,
danke fรผr Hilfe. Hab ich jetzt auch so umgesetzt und es hat geklappt.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.

