2009-08-06 24 views
9

Tôi đang xây dựng một ứng dụng ZendFramework như một mẫu đăng nhập yêu cầu địa chỉ email và mật khẩu - có vẻ hợp lý để xác thực địa chỉ email trước khi nhấn vào cơ sở dữ liệu với nỗ lực đăng nhập, vì một email không hợp lệ sẽ không bao giờ dẫn đến hợp lệ đánh. Zend_Validate_EmailAddress có vẻ như là một cách đi đúng, nhưng tôi đang gặp vấn đề với nó tạo ra nhiều lỗi (câu hỏi ở phía dưới, sau mã).Trong Zend_Form, cách tránh Zend_Validate_Email tạo nhiều lỗi?

hình thức của tôi hiện có sau

//WPMail_Form_Login::init() 
$email = $this->addElement('text', 'email', array(
    'label'=>'Email', 
    'required'=>true, 
    'filters'=>array('stringtrim'), 
    'validators'=>array(array('emailaddress', true, array(
     'messages'=>array(
      'emailAddressInvalidHostname'=>'Your email address is invalid', 
      'emailAddressInvalidFormat'=>'Your email address is invalid', 
      '...'=>'(repeat for all message templates)' 
     ) 
    ))), 
)); 

Trong bộ điều khiển tôi trực tiếp thông qua các hình thức vào xem:

// WPMail_AuthController::loginAction() 
$this->view->form = $form; 

Và trong giao diện, nó trực tiếp echo'd:

// views/scripts/auth/login.phtml 
<?php echo $this->form ?> 

Kết quả hiện tại giống như sau:

- Your email address is invalid 
- 'asda!!!' does not match the expected structure for a DNS hostname 
- 'asda!!!' does not appear to be a valid local network name 

Điều tôi muốn biết là: Có thể định cấu hình Zend _ Xác thực _ EmailAddress theo cách sao cho chỉ tạo ra một lỗi không hợp lệ với email không? Bởi 'cấu hình' tôi có nghĩa là, mà không mở rộng lớp và ghi đè các logic với của riêng tôi.

TIA.

Trả lời

10

Phần tử biểu mẫu Zend có nhiều phương pháp khác nhau mà bạn có thể sử dụng để tùy chỉnh thư. Nó không quá rõ ràng từ các tài liệu nhưng addErrorMessage() thiết lập một thông báo lỗi tùy chỉnh duy nhất khi xác thực không thành công. do đó

dụ của bạn sẽ trông giống như:

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email') 
     ->setRequired(true) 
     ->addFilter('stringtrim') 
     ->addValidator('emailAddress', true) 
     ->addErrorMessage('Your email address is invalid'); 
$this->addElement($email); 

Xem http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators.errors

+0

Tuyệt vời, cảm ơn! Tôi thực sự đi qua đó, nhưng bằng cách nào đó giả định rằng việc thêm một thông báo lỗi sẽ làm mất hiệu lực hình thức (như trong đó nó là một phần của khi bạn làm xác nhận của riêng bạn) .. vui mừng khi thấy nó đơn giản này! – kander

+2

Nó có thể gây nhầm lẫn .. $ email-> addError ($ message) sẽ đặt lỗi và đánh dấu là không hợp lệ, nhưng $ email-> addErrorMessage ($ message) vừa xuất hiện để đặt thư, ghi đè thư mặc định và không không đặt lỗi! – simonrjones

+0

+1, nhờ mẹo kiến ​​thức – Ish

1

Như những thông điệp được tạo ra bởi một validator, tôi không nghĩ rằng có thể :-(

Phương pháp Zend_Validate_EmailAddress::isValid làm tất cả những kiểm chứng thực, trên tạo ra các lỗi như một toàn thể, có vẻ như.

Một giải pháp "hacky" sẽ lặp lại, trong bộ điều khiển, trên các lỗi và xóa tất cả trừ lỗi đầu tiên, cho mỗi trường có nhiều hơn một ... Nhưng tôi thực sự không thích âm thanh của ...


Bạn có thể, tất nhiên, kế thừa hơn và sửa đổi hành vi mặc định ... Nhưng bạn nói bạn không muốn làm điều đó, vì vậy ...


Tuy nhiên, nếu tôi là sai, và có một cách, tôi rất tò mò về nó ;-)

+1

Trên thực tế, các thông điệp được tạo ra bởi hai xác nhận!Zend_Validate_Hostname đã được gọi gián tiếp bởi Zend_Validate_Email. – kander

3

Kiểm tra điều này tutorial bởi Pádraic Brady về việc sử dụng Zend_Form.

Cụ thể là phần "Bước 4: Xử lý thông báo lỗi với trang trí tùy chỉnh".

+0

Bạn có nghĩa là sử dụng dịch giả trong bước 5 Bill? Điều đó dường như vẫn yêu cầu nhiều khai báo của thông báo mặc định của bạn cho từng loại lỗi. – simonrjones

+0

Không, ý tôi là bước 4. Bạn có thể viết một trang trí lỗi tùy chỉnh trả về thông điệp * đầu tiên * từ trình xác thực email như bạn muốn, thay vì imploding tất cả các thư. –

+0

Liên kết tuyệt vời! Có vẻ như trang trí tùy chỉnh sẽ là một cách khác (so với giải pháp simonrjones) để có được những gì tôi muốn, mặc dù nó nhắc tôi về bản phác thảo 'Mosquito Hunting' của Monty Python ... như trong, nó có thể hơi nặng để đạt được điều này , so với giải pháp của simonrjones. – kander

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