Juncus
Returning Observer

Rules: Checkbox abhängig von einem Seitentemplate zeigen

Jump to solution

Hallo Community,

ich habe ein spezielles Problem bezüglich Anzeigelogik von Formularelementen und die Steuerung über die Rules.
Wir verwenden ein Absatztemplate in 2 verschiedenen Seitentemplates.

Nun soll in dem einen Seitentemplate noch eine Zusatzfunktion für die Absatzvorlage ermöglicht werden.
Diese soll über eine Checkbox eingeschaltet werden können.

Ist die selbe Absatzvorlage in dem anderen Seitentemplate eingebaut soll diese Checkbox zur Einschaltung der Zusatzfunktion gar nicht angezeigt werden.

Ist es möglich über Rules abzufragen in welchem Seitentemplate die Absatzvorlage aufgerufen wird und dementsprechend für ein bestimmtes Seitentemplate die Checkbox auf 'hidden' zu stellen?
Habt ihr da Ideen wie es gehen könnte?

0 Kudos
1 Solution

Accepted Solutions
hoebbel
Crownpeak employee

Hallo Ralf,

sorry, Du hast natürlich Recht. Das Template direkt zu übernehmen geht so nicht. der ValueService ist nur dafür gedacht, gespeicherte Daten aus einem anderen Kontext auszulesen.

Du brauchst also auch auf Seitenebene eine versteckte Eingabekomponente, die entweder (mittels preset="copy") einen entsprechenden Standardwert bekommt oder über eine Regel den Namen der Vorlage [ich würde wahrscheinlich über das preset="copy" gehen, dann spart man sich die Regelausführung.

Der Wert kann dann über den Valueservice in eine versteckte Eingabekomponente auf Absatzebene übernommen werden:

	<RULE>
		<SCHEDULE delay="0" id="Zunftlernpunkte" service="FormDataValueService">
			<PARAM name="UID">
				<PROPERTY name="PAGE_UID" source="#global"/>
			</PARAM>
			<PARAM name="UIDTYPE">
				<TEXT>PAGESTORE</TEXT>
			</PARAM>
			<PARAM name="FIELD">
				<TEXT>pt_template</TEXT>
			</PARAM>
			<PARAM name="LANGUAGE">
				<PROPERTY name="MASTER" source="#global"/>
			</PARAM>
		</SCHEDULE>
		<DO>
			<PROPERTY name="VALUE" source="st_template"/>
		</DO>
	</RULE>

Nicht die schönste aller Lösungen 😞

Hier kommt es drauf an, wie oft ihr so etwas braucht. Wenn es die Anforderung für mehrere Absatztemplates gibt, würde ich darüber nach denken, einen passenden ValueService zu schreiben, der anhand des aktuellen Absatztemplates entscheidet, was dargestellt werden soll. Der Rückgabewert müsst dann ein Boolean sein, der direkt zum Ein/Ausblenden der entsprechenden Eingabekomponenten genutzt werden kann.

Ist es voraussichtlich nur dieser eine Anwendungsfall, würde ich es bei den zwei (oder drei) Regeln lassen - auch wenn die nicht so schönlesbar sind 😉

Viele Grüße
Holger

View solution in original post

0 Kudos
4 Replies
hoebbel
Crownpeak employee

Hallo Juncus,

erst einmal zwei Links in die Doku:

Um den Kontext des Seitentemplates zu bekommen, nimmst Du den FormDataValueService;

https://docs.e-spirit.com/odfs/vorlagenentwick/regeln/anbindung-exter/informationen/index.html

Um dort das Template zu ermitteln:

https://docs.e-spirit.com/odfs/vorlagenentwick/regeln/formulareigensc/eigenschaft-tem/index.html

An der Stelle musst Du dann einen kleinen Umweg gehen. Das Ergebnis schreibst Du in eine versteckte Text-Eingabekomponente im Absatztemplate. Mit einer weiteren Regel prüfst Du denn den Inhalt dieser Text-Eingabekomponente und zeigst die Checkbox an, wenn diese dargestellt werden soll.

Anmerkung: der FormDataValueService steht automatisch in allen FirstSpirit Versionen zur Verfügung, sofern diese nicht sehr alt sind. Wenn es den bei Euch nicht gibt, hilft ein Update 🙂

Die Alternative zu diesem Vorgehen wäre es, einen eigenen ValueService zu schreiben. Der kann dann natürlich direkt prüfen, ob die Eingabekomponente angezeigt werden soll oder nicht und einen entsprechenden Boolean zurück liefern. Dann spart man sich den Umweg über die Texteingabekomponente, in der man die UID des Templates zwischenspeichert 😉

Viele Grüße
Holger

0 Kudos
Juncus
Returning Observer

Hallo Holger;

danke schon mal für deine Lösung.

Ganz verstehe ich sie aber leider noch nicht.

Ich habe über den FormDataValueService die Möglichkeit über die UID des Seitentemplates für die die Checkbox eingeblendet werden soll Formulardaten abzurufen.

Ziel wäre es also über den FormDataValueService auf das spezielle Seitentemplate zu prüfen und wenn eine Seite von diesem Seitentemplatetyp ist und eine entsprechende Absatzvorlage enthält ein verstecktes Formularfeld in dieser Absatzvorlage mit dem Namen des Seitentemplates zu füllen.
Anschließend wird per Rule geprüft, ob das hidden Feld leer ist oder den Namen enthält und abhängig davon die Checkbox eingeblendet. Soweit richtig?
Mir ist allerdings noch nicht ganz klar wie ich FormDataValueService mit der Templateermittlung verknüpfe.
In der Doku wird immer ein Param ‚Field‘ abgefragt

<PARAM name="FIELD">
<TEXT>gs_maxTextSize</TEXT>
</PARAM>


Muss ich also in den Seitentemplates auch ein verstecktes Textfeld hinterlegen in das ich dann den Templatenamen schreibe und auf dieses Feld dann abfragen?
Oder kann ich die Abfrage
<RULE when="ONLOCK">
<WITH><PROPERTY name="TEMPLATE" source="#global"/>
</WITH>
<DO>
<PROPERTY name="VALUE" source="Template/>
</DO>
</RULE>

irgendwie mit der anderen Abfrage verknüpfen?

<RULE>
<SCHEDULE delay="0" id="A" service="FormDataValueService">
<PARAM name="UID">
<PROPERTY name=„Template_UID" source="#global"/>
</PARAM>
<PARAM name="UIDTYPE">
<TEXT TEMPLATESTORE</TEXT>
</PARAM>
<PARAM name="FIELD"> ????? </PARAM>
</SCHEDULE>
<DO><PROPERTY name="VALUE" source="st_templateSite“/> </DO>

</RULE>

Viele Grüße v.
Ralf

0 Kudos
hoebbel
Crownpeak employee

Hallo Ralf,

sorry, Du hast natürlich Recht. Das Template direkt zu übernehmen geht so nicht. der ValueService ist nur dafür gedacht, gespeicherte Daten aus einem anderen Kontext auszulesen.

Du brauchst also auch auf Seitenebene eine versteckte Eingabekomponente, die entweder (mittels preset="copy") einen entsprechenden Standardwert bekommt oder über eine Regel den Namen der Vorlage [ich würde wahrscheinlich über das preset="copy" gehen, dann spart man sich die Regelausführung.

Der Wert kann dann über den Valueservice in eine versteckte Eingabekomponente auf Absatzebene übernommen werden:

	<RULE>
		<SCHEDULE delay="0" id="Zunftlernpunkte" service="FormDataValueService">
			<PARAM name="UID">
				<PROPERTY name="PAGE_UID" source="#global"/>
			</PARAM>
			<PARAM name="UIDTYPE">
				<TEXT>PAGESTORE</TEXT>
			</PARAM>
			<PARAM name="FIELD">
				<TEXT>pt_template</TEXT>
			</PARAM>
			<PARAM name="LANGUAGE">
				<PROPERTY name="MASTER" source="#global"/>
			</PARAM>
		</SCHEDULE>
		<DO>
			<PROPERTY name="VALUE" source="st_template"/>
		</DO>
	</RULE>

Nicht die schönste aller Lösungen 😞

Hier kommt es drauf an, wie oft ihr so etwas braucht. Wenn es die Anforderung für mehrere Absatztemplates gibt, würde ich darüber nach denken, einen passenden ValueService zu schreiben, der anhand des aktuellen Absatztemplates entscheidet, was dargestellt werden soll. Der Rückgabewert müsst dann ein Boolean sein, der direkt zum Ein/Ausblenden der entsprechenden Eingabekomponenten genutzt werden kann.

Ist es voraussichtlich nur dieser eine Anwendungsfall, würde ich es bei den zwei (oder drei) Regeln lassen - auch wenn die nicht so schönlesbar sind 😉

Viele Grüße
Holger

0 Kudos
Juncus
Returning Observer

Hallo Holger,

vielen Dank für deine Tips.
Du hast mir sehr geholfen.

Viele Grüße v.
Ralf

0 Kudos