2010-03-24 27 views
5

Tôi đã xác thực trong mô hình. Ngoài ra, tôi đã đưa ra một số xác nhận trong bộ điều khiển để kiểm tra mã captcha. Sau đó, ứng dụng không hiển thị lỗi xác thực mô hình. Nếu tôi nhận xét mã điều khiển, xác thực mô hình đang hoạt động tốt và hiển thị lỗi. Cả hai không làm việc ..xác thực CakePHP từ cả mô hình và bộ điều khiển

đang Model (mẫu)

class User extends AppModel { 

var $name = 'User'; 

var $validate = array(
    'username' => 'notempty', 
    'firstname' => 'notempty' 
    ); 

}

điều khiển đang

if (!empty($this->data)) { 

$this->User->set($this->data); 
$this->User->create(); 
$captcha = $this->Session->read('CAPTCHA_CODE'); 

if (strtolower($captcha) != strtolower($this->data['User']['captcha'])) 
{ 
    $this->User->invalidate('captcha', __('Sorry, your entry did not match', true)); 
} 

if ($this->User->save($this->data, array('validate' => 'only'))) 
{ 
    if ($this->User->save($this->data, array('validate' => 'false'))) { 
     $this->Session->setFlash(__('Registered successfully', true)); 
     $this->redirect('success'); 
    } 
}else { 
    $this->Session->setFlash(__('Please, try again.', true)); 
} 

}

tôi đã thay thế dòng if ($this->User->save($this->data, array('validate' => 'only'))) với if ($this->User->validates()), sau đó nó cũng không hoạt động.

hãy giúp

Trả lời

11

Mã của bạn nên hoạt động với if ($this->User->validates()). Hành vi không chính xác mà bạn gặp phải sự cố là vì Model::save() đặt lại thành viên Model::validationErrors, xóa bỏ lỗi xác thực tùy chỉnh của bạn. Model::validates() không, vì vậy thiết lập xác thực kép của bạn sẽ hoạt động.

Ví dụ, các chức năng sau đây chính xác, trong CakePHP 1.2.

mẫu:

class User extends AppModel 
{ 
    var $validate = array(
     'my_other_field' => array(
      'rule' => 'notEmpty', 
      'message' => 'This field should not be empty.' 
     ) 
    ); 
} 

Bộ điều khiển:

class UsersController extends AppModel 
{ 
    function add() 
    { 
     if (! empty($this->data)) { 
      $this->User->set($this->data); 

      if ('foo' != $this->data['User']['my_field']) { 
       $this->User->invalidate('my_field', 'Should be "foo".'); 
      } 

      if ($this->User->validates()) { 
       $this->flash('Form validated correctly.'); exit; 
      } 
     } 
    } 
} 

Xem:

<?php echo $form->create('User', array('action'=>'add')); ?> 
<?php echo $form->input('User.my_field', array('value'=>'bar')); ?> 
<?php echo $form->input('User.my_other_field', array('value'=>'')); ?> 
<?php echo $form->end('Submit'); ?> 

Submitted như nó vốn có ở trên, lỗi xác nhận hình thức xuất hiện dưới cả hai lĩnh vực, một trong những cung cấp từ bộ điều khiển của logic hợp lệ, cái kia từ các quy tắc xác thực của mô hình.

Vấn đề lớn hơn, tất nhiên, là làm lu mờ vai trò MVC bằng cách để bộ điều khiển xử lý một số xác thực dữ liệu. Bạn có thể muốn xem xét một cái gì đó như thế này:

Bộ điều khiển:

class UsersController extends AppController 
{ 
    function add() 
    { 
     if (! empty($this->data)) { 

      $captcha = $this->Session->read('CAPTCHA_CODE'); 
      $this->User->setCaptchaCheck($captcha); 

      if ($this->User->save($this->data, array('validate'=>true))) { 
       $this->Session->setFlash('Success'); 
       $this->redirect('success',303,true); 
      } 
     } 
    } 
} 

mẫu:

class User extends AppModel 
{ 
    var $captchaCheck = ''; 

    var $validates = array(
     'captcha' => array(
      'matchesCheck' => array(
       'rule' => array('matchesCaptchaCheck', 'captchaCheck'), // second value of array should match class member-name above 
       'message' => "CAPTCHAs don't match." 
      ) 
     ) 
    ); 

    function matchesCaptchaCheck($data, $checkVar) 
    { 
     $data = reset(array_values($data)); // I don't need to know the field name now. 

     return low($data) == low($this->{$checkVar}); 
    } 

    function setCaptchaCheck($captcha) 
    { 
     $this->captchaCheck = $captcha; 
    } 
} 

Bây giờ điều khiển của bạn là blissfully không biết gì về cách mô hình của bạn xác nhận dữ liệu của nó, và thậm chí như thế nào dữ liệu được cấu trúc; và việc xác thực biểu mẫu của bạn đều xảy ra trong mô hình.

Hy vọng điều này sẽ hữu ích.

+4

Phát biểu của MVC, Mô hình không được có trường hình ảnh xác thực. UserModel không nên biết "captcha". Cho đến bây giờ, tôi không thể tìm ra giải pháp hợp lý, phù hợp cho vấn đề đó. – hongster

+0

@hongster, đây là một điểm tuyệt vời. Tôi hiện đang gặp sự cố "xác thực" liệu trường new_password có khớp với trường confirm_password hay không. Tuy nhiên việc đặt logic này trong Mô hình sẽ không có ý nghĩa. Liên quan đến mật khẩu bạn thực sự sẽ chỉ được xác nhận đối với các quy tắc mật khẩu của bạn. Cảm ơn cho tôi đặt thẳng. – rob5408

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