2010-03-24 10 views
5

Podałem walidację w modelu. Ponadto, dałem pewne zatwierdzenie w kontrolerze w celu sprawdzenia kodu captcha. Następnie aplikacja nie wyświetla błędów sprawdzania poprawności modelu. Jeśli skomentuję kod kontrolera, sprawdzanie poprawności modelu działa poprawnie i wyświetla błędy. Obie nie działa ..Sprawdzanie poprawności cakephp z obu modeli i kontrolera

kod modelu (próbka)

class User extends AppModel { 

var $name = 'User'; 

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

}

kod Kontroler

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

}

Wymieniłem linię if ($this->User->save($this->data, array('validate' => 'only'))) z if ($this->User->validates()), a następnie również nie działa.

pomóż

Odpowiedz

11

Kod powinien pracować z if ($this->User->validates()). Niepoprawne zachowanie, z którym masz problem, polega na tym, że Model::save() resetuje element Model::validationErrors, zacierając niestandardowy błąd sprawdzania poprawności. Model::validates() nie, więc twoja konfiguracja podwójnego sprawdzania poprawności powinna działać.

Na przykład następujące funkcje poprawnie, w CakePHP 1.2.

Model:

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

Kontroler:

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

Widok:

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

Zgłoszony jak jest wyżej, pojawiają się błędy walidacji formularza poniżej obu polach, jednym warunkiem ze sterownika logika sprawdzania poprawności, druga z reguł sprawdzania poprawności modelu.

Największy problem, oczywiście, jest zamazywanie ról MVC przez kontrolowanie poprawności danych przez kontroler. Może warto rozważyć coś takiego:

Kontroler:

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

Model:

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

Teraz kontroler jest w błogiej niewiedzy o tym, jak dany model sprawdza swoje dane, a nawet, w jaki sposób dane są uporządkowane; a twoja walidacja formularza występuje w modelu.

Mam nadzieję, że to pomoże.

+4

Mówiąc o MVC, Model nie powinien zawierać pola captcha. UserModel nie powinien wiedzieć o "captcha". Do tej pory nie jestem w stanie znaleźć odpowiedniego, logicznego rozwiązania tego problemu. – hongster

+0

@hongster, to świetny punkt. Obecnie mam problem "sprawdzania poprawności", czy pole new_password pasuje do pola confirm_password. Jednak umieszczenie tej logiki w Modelu nie miałoby sensu. Jeśli chodzi o hasło, naprawdę sprawdzałoby się tylko na podstawie zasad dotyczących haseł. Dzięki za ustawienie mnie prosto. – rob5408

Powiązane problemy