2010-03-24 14 views
5

Ho dato la convalida nel modello. Inoltre, ho dato qualche convalida in controller per verificare il codice captcha. Successivamente, l'applicazione non visualizza gli errori di convalida del modello. Se commento il codice del controller, la validazione del modello funziona correttamente e mostra gli errori. Entrambi non lavora ..convalida cakephp da entrambi i modelli e controller

Codice modello (campione)

class User extends AppModel { 

var $name = 'User'; 

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

}

Controller cod

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

}

ho sostituito la linea if ($this->User->save($this->data, array('validate' => 'only'))) con if ($this->User->validates()), poi inoltre non funziona.

si prega di aiutare

risposta

11

Il codice dovrebbe funzionare con if ($this->User->validates()). Il comportamento errato in cui si verificano problemi è dovuto al fatto che Model::save() reimposta il membro Model::validationErrors, cancellando l'errore di convalida personalizzato. Model::validates() no, quindi la configurazione di doppia convalida dovrebbe funzionare.

Ad esempio, in CakePHP 1.2, le seguenti funzioni funzionano correttamente.

Modello:

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

Controller:

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

Vista:

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

Inserito come-è al di sopra, gli errori di convalida modulo appaiono sotto entrambi i campi, uno fornito dal controller del logica di validazione, l'altra dalle regole di validazione del modello.

Il problema più grande, ovviamente, sta confondendo i ruoli MVC avendo il controller che gestisce alcuni dati di convalida. Si potrebbe prendere in considerazione qualcosa di simile:

Controller:

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

Modello:

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

Ora il controller è beatamente ignaro di come il vostro modello di convalida i suoi dati, e anche di come il i dati sono strutturati; e la convalida del modulo si verifica tutto nel modello.

Spero che questo aiuti.

+4

Parlando di MVC, il modello non dovrebbe avere un campo captcha. UserModel non dovrebbe essere a conoscenza di "captcha". Fino ad ora, non sono riuscito a trovare una soluzione logica adatta a questo problema. – hongster

+0

@hongster, questo è un grande punto. Attualmente sto riscontrando un problema nel "convalidare" se un campo new_password corrisponde a un campo confirm_password. Tuttavia, mettere questa logica nel modello non avrebbe senso. Per quanto riguarda la password, in realtà verrebbe solo convalidata rispetto alle regole della password. Grazie per avermi sistemato. – rob5408

Problemi correlati