Search the FirstSpirit Knowledge Base
Hallo Zusammen.
Regeln zu definieren ist toll, endlich verständlicherere Fehlermeldungen. Allerdings haben sie einen großen Nachteil wie ich gerade feststellen musste. Sie gelten nämlich für alle Sprachreiter.
Beispiel:
Wenn ich bei einer Eingabekomponente allowEmpty="no" gesetzt habe konnte ich das Formular in dem Sprachreiter in dem ich bin, nur speichern wenn es gefüllt ist. In einer anderen Sprache wurde es nicht gefüllt wird aber auch ignoriert, da ich im aktuellen Sprachreiter alles ausgefült habe.
Bei den Regeln ist es nun so, dass die Regel s.u. nun in allen Sprachen greift. D.h. wenn die Redakteure in Deutschland eine neue Seite erstellen müssen sie auch zwingend den englischen und chinesischen Inhalt einfügen. Das wird natürlich nicht gehen, damit wären dann aber die schönen Regeln für uns unbrauchbar.
Ist das so beabsichtigt? Vielleicht fehlt auch noch was in der Regeldefinition wobei ich diese aus der Doku bzw. dem Midras Projekt habe?!
Viele Grüße,
Daniel
<ON_SAVE>
<WITH>
<NOT>
<PROPERTY source="pt_description" name="EMPTY"/>
</NOT>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="pt_description" name="VALID"/>
<MESSAGE lang="*" text="The META DESCRIPTION must not be empty!"/>
<MESSAGE lang="DE" text="Der META DESCRIPTION darf nicht leer sein!"/>
</VALIDATION>
</DO>
</ON_SAVE>
Hallo Daniel,
bei mir unter v5.0.106 funktioniert es so nicht - jedenfalls nicht in allen Variationen der Reihenfolge von Benutzeraktionen - genau das war ja mein Punkt 😉
Deine Regel sorgt lediglich für ein Markieren als "ungültig / nicht speicherbar" beim SETZEN des Hakens "übersetzt" bei leeren Feld. Wenn man den Haken direkt danach wieder entfernt, bleibt die rote Markierung als "ungültig" erhalten.
Durch die Vorbedingung erfolgt eine Auswertung bzw. das "Setzen" der Gültigkeit nur wenn/solange der Haken gesetzt ist. Dazu gehört aber nicht nur das "ungültig" setzten, sondern auch das (wieder) "gültig" setzen. Genau letzteres soll auch soweit ich es verstanden habe beim Entfernen des Hakens passieren. Die Vorbedingung verhindert das aber und verwirrt dadurch wahrscheinlich den Redakteur:
Immerhin ist ein und derselbe Zustand (Kein Haken bei "übersetzt" UND leeres Feld) nun angeblich ungültig, der vorher gültig war.
Ein Speichern ist allerdings trotzdem möglich, hier scheint eine separate Validierung angestoßen zu werden mit "frischen" Gültigkeitsstati.
Dennoch sollte man das ganze für den Redakteuer konsistent gestalten (wenn rot, kein Speichern) - und dazu in diesem Fall wirklich ohne Vorbedingung arbeiten.
Funktioniert denn folgende Regel nicht?
<ON_SAVE>
<WITH>
<NOT>
<AND>
<PROPERTY source="pt_title" name="EMPTY"/>
<PROPERTY source="#global" name="TRANSLATED"/>
</AND>
</NOT>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="pt_title" name="VALID"/>
<MESSAGE lang="*" text="The PAGE TITLE must not be empty!"/>
<MESSAGE lang="DE" text="Der SEITENTITEL darf nicht leer sein!"/>
</VALIDATION>
</DO>
</ON_SAVE>
Viele Grüße
Michael
> Ist das so beabsichtigt?
ja.
man koennte bspw. auch auf <ON_RELEASE/> umstellen
oder
<ON_RELEASE> wäre hierfür ungeeignet, denn ein Speichern soll wirklich nur mit gepflegtem Inhalt möglich sein.
Die zweite Option war allerdings sehr hilfreich. Ich habe meine REGEL dementsprechend um eine Verbedingung erweitert und nun funktioniert es wunderbar.
<ON_SAVE>
<IF>
<PROPERTY source="#global" name="TRANSLATED"/>
</IF>
<WITH>
<NOT>
<PROPERTY source="pt_description" name="EMPTY"/>
</NOT>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="pt_description" name="VALID"/>
<MESSAGE lang="*" text="The META DESCRIPTION must not be empty!"/>
<MESSAGE lang="DE" text="Der META DESCRIPTION darf nicht leer sein!"/>
</VALIDATION>
</DO>
</ON_SAVE>
Alternativ kann man das Inteface de.espirit.firstspirit.service.value.ValueService implementieren. Hierzu gibt es auch ein Beispiel http://www.e-spirit.com/odfs50/de/weiterfuehrende_themen/validatoren/einfuehrung.html?community am Ende der Seite.
Gibt es zu dem Modul eine Doku wie man es einsetzen kann?
Vorsicht, das funktioniert nur in eine Richtung. Die Abfrage von TRANSLATED sollte nicht in der Vorbedingung erfolgen sondern Teil der Wertermittlung sein. Sonst wird das Feld beim Setzen des Hakens zwar ungültig, beim Entfernen aber nicht wieder gültig.
Siehe auch https://community.e-spirit.com/message/11561#11561
Das ist korrekt, allerdings muss die Abfrage muss sowohl in der Vorbedingung als auch in der Werteermittlung gesetzt sein, sonst funktioniert es nicht.
Bei mir funktioniert es nur so:
<ON_SAVE>
<IF>
<PROPERTY source="#global" name="TRANSLATED"/>
</IF>
<WITH>
<AND>
<NOT>
<PROPERTY source="pt_title" name="EMPTY"/>
</NOT>
<PROPERTY source="#global" name="TRANSLATED"/>
</AND>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="pt_title" name="VALID"/>
<MESSAGE lang="*" text="The PAGE TITLE must not be empty!"/>
<MESSAGE lang="DE" text="Der SEITENTITEL darf nicht leer sein!"/>
</VALIDATION>
</DO>
</ON_SAVE>
Gruß,
Daniel
Hallo Daniel,
bei mir unter v5.0.106 funktioniert es so nicht - jedenfalls nicht in allen Variationen der Reihenfolge von Benutzeraktionen - genau das war ja mein Punkt 😉
Deine Regel sorgt lediglich für ein Markieren als "ungültig / nicht speicherbar" beim SETZEN des Hakens "übersetzt" bei leeren Feld. Wenn man den Haken direkt danach wieder entfernt, bleibt die rote Markierung als "ungültig" erhalten.
Durch die Vorbedingung erfolgt eine Auswertung bzw. das "Setzen" der Gültigkeit nur wenn/solange der Haken gesetzt ist. Dazu gehört aber nicht nur das "ungültig" setzten, sondern auch das (wieder) "gültig" setzen. Genau letzteres soll auch soweit ich es verstanden habe beim Entfernen des Hakens passieren. Die Vorbedingung verhindert das aber und verwirrt dadurch wahrscheinlich den Redakteur:
Immerhin ist ein und derselbe Zustand (Kein Haken bei "übersetzt" UND leeres Feld) nun angeblich ungültig, der vorher gültig war.
Ein Speichern ist allerdings trotzdem möglich, hier scheint eine separate Validierung angestoßen zu werden mit "frischen" Gültigkeitsstati.
Dennoch sollte man das ganze für den Redakteuer konsistent gestalten (wenn rot, kein Speichern) - und dazu in diesem Fall wirklich ohne Vorbedingung arbeiten.
Funktioniert denn folgende Regel nicht?
<ON_SAVE>
<WITH>
<NOT>
<AND>
<PROPERTY source="pt_title" name="EMPTY"/>
<PROPERTY source="#global" name="TRANSLATED"/>
</AND>
</NOT>
</WITH>
<DO>
<VALIDATION>
<PROPERTY source="pt_title" name="VALID"/>
<MESSAGE lang="*" text="The PAGE TITLE must not be empty!"/>
<MESSAGE lang="DE" text="Der SEITENTITEL darf nicht leer sein!"/>
</VALIDATION>
</DO>
</ON_SAVE>
Viele Grüße
Michael
Hallo Michael.
Perfekt, so funktioniert es.
Ich hatte die Zeile "<PROPERTY source="#global" name="TRANSLATED"/>
" nicht verneint. Daher ging es nicht.
Es dauert noch eine Weile bis ich eure Logik der "Dreifachverneinung" verinnerlicht habe. Ich Frage ja ab ob ein Feld leer ist, dann muss ich die Abfrage verneinen, die dann die Validierung anstößt wenn das Feld wirklich leer ist, das verursacht einige Knoten bei mir ...
Aber trotzdem vielen Dank für die Hilfe.
Gruß,
Daniel
Hallo Daniel,
ein Tipp zur vielleicht "knotenfreieren", allgemeinen Herangehensweise:
Wenn man das ganze nicht als Ablauflogik sondern anschaulich als Zuweisung einer "Eigenschaft VALID" versteht, finde ich es einfacher (so erkläre ich es auch in den Schulungen). Das ist dann übrigens auch konsistent mit den anderen Verwendungen der dynamischen Formulare (Sichtbarkeit, Editierbarkeit usw.) und man braucht für beides nur ein einziges Denkmodell.
Anschaulich funktioniert beides dann so: Das "Ergebnis" aus dem <WITH> wird in die Eigenschaft(en) gesteckt, die man im <DO> angibt.
Mir hilft es, vorher das Ganze auf einem Zettel als Pseudo(!)code zu formulieren. Man braucht letztlich eine Ermittlung der "Eigenschaft" VALID, hier an Deinem Beispiel mal exemplarisch
pt_title.valid = ?
Oft ist es aber einfacher, zunächst zu formulieren wann etwas UNgültig ist und das dann umzuformen:
"Das Feld ist GENAU DANN ungültig wenn es leer ist UND die Seite als übersetzt markiert ist" wird dann zu
pt_title.invalid = pt_title.empty && #global.translated
mit pt_title.invalid = ! (pt.title.valid) wird daraus
<=> ! pt_title.valid = pt_title.empty && #global.translated
<=> pt_title.valid = ! (pt_title.empty && #global.translated)
Und schon hat man das, was man nur noch in Regelsyntax gießen muss. Der linke Teil entspricht dann dem <PROPERTY source="pt_title" name="VALID"> in der Validierung, der rechte dem <WITH>-Teil.
Das Ganze funktioniert auch wunderbar wenn mehrere Komponenten im Spiel sind.
Viele Grüße
Michael