2008-12-07 12 views
7

Ich habe ein Formular erstellt, um einen Benutzer zu einer Datenbank hinzufügen und Benutzer für die Anmeldung verfügbar machen.Zend_Form: Wie zu überprüfen 2 Felder sind identisch

Jetzt habe ich zwei Passwortfelder (das zweite ist für die Validierung der ersten). Wie kann ich zend_form einen Validator für diese Art der Validierung hinzufügen?

Dies ist mein Code für die beiden Passwortfelder:

$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

Ran über diese ältere Frage für die Suche aufrufen Selbe Sache - Zend_Validate_Identical (nicht um, als dies gepostet wurde ich rate) wird Name eines anderen Elements zu überprüfen gegen: http://stackoverflow.com/questions/347856/zend-form-how-to- check-2-fields-are-identic/3782388 # 3782388 –

Antwort

3

Als ich nach dem gleichen suchte, fand ich diesen sehr gut funktionierenden generischen Validator für identische Felder. Ich würde es nicht jetzt finden, so poste ich einfach den 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; 
    } 
} 
?> 
1

hier, wie ich dies :)

getan

ersten Durchgang Eingang erzeugt dann die zweite Kiste Eingang passieren und Identische Validator mit Daten aus früheren hinzufügen Passworteingabe.

+0

Dies funktioniert nur, wenn Sie den Validator im Controller hinzugefügt haben. Dies funktioniert nicht im Formular, da Sie keinen Zugriff auf die Anfrage haben. – Andrew

+0

Dies ist eine schlechte Vorgehensweise, da der Controller jetzt für das Hinzufügen der Validierungskriterien zuständig ist. –

40

Die aktuelle Version von Zend_Validate dies gebaut hat - während es gibt viele andere Antworten sind, wie es scheint, dass alle einen Wert erfordern Weitergabe an Zend_Validate_Identical. Während das an einem Punkt benötigt wurde, können Sie jetzt den Namen eines anderen Elements übergeben.

Vom Zend_Validate section of the reference guide:

Zend_Validate_Identical unterstützt auch den Vergleich von Formularelementen. Dies kann unter Verwendung des Namens des Elements als Token erfolgen. Siehe das folgende Beispiel:

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

durch die Elemente Namen von dem ersten Element als Token für das zweite Element verwendet wird, überprüft der Validierer, wenn das zweite Element mit dem ersten Element gleich ist. Falls Ihr Benutzer nicht zwei identische Werte eingibt, erhalten Sie einen Validierungsfehler.

+0

Sehr nette Lösung, ich lösche meine gepostete Antwort, da sie jetzt veraltet ist. – DavidHavl

0

Sie alle Formularfelder aus Validator zugreifen können, können Sie auch Konstruktor zusätzliche Argumente diese Prüfung passieren verwenden

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

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