2008-12-07 22 views
7

He creado un formulario para agregar un usuario a una base de datos y hacer que el usuario esté disponible para iniciar sesión.Zend_Form: cómo verificar 2 campos son idénticos

Ahora tengo dos campos de contraseña (el segundo es para la validación del primero). ¿Cómo puedo agregar un validador para este tipo de validación a zend_form?

Este es mi código para los dos campos de contraseña:

$password = new Zend_Form_Element_Password('password', array(
     'validators'=> array(
      'Alnum', 
      array('StringLength', array(6,20)) 
      ), 
     'filters' => array('StringTrim'), 
     'label'  => 'Wachtwoord:' 
     )); 

    $password->addFilter(new Ivo_Filters_Sha1Filter()); 

    $password2 = new Zend_Form_Element_Password('password', array(
     'validators'=> array(
      'Alnum', 
      array('StringLength', array(6,20)) 
      ), 
     'filters' => array('StringTrim'), 
     'required' => true, 
     'label'  => 'Wachtwoord:' 
     )); 
    $password2->addFilter(new Ivo_Filters_Sha1Filter()); 
+1

corrió a través de esta pregunta mayores en busca de la Lo mismo - Resulta que Zend_Validate_Identical (no cuando se publicó esto, supongo) tomará el nombre de otro elemento para verificar: http://stackoverflow.com/questions/347856/zend-form-how-to- check-2-fields-are-identical/3782388 # 3782388 –

Respuesta

3

Cuando estaba buscando lo mismo, encontré este validador genérico muy útil para campos idénticos. Yo no lo encuentro ahora, así que simplemente enviar el código ...

<?php 

class Zend_Validate_IdenticalField extends Zend_Validate_Abstract { 
    const NOT_MATCH = 'notMatch'; 
    const MISSING_FIELD_NAME = 'missingFieldName'; 
    const INVALID_FIELD_NAME = 'invalidFieldName'; 

    /** 
    * @var array 
    */ 
    protected $_messageTemplates = array(
    self::MISSING_FIELD_NAME => 
     'DEVELOPMENT ERROR: Field name to match against was not provided.', 
    self::INVALID_FIELD_NAME => 
     'DEVELOPMENT ERROR: The field "%fieldName%" was not provided to match against.', 
    self::NOT_MATCH => 
     'Does not match %fieldTitle%.' 
); 

    /** 
    * @var array 
    */ 
    protected $_messageVariables = array(
    'fieldName' => '_fieldName', 
    'fieldTitle' => '_fieldTitle' 
); 

    /** 
    * Name of the field as it appear in the $context array. 
    * 
    * @var string 
    */ 
    protected $_fieldName; 

    /** 
    * Title of the field to display in an error message. 
    * 
    * If evaluates to false then will be set to $this->_fieldName. 
    * 
    * @var string 
    */ 
    protected $_fieldTitle; 

    /** 
    * Sets validator options 
    * 
    * @param string $fieldName 
    * @param string $fieldTitle 
    * @return void 
    */ 
    public function __construct($fieldName, $fieldTitle = null) { 
    $this->setFieldName($fieldName); 
    $this->setFieldTitle($fieldTitle); 
    } 

    /** 
    * Returns the field name. 
    * 
    * @return string 
    */ 
    public function getFieldName() { 
    return $this->_fieldName; 
    } 

    /** 
    * Sets the field name. 
    * 
    * @param string $fieldName 
    * @return Zend_Validate_IdenticalField Provides a fluent interface 
    */ 
    public function setFieldName($fieldName) { 
    $this->_fieldName = $fieldName; 
    return $this; 
    } 

    /** 
    * Returns the field title. 
    * 
    * @return integer 
    */ 
    public function getFieldTitle() { 
    return $this->_fieldTitle; 
    } 

    /** 
    * Sets the field title. 
    * 
    * @param string:null $fieldTitle 
    * @return Zend_Validate_IdenticalField Provides a fluent interface 
    */ 
    public function setFieldTitle($fieldTitle = null) { 
    $this->_fieldTitle = $fieldTitle ? $fieldTitle : $this->_fieldName; 
    return $this; 
    } 

    /** 
    * Defined by Zend_Validate_Interface 
    * 
    * Returns true if and only if a field name has been set, the field name is available in the 
    * context, and the value of that field name matches the provided value. 
    * 
    * @param string $value 
    * 
    * @return boolean 
    */ 
    public function isValid($value, $context = null) { 
    $this->_setValue($value); 
    $field = $this->getFieldName(); 

    if (empty($field)) { 
     $this->_error(self::MISSING_FIELD_NAME); 
     return false; 
    } elseif (!isset($context[$field])) { 
     $this->_error(self::INVALID_FIELD_NAME); 
     return false; 
    } elseif (is_array($context)) { 
     if ($value == $context[$field]) { 
     return true; 
     } 
    } elseif (is_string($context) && ($value == $context)) { 
     return true; 
    } 
    $this->_error(self::NOT_MATCH); 
    return false; 
    } 
} 
?> 
1

aquí es cómo he hecho esto :)

crear la primera entrada y luego pase cajón segundo paso de entrada y añadir validador Idéntico con los datos anteriores entrada de contraseña

$password_2->addValidator('identical', false, $this->_request->getPost('password')); 
+0

Esto solo funciona si ha agregado el validador en el controlador. Esto no funcionará dentro del formulario porque no tendrá acceso a la solicitud. – Andrew

+0

Esta es una mala práctica ya que el controlador ahora es responsable de agregar los criterios de validación. –

40

La versión actual de este Zend_Validate ha construido en - mientras que hay un montón de otras respuestas, parece que todos requieren pasar un valor de Zend_Validate_Identical. Si bien puede haber sido necesario en un punto, ahora puede pasar el nombre de otro elemento.

Desde el Zend_Validate section of the reference guide:

Zend_Validate_Identical apoya también la comparación de elementos de formulario. Esto se puede hacer usando el nombre del elemento como token. Véase el siguiente ejemplo:

$form->addElement('password', 'elementOne'); 
$form->addElement('password', 'elementTwo', array(
    'validators' => array(
     array('identical', false, array('token' => 'elementOne')) 
    ) 
)); 

utilizando el nombre de elementos desde el primer elemento como contador para el segundo elemento, el validador valida si el segundo elemento es igual con el primer elemento. En el caso de que su usuario no ingrese dos valores idénticos, obtendrá un error de validación.

+0

Muy buena solución, estoy borrando mi respuesta publicada ya que ahora está fechada. – DavidHavl

0

Se puede acceder a todos los campos del formulario de validación, También se puede utilizar el constructor para pasar argumentos adicionales

class Example_Validator extends Zend_Validate_Abstract{ 

const NOT_IDENTICALL = 'not same'; 

private $testValue;  

public function __construct($arg) { 
     $this->testValue = $arg;  
    } 

protected $_messageTemplates = array(
    self::NOT_IDENTICALL => "Passwords aren't same" 
);  

public function isValid($value, $context = null) 
{ 
    echo $context['password']; 
    echo '<br>'; 
    echo $this->testValue; 

    return true; 
} 
} 

llamar a este validador

$form = new Zend_Form(); 
$form->setAction('success'); 
$form->setMethod('post'); 
$form->addElement('text', 'username'); 
$usernameElement = $form->getElement('username'); 
$form->addElement('password', 'password'); 
$passwordElement = $form->getElement('password'); 
$myValidator2 = new Example_Validator("Hello !"); 
$passwordElement->addValidator($myValidator2, true);  
$form->addElement('submit', 'submit'); 
$submitButton = $form->getElement('submit'); 
Cuestiones relacionadas