2010-08-11 10 views
5

Ich versuche, alle Formularfehler vor dem Formular mit einem ViewScript anzuzeigen. Hier ist der Code, den ich zur Zeit versucht, in meinem Viewscript zu verwenden:Zeige Zend_Form Formularfehler in ViewScript

<div class="errors"> 
<?php echo $this->formErrors($this->element->getMessages()); ?> 
</div> 

Dieser Aufruf gibt mir eine Fehlermeldung:

Warning: htmlspecialchars() erwartet Parameter 1 sein String, array gegeben

Ich habe diesen gleichen Code andere Orte vorgeschlagen, aber es funktioniert nicht für mich. Wenn ich $ auszudrucken this-> element-> getMessages() Ich sehe nicht die Fehlermeldungen wie die folgenden:

Array ([myField] => Array ([isEmpty] => Wert ist erforderlich und kann‘ t leer sein))

Irgendwelche Ideen?

Antwort

7

Die getMessages() gibt ein Array von Formularelementnamen als Schlüssel zurück, die jeweils ein Array von Fehlern für dieses Element enthalten. Also im Grunde statt der Übergabe der Formerrors View Helfer:

Array ([isEmpty] => Value is required and can't be empty) 

Sie reichte es:

$arrMessages = $this->myForm->getMessages(); 
foreach($arrMessages as $field => $arrErrors) { 
    echo sprintf(
     '<ul><li>%s</li>%s</ul>', 
     $this->myForm->getElement($field)->getLabel(), 
     $this->formErrors($arrErrors) 

    ); 
} 
+2

ich ähnlich, etwas zu tun endete eine skalierbare Lösung kommt aber Ich mag Ihre Lösung besser. Seltsam, dass es keine Funktion gibt, um alle Formfehler zusammen zu behandeln, nur um sie für jeweils ein Feld zu behandeln. –

-1

Als Mark Punkte aus:

Array ([myField] => Array ([isEmpty] => Value is required and can't be empty)) 

Sie würden so etwas wie dies stattdessen tun wollen In seiner Antwort gibt getMessages() ein Array von Formularelementnamen als Schlüssel zurück, die jeweils ein Array von Fehlern für dieses Element enthalten. und seine Lösung ist:

$arrMessages = $this->myForm->getMessages(); 
foreach($arrMessages as $field => $arrErrors) { 
    echo sprintf(
     '<ul><li>%s</li>%s</ul>', 
     $this->myForm->getElement($field)->getLabel(), 
     $this->formErrors($arrErrors) 

    ); 
} 

Das funktioniert, solange getMessages() führt zu einer zweidimensionalen Matrix. Wenn das Formular jedoch auf relationalen Datensätzen basiert, die von Doctrine (oder einem anderen Plug-in) generiert wurden, kann die einem Feld zugeordnete Fehlermeldung auch ein Array sein, und der obige Code stürzt ab, weil er $arrErrors als Zeichenfolge behandelt, wenn sich herausstellt ein Array sein.

Um die Fehlermeldungen zu erfassen, wenn es einen zweiten Datensatz gibt, könnten wir eine foreach-Anweisung innerhalb der ersten foreach-Anweisung einfügen, die aber nicht funktioniert, wenn getMessages() zu einem zweidimensionalen Array führt; Es funktioniert auch nicht, wenn die Datensätze mehr als zwei tief sind.

In einem relationalen Daten Szenario, in dem wir nicht wissen, wie tief die Fehlermeldung aus, ist

$arrMessages = $this->myForm->getMessages(); 
print_r ($arrMessages);