2010-03-05 37 views
5

tôi thêm lớp này vào thư viện/My/Validate/PasswordConfirmation.phpXác nhận mật khẩu trong khuôn khổ zend

<?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['password']) 
       && ($value == $context['password'])) 
      { 
       return true; 
      } 
     } elseif (is_string($context) && ($value == $context)) { 
      return true; 
     } 

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

sau đó tôi tạo ra hai lĩnh vực trong hình thức của tôi như thế này:

 $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', 'password_confirm'); 
    $userPasswordRepeat->setLabel('Password repeat: '); 
    $userPasswordRepeat->setRequired('true'); 
    $userPasswordRepeat->addPrefixPath('My_Validate','My/Validate','validate'); 

    $userPasswordRepeat->addValidator('PasswordConfirmation'); 
    $this->addElement($userPasswordRepeat) 

mọi thứ đều tốt nhưng khi tôi gửi mẫu luôn, tôi nhận được thông báo 'Xác nhận mật khẩu không khớp'? Có gì sai trong mã của tôi

+0

Dưới đây là một cách để làm xác nhận mật khẩu sử dụng xác nhận của Zend (tôi nhận ra rằng nó có thể n ot đã có thể khi câu hỏi này được hỏi): http://stackoverflow.com/questions/347856/zend-form-how-to-check-2-fields-are-identical/3782388#3782388 –

Trả lời

2

Tôi nghĩ bạn có thể muốn $context['user_password'] vì đó là tên của "đầu tiên" tố mật khẩu của bạn

2

Làm cho tái sử dụng validator. Không đặt tên trường mã cứng trong trình xác thực. Nhìn vào đây IdenticalField Validator phổ biến hơn.

3

Có một cách để làm điều đó. Trong biểu mẫu đặt validator giống hệt nhau trên các lĩnh vực passoword xác nhận, và sau đó chỉ cần ghi đè lên $ form-> isValid() phương pháp để thiết lập giá trị để được xác nhận:

public function __construct($options = NULL) 
{ 
    // ... 
    $confirm->addValidator('Identical'); 
    // ... 
} 
public function isValid($data) 
{ 
    $confirm = $this->getElement('confirm_password'); 
    $confirm->getValidator('Identical')->setToken($data['password']); 
    return parent::isValid($data); 
} 
9

Một cách ít thanh lịch và đơn giản để làm điều đó:

$password = new Zend_Form_Element_Password('password'); 
    $password->setLabel('Password:') 
      ->addValidator('StringLength', false, array(6,24)) 
      ->setLabel('Choose your password:') 
      ->setRequired(true); 

    $password2 = new Zend_Form_Element_Password('password-confirm'); 
    $password2->setLabel('Confirm:') 
      ->addValidator('StringLength', false, array(6,24)) 
      ->setLabel('Confirm your password:') 
      ->addValidator(new Zend_Validate_Identical($_POST['password'])) 
      ->setRequired(true); 
+0

Cảm ơn Marcel vì bạn hữu ích và phát lại ngắn – 3ehrang

+0

và nếu bạn có một số kinh nghiệm trong partialloop xin vui lòng thông báo cho tôi. – 3ehrang

17

Bạn không cần phải ghi đè lên Zend_Form-> phương pháp isValid hoặc sử dụng các superglobal $ _POST, kiểm tra này:

$frmPassword1=new Zend_Form_Element_Password('password'); 
$frmPassword1->setLabel('Password') 
    ->setRequired('true') 
    ->addFilter(new Zend_Filter_StringTrim()) 
    ->addValidator(new Zend_Validate_NotEmpty()); 

$frmPassword2=new Zend_Form_Element_Password('confirm_password'); 
$frmPassword2->setLabel('Confirm password') 
    ->setRequired('true') 
    ->addFilter(new Zend_Filter_StringTrim()) 
    ->addValidator(new Zend_Validate_Identical('password')); 
+0

Tôi không ghi đè lên zend_form là phương thức hợp lệ Tôi chỉ thêm trình xác thực của riêng mình. – 3ehrang

Các vấn đề liên quan