Zend_Form: how to check 2 fields are identical

前端 未结 4 1576
走了就别回头了
走了就别回头了 2020-12-09 21:51

I have created a form to add a user to a database and make user available for login.

Now I have two password fields (the second is for validation of the first). How

相关标签:
4条回答
  • 2020-12-09 22:33

    When I was looking for the same, I found this very well working generic Validator for Identical Fields. I don't find it now so I just post the code...

    <?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;
      }
    }
    ?>
    
    0 讨论(0)
  • 2020-12-09 22:35

    here is how i done this :)

    create first pass input then crate second pass input and add Identical validator with data from previous password input.

    $password_2->addValidator('identical', false, $this->_request->getPost('password'));
    
    0 讨论(0)
  • 2020-12-09 22:38

    The current version of Zend_Validate has this built in - while there are plenty of other answers, it seems that all require passing a value to Zend_Validate_Identical. While that may have been needed at one point, you can now pass the name of another element.

    From the Zend_Validate section of the reference guide:

    Zend_Validate_Identical supports also the comparison of form elements. This can be done by using the element's name as token. See the following example:

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

    By using the elements name from the first element as token for the second element, the validator validates if the second element is equal with the first element. In the case your user does not enter two identical values, you will get an validation error.

    0 讨论(0)
  • 2020-12-09 22:51

    You can access all form fields from validator, also you can use constructor to pass additional arguments

    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;
    }
    }
    

    to call this validator

    $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');
    
    0 讨论(0)
提交回复
热议问题