2010-08-11 4 views
5

J'essaie d'afficher toutes les erreurs de formulaire avant le formulaire en utilisant un ViewScript. Voici le code que j'essaie actuellement d'utiliser dans mon ViewScript:Afficher les erreurs de formulaire Zend_Form dans ViewScript

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

Cet appel me donne un message d'erreur:

Attention: htmlspecialchars() attend le paramètre 1 à être une chaîne, un tableau donné

J'ai vu ce même code suggéré d'autres endroits mais ça ne fonctionne pas pour moi. Si j'imprimer $ this-> element-> getMessages() Je vois les messages d'erreur que:

Array ([myField] => Array ([isEmpty] => La valeur est nécessaire et peut » t être vide))

Des idées? Le getMessages() renvoie un tableau de noms d'éléments de formulaire en tant que clés qui contiennent chacune un tableau d'erreurs pour cet élément.

Répondre

7

Donc, fondamentalement, au lieu de remettre les formErrors voir aide:

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

Vous EMMENANT:

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

Vous voulez faire quelque chose comme ceci:

$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

je fini par faire quelque chose de similaire mais je comme votre meilleure solution. Bizarre qu'il n'y ait pas de fonction disponible pour gérer toutes les erreurs de formulaire comme ceci, seulement pour les gérer pour un champ à la fois. –

-1

Comme Mark points sur Dans sa réponse, getMessages() renvoie un tableau de noms d'éléments de formulaire en tant que clés qui contiennent chacune un tableau d'erreurs pour cet élément; et sa solution est:

$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) 

    ); 
} 

Cela fonctionne, aussi longtemps que getMessages() résultats dans un tableau à deux dimensions. Toutefois, si le formulaire est basé sur des ensembles de données relationnels générés par Doctrine (ou un autre plugin), le message d'erreur associé à un champ peut également être un tableau et le code ci-dessus se bloque car il traite $arrErrors comme une chaîne lorsqu'il s'avère être un tableau.

Pour capturer les messages d'erreur s'il existe un second ensemble de données, nous pouvons introduire une instruction foreach imbriquée dans la première instruction foreach, mais cela ne fonctionnera pas lorsque getMessages() aboutit à un tableau bidimensionnel; il ne fonctionne pas non plus si les ensembles de données sont plus de deux profondeurs.

Dans un scénario de données relationnelles où nous ne savons pas à quelle profondeur le message d'erreur vient, une solution évolutive est

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