2010-03-24 5 views
5

모델에서 유효성을 검사했습니다. 또한, 나는 captcha 코드를 검사하기 위해 컨트롤러에서 몇 가지 유효성을 검사했다. 그런 다음 응용 프로그램이 모델 유효성 검사 오류를 표시하지 않습니다. 컨트롤러 코드에 주석을 달면 모델 유효성 검사가 제대로 작동하고 오류가 표시됩니다. 그때 if ($this->User->validates())으로 if ($this->User->save($this->data, array('validate' => 'only'))) 라인을 교체 한모델과 컨트롤러 모두에서 cakephp 확인

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

}

모두하지 작업 ..

모델 코드 (샘플)

class User extends AppModel { 

var $name = 'User'; 

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

}

컨트롤러 코드, 또한 작동하지 않습니다.

답변

11

당신의 코드가 if ($this->User->validates())와 함께 작동합니다 도와주세요. 문제가있는 잘못된 동작은 Model::save()Model::validationErrors 구성원을 재설정하고 사용자 지정 유효성 검사 오류를 삭제하기 때문입니다. Model::validates()이 아니므로 이중 유효성 검사 설정이 작동해야합니다.

예를 들어 다음 기능은 CakePHP 1.2에서 올바르게 작동합니다.

모델 :

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

이 컨트롤러 :

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

보기 :

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

양식 유효성 검사 오류가 두 필드 아래에 나타납니다, 위의있는 그대로 제출, 하나에서 제공하는 컨트롤러의 유효성 검증 로직, 모델 유효성 검사 규칙의 다른 하나.

물론 큰 문제는 컨트롤러가 일부 데이터 유효성 검사를 처리하도록하여 MVC 역할을 muddying하는 것입니다. 이 같은 것을 고려할 수 있습니다 :

컨트롤러 :

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

모델 :

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

이제 컨트롤러는 심지어 방법, 모델이 데이터를 검증하는 방법의 행복하게 무지하다 데이터가 구조화됩니다. 폼 유효성 검사가 모두 모델에서 발생합니다.

희망이 도움이됩니다.

+4

MVC와 관련하여 모델에는 captcha 필드가 없어야합니다. UserModel은 "captcha"를 인식하지 않아야합니다. 지금까지, 나는 그 문제에 대한 적절한, 논리적 인 해결책을 찾지 못했습니다. – hongster

+0

@hongster, 이것은 좋은 지적입니다. new_password 필드가 confirm_password 필드와 일치하는지 여부를 "확인하는"문제가 있습니다. 그러나이 논리를 모델에 넣는 것은 의미가 없습니다. 암호와 관련하여 암호 규칙에 대해서만 유효성을 검사합니다. 나를 똑바로 세워 줘서 고마워. – rob5408

관련 문제