2009-10-27 22 views
12

En mi forma, estoy tratando de verificar que el usuario complete el mismo valor las dos veces (para asegurarse de que no cometieron un error). Creo que para eso sirve Zend_Validate_Identical, pero no estoy muy seguro de cómo usarlo. Esto es lo que tengo hasta ahora:¿Cómo verificar el campo de contraseña en el formulario zend?

$this->addElement('password', 'password', array(
     'label'  => 'Password:', 
     'required' => true, 
     'validators' => array(
      'Identical' => array(What do I put here?) 
     ) 
    )); 
$this->addElement('password', 'verifypassword', array(
     'label'  => 'Verify Password:', 
     'required' => true, 
     'validators' => array(
      'Identical' => array(What do I put here?) 
     ) 
    )); 

¿Lo necesito en ambos elementos? ¿Qué pongo en la matriz?

+0

Respuesta actualizada usando Zend_Validate_Identical y otro elemento como 'token': http://stackoverflow.com/questions/1628606/how-to-verify-password-field-in-zend-form/3653416#3653416 –

Respuesta

27

Por lo que vale, el soporte para comparar dos campos de formulario idénticos dentro de un modelo se agregó a la versión 1.10.5. Escribí un breve tutorial sobre el tema, al que puede acceder a través del siguiente enlace, pero la conclusión es que el validador Zend_Validate_Identical se ha refactorizado para aceptar un nombre de campo de formulario como entrada. Por ejemplo, al comparar los valores de los campos del formulario y pswd confirm_pswd, podrás conectar el validador para confirm_pswd así:

$confirmPswd->addValidator('Identical', false, array('token' => 'pswd')); 

funciona como un encanto.

Consulte Validating Identical Passwords with the Zend Framework para obtener un ejemplo más completo.

+0

+1 esta respuesta me ahorró mucho tiempo ... –

+0

¿Cómo puedo usar esto para ambas operaciones de agregar y editar @ Jason, @ saji89 – ehp

+0

Me salvaste el día. Muchas gracias ! –

1
class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract 
{ 
const NOT_MATCH = 'notMatch'; 

protected $_messageTemplates = array(
    self::NOT_MATCH => 'Password confirmation does not match' 
); 

public function isValid($value, $context = null) 
{ 
    $value = (string) $value; 
    $this->_setValue($value); 

    if (is_array($context)) { 
     if (isset($context['password_confirm']) 
      && ($value == $context['password_confirm'])) 
     { 
      return true; 
     } 
    } elseif (is_string($context) && ($value == $context)) { 
     return true; 
    } 

    $this->_error(self::NOT_MATCH); 
    return false; 
} 
} 

http://framework.zend.com/manual/en/zend.form.elements.html

4

no puedo probarlo en este momento, pero creo que esto podría funcionar:

$this->addElement('password', 'password', array(
    'label'  => 'Password:', 
    'required' => true 
)); 
$this->addElement('password', 'verifypassword', array(
    'label'  => 'Verify Password:', 
    'required' => true, 
    'validators' => array(
     array('identical', true, array('password')) 
    ) 
)); 
+0

Me aparece el error: la 'contraseña' del token no coincide con el token 'testpassword'. testpassword es el valor y la contraseña es el nombre del elemento que se especificó aquí: 'idéntico', verdadero, matriz ('contraseña') – Andrew

+0

Estaba a punto de decir que era extraño que mostrara el valor de la contraseña que ingresé el mensaje de error, pero resulta que eso no es cierto porque había establecido el tipo de elemento como texto y no como contraseña. – Andrew

0

yo era capaz de conseguir que funcione con el siguiente código:

En mi forma agrego el validador idéntico solo en el segundo elemento:

$this->addElement('text', 'email', array(
     'label'  => 'Email address:', 
     'required' => true, 
     'filters' => array('StringTrim'), 
     'validators' => array('EmailAddress') 
    )); 

$this->addElement('text', 'verify_email', array(
     'label'  => 'Verify Email:', 
     'required' => true, 
     'filters' => array('StringTrim'), 
     'validators' => array('EmailAddress', 'Identical') 
    )); 

Y en el controlador, justo antes de llamar isValid():

$validator = $form->getElement('verify_email')->getValidator('identical'); 
$validator->setToken($this->_request->getPost('email')); 

No sé si hay una forma más elegante de hacer esto sin tener que añadir este código al controlador. Avíseme si hay una mejor manera de hacer esto.

1
$token = Zend_Controller_Front::getInstance()->getRequest()->getPost('password'); 
$confirmPassword->addValidator(new Zend_Validate_Identical(trim($token))) 
        ->addFilter(new Zend_Filter_StringTrim()) 
        ->isRequired(); 

utilizando un código de arriba dentro de la clase que se extiende Zend_Form.

+0

no podemos usar $ password-> getValue()? Bueno, ya lo he intentado, pero tengo un valor vacío ... ¿por qué es así? si getValue es el método de ese elemento, ¿debería haber devuelto el valor de la contraseña? –

+0

eso porque se llama a getValue() antes de $ form-> isValid ($ _ POST); ya que ese código está dentro del constructor o el método init. –

2

Después de dos días me encontré con la respuesta correcta me sigue, paso a paso:

paso 1:

crear PasswordConfirmation.php archivo en el directorio raíz de tu proyecto con esta ruta: yourproject/My/Validate/PasswordConfirmation.php con esta por debajo de contenido :

<?php 
require_once 'Zend/Validate/Abstract.php'; 
class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract 
{ 
    const NOT_MATCH = 'notMatch'; 

    protected $_messageTemplates = array(
     self::NOT_MATCH => 'Password confirmation does not match' 
    ); 

    public function isValid($value, $context = null) 
    { 
     $value = (string) $value; 
     $this->_setValue($value); 

     if (is_array($context)) { 
      if (isset($context['user_password']) 
       && ($value == $context['user_password'])) 
      { 
       return true; 
      } 
     } 
     elseif (is_string($context) && ($value == $context)) { 
      return true; 
     } 

     $this->_error(self::NOT_MATCH); 
     return false; 
    } 
} 
?> 

paso 2:

Añadir dos campos en el formulario de la siguiente manera:

//create the form elements user_password 
$userPassword = $this->createElement('password', 'user_password'); 
$userPassword->setLabel('Password: '); 
$userPassword->setRequired('true'); 
$this->addElement($userPassword); 

//create the form elements user_password repeat 
$userPasswordRepeat = $this->createElement('password', 'user_password_confirm'); 
$userPasswordRepeat->setLabel('Password repeat: '); 
$userPasswordRepeat->setRequired('true'); 
$userPasswordRepeat->addPrefixPath('My_Validate', 'My/Validate', 'validate'); 
$userPasswordRepeat->addValidator('PasswordConfirmation', true, array('user_password')); 
$this->addElement($userPasswordRepeat); 

ahora disfrutan de su código

+0

@moinsam, si tengo una opción para editar/actualizar junto con agregar, ¿qué cambios se deben hacer? – ehp

0

Con Zend Framework 1.10 el código necesario para validar la igualdad de dos campos usando Formulario Zend y Zend Validar es:

$form->addElement('PasswordTextBox', 
         'password', 
         array('label'  => 'Password') 
        ); 

    $form->addElement('PasswordTextBox', 
         'password_confirm', 
         array('label'  => 'Confirm password', 
          'validators' => array(array('Identical', false, 'password')), 
          ) 
        ); 

se puede notar, en la matriz de validadores del elemento password_confirm, que el validador Identical se pasa como matriz, la semántica de esa matriz es: i) Nombre del validador, ii) cadena de interrupción en caso de fallo, iii) opciones del validador Como puede ver, es es posible pasar el nombre del campo en lugar de recuperar el valor.

Cuestiones relacionadas