2009-08-13 18 views
8

Tengo un controlador que pasa la entrada de un formulario a una clase de modelo para realizar la validación. Si la validación es exitosa, quiero permitir que el flujo continúe y represente la vista predeterminada asociada con el controlador.Zend diferentes scripts de vista?

Mi problema es que si la validación no es exitosa, entonces quiero que el modelo devuelva los mensajes de error de validación y los muestre en una vista separada. ¿Cómo puedo configurar los mensajes de error en la vista alternativa?

Gracias de antemano.

Respuesta

4

¿Por qué desea mostrar los mensajes de error en una vista diferente? ¿Por qué no construir condicionales en la vista? Algo así como si la forma tiene errores, luego los mensajes de eco son los que forman el eco.

Puede usar $ this -> _ forward para reenviar a otra acción con su respectiva vista. Puedes pasar lo que desees. Simplemente pase el objeto de formulario a lo largo, contiene todos los mensajes de error. O puede recuperar ciertos mensajes de error o todos ellos desde el objeto de formulario y pasarlos a una vista o acción.

+0

Probablemente debería ir con la misma vista. En el método de validación, devuelvo un mensaje de error basado en qué validación falló, por ejemplo, no pude encontrar el artículo, artículo fuera del rango de fechas. Si pasa, devuelvo el mensaje vacío y luego verifico si el valor devuelto por la validación no está vacío. ¿Es esto lo que quieres decir? – db83

+0

Parece que estás haciendo la verificación de validación manualmente. Pero eso es lo que los validadores están ahí y luego solo necesita llamar a $ form-> isValid() para saber si todas las pruebas han pasado. Si necesita validadores que ZF no ofrece, puede escribir sus propios validadores personalizados y conectarlos exactamente de la misma manera que los validadores incorporados. De modo que puede, por ejemplo, verificar si ($ form-> isValid()) y luego enviar los mensajes de error más si desea usar $ form-> populate y enviar el formulario rellenado a la vista o enviar un mensaje de éxito. – markus

+0

Además, siempre puede hacer comprobaciones en la vista también. Al igual que si ($ form-> hasErrors) muestra esto, de lo contrario, demuéstralo. (! pseudo-código!) – markus

11

Bueno, desde el controlador puede redirigir a otra acción en otro controlador:

$this->_forward($newactionname, 
         $newcontrollername, 
         $newmodulename, 
         Array($parameters_to_pass); 
    } 

o lo que acaba de representar un punto de vista diferente archivo:

$this->render('index_alternative'); 
9

No utilice _forward() si está redirigiendo a las acciones en el mismo controlador, simplemente llame a la acción directa usando $ this-> fooAction(), en lugar de esto -> _ forward ('foo' .. .

La razón es el rendimiento y los errores que pueden ocurrir debido a que el controlador se está construyendo correctamente. Cuando se llama _forward no solo se ejecuta el predispatch nuevamente (lo cual es algo esperado) sino que se llama init() y el constructor de nuevo. Si su controlador se extiende desde otros controladores, se llamarán también todos esos controladores, incluido su init(). Si tiene código en su init(), se ejecutará dos veces, y si está escribiendo en una base de datos ¡escribirá la línea dos veces! Evite todo y ca ll la acción directamente y use $ this-> render() en su lugar.

Puede ver fácilmente este problema si perfila su código,

+0

+1 amigo, no puedo creer que tharkun dijera redirigir. :/ –

+0

+1, ¡toco eso! – Marecky

Cuestiones relacionadas