2010-03-24 3 views
5

Я дал подтверждение в модели. Кроме того, я дал некоторую проверку в контроллере для проверки кода captcha. После этого приложение не отображает ошибки проверки модели. Если я прокомментирую код контроллера, проверка модели работает нормально и отображает ошибки. Оба не работают ..проверка cakephp как с модели, так и с контроллера

код модели (образец)

class User extends AppModel { 

var $name = 'User'; 

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

}

Код контроллера

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

}

я заменил if ($this->User->save($this->data, array('validate' => 'only'))) линию if ($this->User->validates()), затем также он не работает.

пожалуйста, помогите

ответ

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, поскольку контроллер обрабатывает некоторую проверку данных. Вы могли бы хотеть рассмотреть что-то вроде этого:

Контроллер:

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

Смежные вопросы