Trang

Thứ Năm, 18 tháng 7, 2013

Zend_Form kết hợp với Validate và Filter [Zend Framework]

Zend Form hỗ trợ chúng ta các hàm dựng sẵn để kiểm tra hay lọc dữ liệu đầu vào. Điều này giúp ta thuận lợi hơn trong việc kiểm tra dữ liệu trước khi lưu vào cơ sở dữ liệu.
1. Trong thư mục forms ta tạo một file tên login.php

<?php
class Form_Login extends Zend_Form
 {
      public function init()
       {
             // Cac Form Element
       }
 }

2. Trong function init ta tiến hành tạo các form element kết hợp với validate và filter

Username Element:

//Username
$this->addElement('text','username',array(
                                     'label'=>'Username',
                                     'size'=>21,
                                      ));
$username = $this->getElement('username');
//Validate

//NotEmpty
$username->setRequired(true)
        ->addValidator('NotEmpty',true)
        ->getValidator('NotEmpty')->setMessage('Username không được bỏ trống.');

//Khong co dau, khoảng trắng và các kí tự đặc biệt
$username->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/'))
        ->getValidator('Regex')->setMessage('Username không hợp lệ.'); //vì là Login nên để không hợp lệ
            
 //Filter
 $username->addFilter('Stringtrim')
        ->addFilter('StringToLower');
 //End Username

Đoạn code trên, đầu tiên ta add thành phần username vào, sau đó ta tiến hành validate và filter thành phần đó. Ta không cần addValidator Alnum vì ta đã có Validator Regex rồi. Ở đây Zend sẽ kiểm tra hợp lệ cả hai trường hợp, cho dù trường hợp đầu không hợp nhưng Zend vẫn kiểm tra trường hợp sau, điều này là dư thừa nếu chúng ta chỉ quan tâm đến kết quả hợp lệ hay không hợp lệ. Chúng ta chỉ muốn là chỗ nào không hợp lệ thì chỉ thông báo lỗi ở chỗ đó. Để khắc phục lỗi trên ta thêm tham số thứ hai true vào hàm addValidator ở mỗi validator muốn ngắt.

Password Element
//Password
$this->addElement('password','password',array(
                                             'label'=>'Password',
                                             'size'=>21
                                              ));
$password=$this->getElement('password');
//Validate

//NotEmpty
$password->setRequired(true)
         ->addValidator('NotEmpty')
         ->getValidator('NotEmpty')->setMessage('Password không được bỏ trống');
             
//Khong co dau, khoảng trắng và các kí tự đặc biệt
$password->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/'))
         ->getValidator('Regex')->setMessage('Password không hợp lệ.');
            
//Filter
$password->addFilter('StringTrim')
         ->addFilter('StringToLower');
//End password

3. Trong Controller
public function loginAction()
 {
     $formLogin= new Form_Login(array('name'=>'formLogin','id'=>'formLogin','action'=>'','method'=>'post'));

     // Neu Submit
     if( $this->_request->getPost('login') )
      {
          // Validate     
          if( $formLogin->isValid($this->_request->getPost()) )
           {
                // Hợp lệ
                // Lấy giá trị từ form
                $arrayData=$formLogin->getValues();
                // Tới đây có thể sử dung Zend_Auth để chứng thực đăng nhập
           }else{
                     // Không hợp lệ 
                  }
      }
    
      $this->view->formLogin=$formLogin;
 }

Chú ý: Để lấy giá trị từ form đã được Validate và Filter ta sử dụng
$arrayData=$form->getValues();

4. Trong view
<?php
echo $this->formLogin;
?>

Nguồn: Sưu tầm Internet

2 nhận xét:

  1. cho mình hỏi tại sao mình tạo 1 form mới thì validate được, còn khi tạo 1 form có truyền biến vào, như sửa sản phẩm chẳng hạn, thì phải load 1 số thông tin cũ vào thì lại không validate được? chờ bạn giúp... thanks nhiều

    Trả lờiXóa
    Trả lời
    1. Vì thành phần form của bạn , nếu bạn muốn sữa xóa đc thì ko nên để nó ở init() , bản chất init() nó như hàm _construct() nó sẽ chạy khi request bạn để 1 phương thức riêng do bạn tự đặt .

      Xóa