Foros del Web » Programando para Internet » PHP » Zend »

Cambiar mensaje de error para un campo CSRF

Estas en el tema de Cambiar mensaje de error para un campo CSRF en el foro de Zend en Foros del Web. Hola, tengo un formulario de registro que contiene un campo del tipo Zend_Form_Element_Hash para realizar una protección tipo CSRF. Por otro lado, decir que los ...
  #1 (permalink)  
Antiguo 22/05/2011, 01:58
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Cambiar mensaje de error para un campo CSRF

Hola,

tengo un formulario de registro que contiene un campo del tipo Zend_Form_Element_Hash para realizar una protección tipo CSRF.
Por otro lado, decir que los errores que se generan al validar el formulario se muestran al lado de cada campo.

Debido a que el campo Zend_Form_Element_Hash es oculto, me gustaría que los errores de ese campo se mostraran a nivel de formulario y no de campo. ¿Es eso posible?

Tambien me gustaría hacer una traducción de los mensajes de error sólo para ese campo porque su validador es del tipo Identical y afecta a otros campos.

Muchas gracias!
  #2 (permalink)  
Antiguo 22/05/2011, 04:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Cambiar mensaje de error para un campo CSRF

Buenas, te dejo un par de links que te pueden servir de guía,

http://framework.zend.com/manual/en/zend.form.i18n.html
http://cogo.wordpress.com/2008/04/24...ages-and-more/

lo anterior traduce todos los mensajes, para traducir un validator, puedes hacer algo asi:

Código PHP:
Ver original
  1. //custom form
  2. public function init()
  3. {
  4.     ...
  5.     $this->getElement('csrf')
  6.          ->getValidator('Identical')
  7.          ->setMessage($this->getTranslator()->_('Text to translate'), 'missingToken');
  8.     ...
  9. }

Y con respecto a la posición de los mensajes de error, con los decorators standard, los podes mostrar o todos al lado del input o todos arriba del form(con el decorator FormErrors), si quieres mostrar unos en un lugar y otros en otro, puedes:
  1. Crearte un custom decorator que ignore todo error que no sea de csrf.
  2. Comprobar manualmente si hay un error de csrf y mostrar el mensaje donde tu quieras.
  3. Agregar una clase al csrf y por medio de css posicionarlo.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 22/05/2011, 09:17
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Cambiar mensaje de error para un campo CSRF

Oohhh, una forma de hacerlo en el formulario, interesante

Bueno yo lo hice como en el ejemplo del segundo enlace, porque como tengo varios formularios y quería lo que todos iban a mostrar. Para los Hash se usa Zend_Validate_Identical::NOT_SAME y Zend_Validate_Identical::MISSING_TOKEN, si es que esto algo sirve
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 22/05/2011, 09:26
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Cambiar mensaje de error para un campo CSRF

Otra cosa, si yo tengo así declarado en el bootstrap
Código PHP:
Ver original
  1. protected function _initTranslate()
  2. {
  3.     $translate = new Zend_Translate(
  4.         'array',
  5.         APPLICATION_PATH . '/configs/languages/es.php',
  6.         'es_ES'
  7.     );
  8.     Zend_Form::setDefaultTranslator($translate);
  9. }
Si añado, luego otro lenguaje, por ejemplo ingles, ¿como hago cuando la persona escoja el idioma se muestre conforme lo seleccionó?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 22/05/2011, 10:02
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Cambiar mensaje de error para un campo CSRF

El tema esta en como propagas el language, por lo general se hacer por la uri, lo que lleva a utilizar un plugin para setear el language activo, como lo estas propagando ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 22/05/2011, 10:50
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Cambiar mensaje de error para un campo CSRF

Al momento tengo un lenguaje solamente, pero tengo que al final publicarlo en dos. En este caso voy a usar la uri para indicar el lenguaje. ¿En que momento se recomienda hacer el cambio en el pre-dispatch o en el primer proceso o sea routeStartup?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 22/05/2011, 10:57
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Cambiar mensaje de error para un campo CSRF

Yo creo que es mejor el routeShutdown.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 22/05/2011, 11:03
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Cambiar mensaje de error para un campo CSRF

Gracias
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 27/05/2011, 04:42
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Cambiar mensaje de error para un campo CSRF

Cita:
Iniciado por masterpuppet Ver Mensaje
Código PHP:
Ver original
  1. //custom form
  2. public function init()
  3. {
  4.     ...
  5.     $this->getElement('csrf')
  6.          ->getValidator('Identical')
  7.          ->setMessage($this->getTranslator()->_('Text to translate'), 'missingToken');
  8.     ...
  9. }
Intentando esta solución propuesta he implementado esta clase:
Código PHP:
Ver original
  1. <?php
  2. // library/My/Form/Element/Hash.php
  3. /**
  4.  * own Hash form element
  5.  */
  6. class My_Form_Element_Hash
  7.     extends Zend_Form_Element_Hash
  8. {
  9.     public function init()
  10.     {
  11.         $translate = Zend_Registry::get('translate');
  12.        
  13.         Zend_Debug::dump($this->getValidators());
  14.        
  15.         /*
  16.         $this->getValidator('Identical')
  17.              ->setMessage($this->getTranslator()
  18.                                ->_(Zend_Validate_Identical::NOT_SAME,
  19.                                    $translate->_('My_Form_Element_Hash_notSame')))
  20.              ->setMessage($this->getTranslator()
  21.                                ->_(Zend_Validate_Identical::MISSING_TOKEN,
  22.                                    $translate->_('My_Form_Element_Hash_missingToken')))
  23.         */
  24.         ;
  25.     }      
  26. }
El problema que tengo es que no hay ningún validador instanciado. El dump ese devuelve array vacío.

Mirando el código de Zend, he visto que dentro del constructor es donde se instancia el validador.

Entonces, ¿no entiendo por qué no tiene ningún validador instanciado?

Gracias
  #10 (permalink)  
Antiguo 27/05/2011, 05:27
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Cambiar mensaje de error para un campo CSRF

El problema es que init se dispara antes del init del validator, el orden es:
  1. parent construct
  2. init
  3. init csrf validator

Una opción seria sobrescribir Zend_Form_Element_Hash::initCsrfValidator

Código PHP:
Ver original
  1. public function initCsrfValidator()
  2. {
  3.     parent::initCsrfValidator();
  4.     $translate = Zend_Registry::get('translate');
  5.     Zend_Debug::dump($this->getValidators());
  6.     ...
  7. }

Y recuerda que puedes acceder al translator desde el Zend_Form_Element

Código PHP:
Ver original
  1. public function initCsrfValidator()
  2. {
  3.     parent::initCsrfValidator();
  4.     Zend_Debug::dump($this->getTranslator());
  5.     Zend_Debug::dump($this->getValidators());
  6.     ...
  7. }

es mas limpio que acceder por el Registry.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 30/05/2011, 06:39
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Cambiar mensaje de error para un campo CSRF

No encontré el método setMessage de los validators. Acabé haciéndolo así:
Código PHP:
Ver original
  1. $translate = Zend_Registry::get('translate');
  2.         $content = array(
  3.                        Zend_Validate_Identical::NOT_SAME =>
  4.                            $translate->_('My_Form_Element_Hash_notSame'),
  5.                        Zend_Validate_Identical::MISSING_TOKEN =>
  6.                            $translate->_('My_Form_Element_Hash_missingToken')
  7.                    );
  8.        
  9.         $this->getValidator('Identical')
  10.              ->getTranslator()
  11.              ->addTranslation(
  12.                    array(
  13.                        'adapter' => 'array',
  14.                        'content' => $content,
  15.                        'locale' => $translate->getLocale()
  16.                    )
  17.              );

Etiquetas: campos, csrf, frameworks-y-php-orientado-a-objetos, hash, ocultos, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.