Zend_Form: come controllare 2 campi sono identici

Ho creato un form per aggiungere un utente a un database e rendere disponibile per l’utente per il login.

Ora ho due campi password (la seconda è per la convalida del primo). Come posso aggiungere un validatore per questo tipo di convalida per zend_form?

Questo è il mio codice per i due campi password:

    $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());
  • Imbattuto in questa vecchia domanda cercando la stessa cosa – si rivelasse Zend_Validate_Identical (non quando questo è stato postato sto cercando di indovinare) prenderà il nome di un altro elemento per controllare contro: stackoverflow.com/questions/347856/…

 

4 Replies
  1. 3

    Quando stavo cercando la stessa cosa, ho trovato questo molto bene a lavorare generico Validatore per Campi Identici. Io non lo trovo così ho appena posto il codice…

    <?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;
      }
    }
    ?>
  2. 40

    La versione corrente di Zend_Validate ha costruito in questo – mentre ci sono un sacco di altre risposte, sembra che tutti richiedono il superamento di un valore di Zend_Validate_Identical. Mentre che potrebbe essere stato necessario a un certo punto, è ora possibile passare il nome di un altro elemento.

    Dal Zend_Validate sezione della guida di riferimento:

    Zend_Validate_Identical supporta anche il confronto di elementi di forma. Questo può essere fatto utilizzando il nome dell’elemento, come token. Vedere l’esempio seguente:

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

    Utilizzando gli elementi nome dal primo elemento come token per il secondo elemento, il validatore convalida se il secondo elemento è uguale al primo elemento. Nel caso In cui l’utente non inserire due valori identici, si otterrà un errore di convalida.

    • Molto bella soluzione, io sono l’eliminazione miei inviato la risposta è diventato ormai superata.
  3. 1

    ecco come ho fatto 🙂

    di creare, prima di passare ingresso, cassa secondo pass di ingresso e di aggiungere Identici validatore con i dati precedenti di immissione della password.

    $password_2->addValidator('identical', false, $this->_request->getPost('password'));
    • Questo funziona solo se hai da aggiungere che il validatore del controller. Questo non funziona all’interno del modulo, perché non hanno accesso alla richiesta.
    • Questa è una cattiva pratica il controller è ora responsabile di aggiungere i criteri di convalida.
  4. 0

    È possibile accedere a tutti i campi del modulo dal validatore,
    inoltre, è possibile utilizzare la funzione di costruzione per passare ulteriori argomenti

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

    chiamare questo validatore

    $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');

Lascia un commento