Folgendes Setup: Model mit Validatoren bei einigen Properties und ein Formular, um ein neues Objekt dieses Typs anzulegen.
Das Formular kann wie folgt definiert werden:
<f:form action="create" object="{my}" objectName="my" method="post"> <f:render partial="Form/AllErrors" arguments="{_all}" /> <label for="foo" class="">Label</label> <div class="formWrap"> <f:form.textfield property="foo" id="foo" /> </div> </f:form>
Sobald man für das Formular object und objectName definiert, kann man mit dem Attribut property in den Feldern arbeiten, dabei wird der Wert falls vorhanden automatisch ausgefüllt. Wenn nun während der Validierung Fehler auftreten, dann werden in diesem Beispiel die Fehler ALLE ausgegeben mit dem folgenden Partial:
<f:form.validationResults> <f:if condition="{validationResults.flattenedErrors}"> <div class="errors"> <f:for each="{validationResults.flattenedErrors}" as="errors" key="propertyPath"> <ul> <f:for each="{errors}" as="error"> <li>{propertyPath}: <span>{error}</span></li> </f:for> </ul> </f:for> </div> </f:if> </f:form.validationResults>
Es wäre natürlich schöner, wenn die Fehlermeldung am Feld dran stehen würde und nicht irgendwo am Anfand des Formulars. Man kann dem Tag f:form.validationResults durch das Argument for mitteilen, für welche Property man die Fehler haben möchte. Und so sieht das geänderte Formular nun so aus:
<f:form action="create" object="{my}" objectName="my" method="post"> <label for="foo">Label</label> <div class="formWrap"> <f:form.textfield property="foo" id="foo" /> <f:form.validationResults for="my.foo"> <f:render partial="Form/FormFieldError" arguments="{validationResults: validationResults}"/> </f:form.validationResults> </div> </f:form>
Das Partial dazu sieht so aus:
<f:if condition="{validationResults.errors}"> <f:for each="{validationResults.errors}" as="error"> <div class="error-note"> <small class="has-error">{error.message}</small> </div> </f:for> </f:if>
In meinem Fall sollte zusätzlich eine Klasse beim Label gesetzt werden, wenn es zu Validierungsfehlern kommt. Der validationResults ViewHelper ist aber keine Condition, man kann ihn auch nicht inline mit der Klasse „füttern“. Der validationResults ViewHelper setzt nur die Fehler für die entsprechende Property in den Template Variable Container und gibt danach die Kinder aus. Die Kinder können dann auf die entsprende Variable zugreifen, also ein bisschen wie f:alias oder f:map. Und so sieht der Formular-Code am Ende aus:
<f:form action="create" object="{my}" objectName="my" method="post"> <f:form.validationResults for="my.foo"> <label for="form-customer_id" class="{f:if(condition: validationResults.errors, then: 'has-error')}">Label</label> <div class="formWrap"> <f:form.textfield property="foo" id="foo" /> <f:render partial="Form/FormFieldError" arguments="{validationResults: validationResults}"/> </div> </f:form.validationResults> </f:form>
Neueste Kommentare