JonasE
I'm new here

Condition in Schedule aktualisiert nicht

Guten Tag,

für die Validierung eines Feldes möchte ich prüfen ob dieses Feld leer ist. Wenn dem so ist, dann wird der Scope des aktuellen Projekts überprüft (wird auf ein Inter- und Intranet-System deployt). Dazu muss auf ein Modul und damit auf das SCHEDULE-tag zurückgegriffen werden. Die Regel sieht folgendermaßen aus:

<RULES>

          <RULE>

                    <SCHEDULE delay="0" id="schedule_scope28" service="IsProject">

                              <CONDITION>

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

                              </CONDITION>

                              <PARAM name="project">

                                        <TEXT>internet</TEXT>

                              </PARAM>

                    </SCHEDULE>

                    <DO>

                              <NOT>

                                        <VALIDATION scope="SAVE">

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

                                                  <MESSAGE lang="*" text="Die Description darf nicht leer sein!"/>

                                        </VALIDATION>

                              </NOT>

                    </DO>

          </RULE>

</RULES>

Die Condition prüft also vor der Ausführung erstmal, ob das Feld überhaupt leer ist. "pt_description" ist eine CMS_INPUT_TEXT-Eingabekomponente.

Problem: Die Validierung schlägt immer fehl. Auch wenn ich das besagte Feld befülle.

Hinweis: Wird die Condition negiert, so ist die Validierung bei leerem Feld - erwartungsgemäß - in Ordnung. Wird das Feld dann befüllt, so schlägt die Validierung - erwartungsgemäß - fehl. Wird nach der Befüllung der Inhalt wieder gelöscht, so schlägt die Validierung immer noch fehl...

Die momentan funktionierende Lösung arbeitet mit zwei Regeln. Eine Regel, die anhand des Schedules ein verstecktes Feld setzt. Dieses wird dann in einer zweiten Regel abgefragt und bei vorhandenem Inhalt wird "pt_description" auf EMPTY überprüft. Eine recht unschöne Lösung.

Frage: Übersehe ich Implikationen im Code, die genau dieses Verhalten verursachen? Gibt es eine "1-Regel-Lösung" mit Schedule?

0 Kudos
6 Replies
pavone
I'm new here

Hallo Jonas,

Die Validierung schlägt immer fehl. Auch wenn ich das besagte Feld befülle.

Ich denke das lässt sich ganz einfach erklären. Wenn die Description leer ist, ist die Condition wahr, der Service wird ausgeführt und die Validierung schlägt fehl. Wenn dann die Beschreibung gefüllt wird, ist die Condition für die Regel nicht mehr erfüllt und der Service wird nicht erneut ausgeführt. Die Validierung wird also nicht aktualisiert. Mein Vorschlag wäre die Condition komplett zu entfernen und als zusätzlichen Parameter dem Service zu übergeben.

Bevor etwas dazu sagen kann, ob sich die Lösung mit zwei Regeln optimieren lässt, muss ich nochmal nachhaken, ob ich das richtig verstanden habe :smileygrin: Also die erste Regel ruft einen Schedule auf. Das ist nicht der oben erwähnte Schedule IsProject, richtig? Dieser Schedule setzt dann den Wert für ein verstecktes Feld. Falls dieses gefüllt ist, wird die obige Regel ausgeführt?

Viele Grüße

Tim

Hallo Tim,

das hilft schon mal sehr für das Verständnis. Ich war davon ausgegangen, dass die Validierung immer angestoßen wird. Also auch dann, wenn die Condition fehlschlägt (und der Service dementsprechend nicht ausgeführt wird). Ein Weg, das ganze zu Lösen wäre eine erweiterte Fallabfrage. Es kann ruhig immer abgefragt werden, ob das Projekt im richtigen Scope liegt. Wenn das der Fall ist UND es leer ist (also eine Mischung aus dem Return-Wert des Services und einer normalen With-Abfrage) soll die Validierung fehlschlagen. Alles andere zeigt das Feld grün. Aber das (Mischung Schedule und With) ist momentan nicht möglich, oder?

Die aktuell verwendete Lösung arbeitet in etwa so: In einer ersten Regel wird der Service aufgerufen. Wenn der Scope richtig ist, wird ein verstecktes Feld befüllt. In einer zweiten Regel wird dann auf Inhalt in dem versteckten Feld geprüft und zusätzlich auf den Inhalt im eigentlichen Feld (pt_description) geprüft.

Die Lösung funktioniert, aber erscheint fehleranfällig, da dieses versteckte Feld ja danach gefüllt bleibt. Eine Lösung ohne verstecktes Feld wäre also nach wie vor die Wunschoption.

Viele Grüße

Jonas

0 Kudos

Ich habe jetzt, orientiert an der Hilfe, dass man Regeln ja auch "doppelt" festlegen kann, folgende Lösung:

<RULES>

          <RULE>

                    <SCHEDULE delay="0" id="schedule_scope28" service="IsProject">

                              <CONDITION>

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

                              </CONDITION>

                              <PARAM name="project">

                                        <TEXT>internet</TEXT>

                              </PARAM>

                    </SCHEDULE>

                    <DO>

                              <NOT>

                                        <VALIDATION scope="SAVE">

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

                                                  <MESSAGE lang="*" text="Die Description darf nicht leer sein!"/>

                                        </VALIDATION>

                              </NOT>

                    </DO>

          </RULE>

          <RULE>

                    <WITH>

                              <NOT>

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

                              </NOT>

                    </WITH>

                    <DO>

                              <VALIDATION scope="SAVE">

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

                                        <MESSAGE lang="*" text="Die Description darf nicht leer sein!"/>

                              </VALIDATION>

                    </DO>

          </RULE>

</RULES>

Wenn die Condition greift (das Feld ist leer), dann wird auf den Scope geschaut und die Validierung schlägt beim richtigen Scope fehl. Das Gegenstück kommt ohne Schedule aus und sagt einfach aus, dass ein nicht leeres Feld immer OK ist. Auf diese Weise brauche ich zwar auch zwei Regeln, aber brauche das versteckte Feld nicht. Die Frage kann als beantwortet markiert werden, danke an Tim!

Viele Grüße

Jonas

0 Kudos

Hallo nochmal,

bei eingehenderen Prüfungen ist mir aufgefallen, dass die Regel in dieser Form doch nicht ganz tut, was sie soll. Die beiden möglichen Scopes sind "internet" und "intranet". Wenn ich in den zweiten Scope wechsel, dann sollte dieser Schedule nie ausgeführt werden. Allerdings scheint er trotzdem zu laufen, wenn auch mit seltsamen Ergebnissen:

1. Wenn ich das Feld pt_description nicht befülle (oder leere), dann "blinkt" das Feld unter Umständen kurz und zeigt die Fehlermeldung, aber nicht dauerhaft.

2. Wenn ich nun versuche zu speichern, dann wird mir eine Fehlermeldung ausgegeben, diese kann ich mit Befüllen des Felds abwenden. Allerdings habe ich bei leerem Feld keine dauerhafte Anzeige des Fehlers. Ebenfalls wird der Fehler nicht im SiteArchitect unten gezeigt...

Für mich sieht das nach einem Bug aus, weil ich mir nicht erklären kann, wie ein nicht ausgeführter Schedule trotzdem dazu führen kann, dass ein Feld nicht valide ist (was dann auch nicht angezeigt wird). Ist das ein bekannter Fehler, oder habe ich wieder etwas übersehen?

Viele Grüße

Jonas

0 Kudos

Hallo Jonas,

unabhängig von der Problematik: Schedule in Verbindung mit Speicher-verhindernden Regeln funktionieren nicht. Zwar wird das bei der Bearbeitung sichtbar, beim Speichervorgang werden jedoch keine Schedule-Services angesprochen, da diese dort nicht erreichbar sind (steht auch so in der Dokumentation zu den Regeln).

Entsprechend wird beim Speichern immer ausschließlich die zweite Regel ausgeführt, d. h. das Feld darf nicht leer sein.

Beste Grüße

Stefan

Hallo Stefan,

vielen Dank für den Hinweis, das war mir bisher nicht bekannt. Um die Notwendigkeit einer Ausführung des Schedules zum Zeitpunkt des Speicherns zu umgehen, habe ich jetzt eine Lösung aus zwei Schedules und einer Regel für die Validierung. Die beiden Schedules fragen explizit den Scope des Projekts auf Internet oder Intranet ab und setzen dementsprechend ein verstecktes Feld. Dieses wird dann in der Validierungsregel zusammen mit dem Description-Feld überprüft. Auf diese Weise scheint es nun aber wirklich zu funktionieren. Smiley Wink

Viele Grüße

Jonas

0 Kudos