Search the FirstSpirit Knowledge Base
Hallo zusammen,
habe hier eine Linkvorlage bei der ich den referenzierten Inhalt mithilfe eines CMS_INPUT_RADIOBUTTON und Regeln definiere:
<CMS_INPUT_RADIOBUTTON name="ltLinkReferenceType" gridWidth="3" useLanguages="no">
<ENTRIES>
<ENTRY value="ext">
<LANGINFOS>
<LANGINFO lang="*" label="External"/>
</LANGINFOS>
</ENTRY>
<ENTRY value="int">
<LANGINFOS>
<LANGINFO lang="*" label="Internal"/>
</LANGINFOS>
</ENTRY>
<ENTRY value="data">
<LANGINFOS>
<LANGINFO lang="*" label="Data"/>
</LANGINFOS>
</ENTRY>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="Link Type"/>
</LANGINFOS>
</CMS_INPUT_RADIOBUTTON>
Nun gibt es allerdings die Anforderung, dass wenn der Redakteur die Option "External" auswählt, das Linkziel im neuen Fenster geöffnet wird. Das Linkziel lässt sich mithilfe eines weiteren Radiobutton Eingabefelds festlegen:
<CMS_INPUT_RADIOBUTTON name="ltTarget" useLanguages="no">
<ENTRIES>
<ENTRY value="_blank">
<LANGINFOS>
<LANGINFO lang="*" label="new window"/>
</LANGINFOS>
</ENTRY>
<ENTRY value="_self">
<LANGINFOS>
<LANGINFO lang="*" label="same window"/>
</LANGINFOS>
</ENTRY>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="Open link in..."/>
</LANGINFOS>
</CMS_INPUT_RADIOBUTTON>
Nun habe ich in der Dokumentation gelesen, dass sich mithilfe von Regeln bestimmte werde dynamisch verändern lassen. Allerdings konnte ich nicht herausfinden, ob dies auch bei Radiobuttons funktionert.
Folgende Use-Cases müssten abgedeckt werden:
- User wählt "Internal" oder "Data" aus -> "same window" wird vorausgewählt
- User wählt "External" aus -> "new window" wird vorausgewählt
Könntet ihr mir deswegen bitte sagen ob und wie dies zu bewerkstelligen ist?
Vielen Dank und viele Grüße
Max
Hallo Maximilian,
das setzen der CMS_INPUT_RADIOBUTTON Komponenten hat bei mir jetzt auf Anhieb auch nicht funktioniert.
Du könntest aber aus der ltTarget ein CMS_INPUT_TOGGLE machen, dann würde folgende Regel funktionieren:
<ON_EVENT>
<IF>
<EQUAL>
<PROPERTY source="ltLinkReferenceType" name="ENTRY"/>
<TEXT>ext</TEXT>
</EQUAL>
</IF>
<WITH>
<TRUE />
</WITH>
<DO>
<PROPERTY source="ltTarget" name="VALUE"/>
</DO>
</ON_EVENT>
Da du ja nur zwei Werte in dieser Komponente hast, sollte der Umbau auf ein CMS_INPUT_TOGGLE ja kein Problem sein.
Viele Grüße
Thorsten
Hallo Thorsten,
danke für den Ansatz, aber leider kann ich den Typ der Eingabekomponente nicht ändern, da diese bereits im Produktiv System im Einsatz ist und somit die bereits gesetzten Werte an dieser Stelle verloren gehen würden.
Habe deinen Vorschlag teilweise übernommen und probiert bei <WITH> <TEXT>_blank</TEXT>
zu übergeben, aber leider funktionierte das nicht. Auch eine Änderung von VALUE zu ENTRY half nicht. Geht das dynamische Setzen von Werten bei Radiobutton-Komponenten allgemein nicht oder habe ich hierbei die falsche Syntax verwendet?
Viele Grüße
Max
Hallo Max,
In FS 5.2 wird es eine Erweiterung der Regeln geben, mit der man Werte in optionsbasierte Komponenten einfacher setzen kann.
Aktuell (FS 5.1) sollte folgendes helfen:
Zunächst die Definition von zwei zusätzlichen versteckten Comboboxen, analog zu ltTarget:
<CMS_INPUT_RADIOBUTTON name="ltTargetBlank" hidden="yes" useLanguages="no">
<ENTRIES>
<ENTRY value="_blank">
<LANGINFOS>
<LANGINFO lang="*" label="new window"/>
</LANGINFOS>
</ENTRY>
<ENTRY value="_self">
<LANGINFOS>
<LANGINFO lang="*" label="same window"/>
</LANGINFOS>
</ENTRY>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="Blank target"/>
</LANGINFOS>
</CMS_INPUT_RADIOBUTTON>
<CMS_INPUT_RADIOBUTTON name="ltTargetSame" hidden="yes" useLanguages="no">
<ENTRIES>
<ENTRY value="_blank">
<LANGINFOS>
<LANGINFO lang="*" label="new window"/>
</LANGINFOS>
</ENTRY>
<ENTRY value="_self">
<LANGINFOS>
<LANGINFO lang="*" label="same window"/>
</LANGINFOS>
</ENTRY>
</ENTRIES>
<LANGINFOS>
<LANGINFO lang="*" label="Same window"/>
</LANGINFOS>
</CMS_INPUT_RADIOBUTTON>
Bei diesen beiden Comboboxen per Vorgabewert je eine der beiden Werte eintragen (new window bei ltTargetBlank, same window bei ltTargetSame).
Dazu zwei Regeln, die - basierend auf dem ausgewohlten Wert in ltLinkReferenceType entweder den Wert (=VALUE) der einen oder der anderen versteckten Combobox in die eigentliche Box ltTarget kopieren:
<ON_EVENT>
<IF>
<EQUAL>
<PROPERTY source="ltLinkReferenceType" name="ENTRY" />
<TEXT>ext</TEXT>
</EQUAL>
</IF>
<WITH>
<PROPERTY source="ltTargetBlank" name="VALUE" />
</WITH>
<DO>
<PROPERTY source="ltTarget" name="VALUE" />
</DO>
</ON_EVENT>
<ON_EVENT>
<IF>
<EQUAL>
<PROPERTY source="ltLinkReferenceType" name="ENTRY" />
<TEXT>int</TEXT>
</EQUAL>
</IF>
<WITH>
<PROPERTY source="ltTargetSame" name="VALUE" />
</WITH>
<DO>
<PROPERTY source="ltTarget" name="VALUE" />
</DO>
</ON_EVENT>
Einen kleinen Haken gibt es dann allerdings dann noch: Man kann nicht gezielt steuern, dass das Schreiben wirklich nur dann passiert wenn der Benutzer den Wert von ltLinkReferenceType ändert. Das kann dazu führen, dass wenn der Benutzer sich doch entscheidet der Vorgabe eben NICHT zu folgen, sein manuell gesetzter Wert wieder überschrieben wird wenn die Regel neu ausgewertet wird (z.B. beim Wechsel des Sprachreiters oder einem Sperren des Elementes).
Hier hilft dann ein zusätzliches Toggle "Ziel automatisch bestimmen", das man in den IFs abfragen kann (und mit dem man außerdem dann gleich das ltTarget nicht editierbar schalten sollte):
<CMS_INPUT_TOGGLE name="ltAutoTarget" type="radio" singleLine="no">
<LANGINFOS>
<LANGINFO lang="*" label="Auto target"/>
</LANGINFOS>
<OFF>
<LANGINFO lang="*" label="no"/>
</OFF>
<ON>
<LANGINFO lang="*" label="yes"/>
</ON>
</CMS_INPUT_TOGGLE>
...
<ON_EVENT>
<IF>
<AND>
<EQUAL>
<PROPERTY source="ltAutoTarget" name="VALUE" />
<TRUE/>
</EQUAL>
<EQUAL>
<PROPERTY source="ltLinkReferenceType" name="ENTRY" />
<TEXT>ext</TEXT>
</EQUAL>
</AND>
</IF>
<WITH>
<PROPERTY source="ltTargetBlank" name="VALUE" />
</WITH>
<DO>
<PROPERTY source="ltTarget" name="VALUE" />
</DO>
</ON_EVENT>
<ON_EVENT>
<IF>
<AND>
<EQUAL>
<PROPERTY source="ltAutoTarget" name="VALUE" />
<TRUE/>
</EQUAL>
<EQUAL>
<PROPERTY source="ltLinkReferenceType" name="ENTRY" />
<TEXT>int</TEXT>
</EQUAL>
</AND>
</IF>
<WITH>
<PROPERTY source="ltTargetSame" name="VALUE" />
</WITH>
<DO>
<PROPERTY source="ltTarget" name="VALUE" />
</DO>
</ON_EVENT>
<ON_EVENT>
<WITH>
<NOT>
<EQUAL>
<PROPERTY source="ltAutoTarget" name="VALUE" />
<TRUE/>
</EQUAL>
</NOT>
</WITH>
<DO>
<PROPERTY source="ltTarget" name="EDITABLE" />
</DO>
</ON_EVENT>
Hinweis: Der Vergleich mit TRUE ist hier bewusst gewählt - denn ein Toggle kann auch null liefern 😉
Viele Grüße
Michael
Hallo Michael,
vielen Dank für die ausführliche Lösung und Erklärung. Dieser Workaround würde die Usability des Formulars nur teilweise verbessern und der zusätzliche Toggle könnte den Redakteur verwirren. Deswegen warte ich bis 5.2 auf die Verbesserung der Regeln und greife dann das Thema nochmal auf.
Viele Grüße
Max