matthiasforberg
Occasional Collector

Rule mit VISIBLE im WITH

Jump to solution

Hallo zusammen,

ich habe eine Regel, die folgendermaßen aussieht:

<RULE>

    <WITH>

        <NOT>

            <AND>

               <PROPERTY name="VISIBLE" source="st_videoUrl"/>

                <PROPERTY name="TRANSLATED" source="#global"/>

                <PROPERTY name="EMPTY" source="st_videoUrl"/>

            </AND>

        </NOT>

    </WITH>

    <DO>

        <VALIDATION scope="SAVE">

            <PROPERTY name="VALID" source="st_videoUrl"/>

            <MESSAGE lang="*" text="Please enter a video url!"/>

            <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/>

        </VALIDATION>

    </DO>

</RULE>

Mithilfe einer anderen Regel kann st_videoUrl durch einen TOGGLE eingeblendet werden und soll dann zum Pflichtfeld werden. Laut Doku ist die PROPERTY name="VISIBLE" auch innerhalb der Wertermittlung WITH erlaubt.

Jedoch fliegen bei jedem Aufruf Unmengen von Warnungen dieser Art (ca. 30 Stück pro Klick):

WARN  25.06.2018 13:31:18.599 (de.espirit.firstspirit.forms.rules.Rule): 'VISIBLE' is no valid fact in this context ('st_videoUrl')!

Was mache ich falsch und wie bekomme ich die Fehler weg?

Grüße
Matthias

0 Kudos
1 Solution

Accepted Solutions
matthiasforberg
Occasional Collector

Hallo nochmal,

da mir niemand erklären konnte, warum die o.g. Konstruktion Fehler wirft, obwohl das m.E. so in der Doku steht, habe ich jetzt doch alles umgebaut. Ich stelle hier nochmal die ursprüngliche Version der endgültigen gegenüber, mit der nach langer Rumprobiererei endlich keine Fehler mehr auf der Console ausgegeben werden.

Ursprünglich:

  1. <RULE> 
  2.     <WITH> 
  3.         <NOT> 
  4.             <AND> 
  5.                 <PROPERTY name="VISIBLE" source="st_videoUrl"/> 
  6.                 <PROPERTY name="TRANSLATED" source="#global"/> 
  7.                 <PROPERTY name="EMPTY" source="st_videoUrl"/> 
  8.             </AND> 
  9.         </NOT> 
  10.     </WITH> 
  11.     <DO> 
  12.         <VALIDATION scope="SAVE"> 
  13.             <PROPERTY name="VALID" source="st_videoUrl"/> 
  14.             <MESSAGE lang="*" text="Please enter a video url!"/> 
  15.             <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/> 
  16.         </VALIDATION> 
  17.     </DO> 
  18. </RULE> 

Da die Eigenschaft VISIBLE aber im WITH zu den Fehlern geführt hat (die Regel wurde korrekt ausgeführt, hat aber ständig Fehler geschmissen), habe ich dort den TOGGLE Schalter st_mediaType abgefragt, nämlich über <PROPERTY name="VALUE" source="st_mediaType"/>. Da dies wiederum zwar eine Boolean Abfrage ist, aber offenbar im ausgeschalteten Zustand auch null annehmen kann, musste ich noch eine zusätzliche Vorbedingung einbauen, ob das Feld überhaupt einen Wert enhält. Den Übersetzungsstatus der Seite habe ich auch in die Vorbedingung verlagert, da es im WITH auch zu Fehlermeldungen kam. So sieht es jetzt aus:

<RULE>

    <IF>

        <AND>

            <PROPERTY name="TRANSLATED" source="#global"/>

            <NOT>

                <PROPERTY name="EMPTY" source="st_mediaType"/>

            </NOT>

        </AND>

    </IF>

    <WITH>

        <NOT>

            <AND>

                <NOT>

                    <PROPERTY name="VALUE" source="st_mediaType"/>

                </NOT>

                <PROPERTY name="EMPTY" source="st_videoURL"/>

            </AND>

        </NOT>

    </WITH>

    <DO>

        <VALIDATION scope="SAVE">

            <PROPERTY name="VALID" source="st_videoURL"/>

            <MESSAGE lang="*" text="Please enter a video url!"/>

            <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/>

        </VALIDATION>

    </DO>

</RULE>

Diese Konstruktion sieht zwar unübersichtlicher aus, schreibt mir aber (bislang) nicht das ganze Serverlog voll.

Grüße
Matthias

View solution in original post

0 Kudos
7 Replies
groth
Crownpeak employee

Hallo Matthias,

hast du mal versucht die Bedingung bzgl der Sichtbarkeit des Feldes in den IF-Block auszulagern, so dass deine Validierungs-Regel nur ausgeführt wird, wenn das Feld auch sichtbar ist, anstatt sie immer auszuführen und die Sichtbarkeit als Teil der Validierungs-Kriterien zu definieren?

In etwa so:

  1. <RULE> 
  2.     <IF>
  3.         <PROPERTY name="VISIBLE" source="st_videoUrl"/> 
  4.     </IF>
  5.     <WITH> 
  6.         <NOT> 
  7.             <AND> 
  8.                 <PROPERTY name="TRANSLATED" source="#global"/> 
  9.                 <PROPERTY name="EMPTY" source="st_videoUrl"/> 
  10.             </AND> 
  11.         </NOT> 
  12.     </WITH> 
  13.     <DO> 
  14.         <VALIDATION scope="SAVE"> 
  15.             <PROPERTY name="VALID" source="st_videoUrl"/> 
  16.             <MESSAGE lang="*" text="Please enter a video url!"/> 
  17.             <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/> 
  18.         </VALIDATION> 
  19.     </DO> 
  20. </RULE> 

Anschließend gibt es aber scheinbar eine andere kleine Unschönheit:

  • Das Feld ist initial nicht sichtbar
  • Der Toggle wird geklickt, das Feld wird sichtbar und validiert. Die Fehlermeldung wird angezeigt
  • Der Toggle wird erneut geklickt und das Feld wird nicht mehr angezeigt
    • Da nun aber die Validierungs Regel nicht erneut ausgeführt wird, bleiben der rote Balken und die Fehlermeldung bei mir erhalten

Dem kann man mit einer zweiten Regel entgegenwirken, die die Validierung zurücksetzt sobald das Feld nicht sichtbar ist:

  1. <RULE> 
  2.     <IF>
  3.         <NOT>
  4.             <PROPERTY name="VISIBLE" source="st_videoUrl"/> 
  5.         </NOT>
  6.     </IF>
  7.     <WITH> 
  8.         <TRUE /
  9.     </WITH> 
  10.     <DO> 
  11.         <VALIDATION scope="SAVE"> 
  12.             <PROPERTY name="VALID" source="st_videoUrl"/> 
  13.             <MESSAGE lang="*" text="Please enter a video url!"/> 
  14.             <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/> 
  15.         </VALIDATION> 
  16.     </DO> 
  17. </RULE> 

Das sollte dein Problem hoffentlich lösen, ansonsten sag nochmal Bescheid.

Beste Grüße

  Christian

0 Kudos
Huntress
Occasional Observer

Hallo Matthias,

ich hatte einen ähnlichen Fall und habe anstatt der Sichtbarkeit den Status des Toggles abgefragt.

Vielleicht Hilft dir mein Beispiel ja.

So in etwa:

<RULE>

        <WITH>

            <NOT>

                <AND>

                    <PROPERTY name="EMPTY" source="st_videoUrl"/>

                            <PROPERTY name="TRANSLATED" source="#global"/> 

                         <EQUAL>

                             <PROPERTY name="VALUE" source="st_toggle"/>

                             <FALSE/>

                         </EQUAL>

                </AND>

            </NOT>

        </WITH>

        <DO>

            <VALIDATION scope="SAVE">

                 <PROPERTY name="VALID" source="st_videoUrl"/> 

                 <MESSAGE lang="*" text="Please enter a video url!"/> 

                 <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/>

            </VALIDATION>

        </DO>

    </RULE>

0 Kudos
groth
Crownpeak employee

Hallo Matthias,

benötigst Du noch weitere Hilfe oder haben Dir die beiden bisherigen Antworten bereits geholfen? In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung

gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Beste Grüße

Christian

0 Kudos

Hallo,

vielen Dank für die Antworten! Sie helfen natürlich, die Fehlermeldungen zu beseitigen, aber so ganz beantwortet ist meine Frage nicht.

Vielleicht kam es in meinem ersten Eintrag nicht so rüber, aber ich wollte eigentlich nicht wissen, wie ich es ANDERS machen kann, sondern, WARUM bei diesem Konstrukt diese Fehler fliegen, obwohl es laut Dokumentation erlaubt ist, VISIBLE innerhalb vom WITH zu verwenden?!

Online Dokumentation FirstSpirit - <PROPERTY/> Eigenschaften für Formular-Elemente definieren

Gibt es eine Bedingung dafür, die ich nicht erfüllt habe oder ist das möglicherweise ein Bug? Wenn ich die Sichtbarkeit eines anderen Elementes abfrage, möchte ich nicht, dass bei jedem Klick eine Exception kommt. Klar kann ich es umbauen, aber dann frage ich mich, warum es so in der Doku steht?!

Viele Grüße
Matthias

0 Kudos
matthiasforberg
Occasional Collector

Hallo nochmal,

da mir niemand erklären konnte, warum die o.g. Konstruktion Fehler wirft, obwohl das m.E. so in der Doku steht, habe ich jetzt doch alles umgebaut. Ich stelle hier nochmal die ursprüngliche Version der endgültigen gegenüber, mit der nach langer Rumprobiererei endlich keine Fehler mehr auf der Console ausgegeben werden.

Ursprünglich:

  1. <RULE> 
  2.     <WITH> 
  3.         <NOT> 
  4.             <AND> 
  5.                 <PROPERTY name="VISIBLE" source="st_videoUrl"/> 
  6.                 <PROPERTY name="TRANSLATED" source="#global"/> 
  7.                 <PROPERTY name="EMPTY" source="st_videoUrl"/> 
  8.             </AND> 
  9.         </NOT> 
  10.     </WITH> 
  11.     <DO> 
  12.         <VALIDATION scope="SAVE"> 
  13.             <PROPERTY name="VALID" source="st_videoUrl"/> 
  14.             <MESSAGE lang="*" text="Please enter a video url!"/> 
  15.             <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/> 
  16.         </VALIDATION> 
  17.     </DO> 
  18. </RULE> 

Da die Eigenschaft VISIBLE aber im WITH zu den Fehlern geführt hat (die Regel wurde korrekt ausgeführt, hat aber ständig Fehler geschmissen), habe ich dort den TOGGLE Schalter st_mediaType abgefragt, nämlich über <PROPERTY name="VALUE" source="st_mediaType"/>. Da dies wiederum zwar eine Boolean Abfrage ist, aber offenbar im ausgeschalteten Zustand auch null annehmen kann, musste ich noch eine zusätzliche Vorbedingung einbauen, ob das Feld überhaupt einen Wert enhält. Den Übersetzungsstatus der Seite habe ich auch in die Vorbedingung verlagert, da es im WITH auch zu Fehlermeldungen kam. So sieht es jetzt aus:

<RULE>

    <IF>

        <AND>

            <PROPERTY name="TRANSLATED" source="#global"/>

            <NOT>

                <PROPERTY name="EMPTY" source="st_mediaType"/>

            </NOT>

        </AND>

    </IF>

    <WITH>

        <NOT>

            <AND>

                <NOT>

                    <PROPERTY name="VALUE" source="st_mediaType"/>

                </NOT>

                <PROPERTY name="EMPTY" source="st_videoURL"/>

            </AND>

        </NOT>

    </WITH>

    <DO>

        <VALIDATION scope="SAVE">

            <PROPERTY name="VALID" source="st_videoURL"/>

            <MESSAGE lang="*" text="Please enter a video url!"/>

            <MESSAGE lang="DE" text="Bitte geben Sie eine URL zum Video an!"/>

        </VALIDATION>

    </DO>

</RULE>

Diese Konstruktion sieht zwar unübersichtlicher aus, schreibt mir aber (bislang) nicht das ganze Serverlog voll.

Grüße
Matthias

0 Kudos

Hallo Matthias,

du schreibst folgendes zum Toggle: aber offenbar im ausgeschalteten Zustand auch null annehmen kann

Das ist, meines Wissens nach, nur halb richtig. Wenn im Toogle NOCH NIE ein Wert eingestellt wurde, das Element also initial deselektiert ist, ist der Wert null. Sobald es einmal selektiert wurde, klappen die "normalen" Boolean-Abfragen. Dann bringt auch ein erneutes deselektieren ein false als Ergebnis.

Das ist der Grund, warum ich ein Toggle in den Voreinstellungen an und wieder ausschalte und das abspeichere, sollte ich den delektierten Wert als default bevorzugen.

Das ist eine alte Java-Krankheit bei Toggles. Immer wieder voller Spaß!

0 Kudos

btw: seit fast einem Jahr hab ich dazu ein Ticket bei der e-Spirit auf "in development": https://help.e-spirit.com/servicedesk/customer/portal/6/HELP-48527

das wird bestimmt richtig gut ^^

0 Kudos