2010-08-11 14 views
5

Estoy tratando de mostrar todos los errores de formulario antes del formulario con un ViewScript. Aquí está el código que estoy actualmente tratando de utilizar dentro de mi ViewScript:Mostrar errores de formulario de Zend_Form en ViewScript

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

Esta llamada me da un mensaje de error:

Advertencia: htmlspecialchars() espera parámetro de 1 a ser de cadena, matriz dado

He visto este mismo código sugerido en otros lugares, pero no funciona para mí. Si imprimo $ this->> element- getMessages() hago ver los mensajes de error como el siguiente:

Array ([myField] => Array ([estaVacia] => Valor es necesario y puede' t estar vacío))

¿Alguna idea?

Respuesta

7

getMessages() devuelve una matriz de nombres de elementos de formulario como claves que contienen una matriz de errores para cada elemento. Así que, básicamente, en lugar de entregar FormErrors ayudante de vista:

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

Usted está entregando es:

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

que le gustaría hacer algo como esto en su lugar:

$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

que terminé haciendo algo similar, pero me gusta su solución mejor. Es extraño que no haya ninguna función disponible para manejar juntos todos los errores de formulario como este, solo para manejarlos para un campo a la vez. –

-1

Como Mark puntos cabo en su respuesta, getMessages() devuelve una matriz de nombres de elementos de formulario como claves que contienen una matriz de errores para ese elemento; y su solución 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) 

    ); 
} 

Esto funciona, siempre y cuando getMessages() resultados en una matriz de dos dimensiones. Sin embargo, si el formulario se basa en conjuntos de datos relacionales generados por Doctrine (o algún otro complemento), el mensaje de error asociado con un campo también podría ser una matriz y el código anterior se bloqueará porque trata $arrErrors como una cadena cuando resulta ser una matriz.

Para capturar los mensajes de error si hay un segundo conjunto de datos, podríamos introducir una declaración foreach anidada dentro de la primera instrucción foreach, pero eso no funcionará cuando getMessages() genere una matriz bidimensional; tampoco funciona si los conjuntos de datos tienen más de dos profundidades.

En un escenario de datos relacional en la que no sabemos qué tan profundo el mensaje de error proviene de una solución escalable es

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