Hallo,
Es sollen also entweder alle oder keines der drei Felder gefüllt sein, richtig?
Grundsätzlich gibt es bei der o.g. Definition das Problem, dass ein vom Redakteur änderbarer Wert im IF-Teil steht, was in den meisten Fällen zu einer Art "Einbahnstraßenwirkung" führt und nicht gewollt ist - die Validierung sollte in beide Richtungen funktionieren (ungültig setzen UND wieder gültig setzen), es findet in der GUI kein "Reset" der Gültigkeit statt (das würde nur beim Speicherversuch passieren). Wenn beim IF-Block "false" herauskommt, wird der ganze Rest der Regel nicht mehr betrachtet.
Siehe hierzu auch FS5 Regeln: Regeln bei mehrsprachigen Projekten unbrauchbar?
Ob man diese Regeln in eine gießen kann, kommt darauf an, ob es reicht wenn alle Felder gemeinsam als gültig oder ungültig markiert werden sollen. Ich gehe aber mal davon aus, dass ein gefülltes Feld nie als fehlerhaft markiert werden soll, sondern alle leeren Felder, wenn mindestens eins gefüllt ist. Dann braucht man drei Regeln, da sich ja auch drei unabhängige Gültigkeitsstati ergeben können.
Zu den Regeln selber:
Manchmal ist es einfacher zu definieren, wann ein Feld UNGÜLTIG ist. Am Beispiel des Ortes:
"Der Ort ist ungültig, wenn er leer ist und mindestens eines der anderen Felder gefüllt ist".
Am einfachsten geht es mit ein bisschen Pseudocode weiter: Bedingung aufschreiben (möglilchst erstmal 1:1) und dann vereinfachen.
Bedingung gemäß Text:
ort.invalid = ort.empty && (!street.empty || !plz.empty)
Letztlich braucht man immer einen Ausdruck der Form x.valid=..., weil es eine <PROPERTY name="INVALID" /> nicht gibt. Also alles negieren:
ort.valid= !(ort.empty && (!street.empty || !plz.empty))
Sieht erstmal wild aus... Aber hier kann man gut die DeMorgan'schen Regeln anwenden [ !(A && B) = !A || !B ], zuerst die äußere Klammer:
ort.valid= !ort.empty || !(!street.empty || !plz.empty)
Und gleich nochmal für die zweite Klammer:
ort.valid = !ort.empty || (!!street.empty && !!plz.empty)
Doppelte Negation eliminieren, fertig:
ort.valid = !ort.empty || (street.empty && plz.empty)
Jetzt das Ganze in die XML-Syntax gießen:
<ON_SAVE>
<WITH>
<OR>
<AND>
<PROPERTY source="cs_strasse" name="EMPTY" />
<PROPERTY source="cs_plz" name="EMPTY" />
</AND>
<NOT>
<PROPERTY source="cs_ort" name="EMPTY" />
</NOT>
</OR>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="cs_ort" name="VALID" />
<MESSAGE lang="*" text="Der Ort muss gefüllt sein, wenn PLZ und/oder Straße angegeben werden" />
</VALIDATION>
</DO>
</ON_SAVE>
Das müsste dann natürlich einmal "RoundRobin" für alle drei Felder gemacht werden.
Viele Grüße
Michael