2010-03-24 22 views
5

Ich habe Validierung im Modell gegeben. Außerdem habe ich im Controller eine Überprüfung gegeben, um den Captcha-Code zu überprüfen. Danach zeigt die Anwendung die Modellvalidierungsfehler nicht mehr an. Wenn ich den Controllercode kommentiere, funktioniert die Modellvalidierung einwandfrei und zeigt die Fehler an. Beide nicht funktioniert ..cakephp Validierung von beiden Modell und Controller

Modellcode (Probe)

class User extends AppModel { 

var $name = 'User'; 

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

}

Controller-Code

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

}

ich die if ($this->User->save($this->data, array('validate' => 'only'))) Linie mit if ($this->User->validates()) ersetzt haben, dann es funktioniert auch nicht.

bitte helfen

Antwort

11

Der Code sollte mit if ($this->User->validates()) arbeiten. Das falsche Verhalten, mit dem Sie Probleme haben, liegt darin, dass Model::save() das Model::validationErrors-Mitglied zurücksetzt und Ihren benutzerdefinierten Validierungsfehler auslöscht. Model::validates() nicht, also sollte Ihre Dual-Validierung-Setup funktionieren.

Zum Beispiel funktioniert das folgende korrekt unter CakePHP 1.2.

Modell:

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

Ausblick:

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

Übermittelt oben, wie sie ist, Formularvalidierung Fehler unterhalb der beiden Felder erscheinen, eine von der der Steuerung zur Verfügung gestellt Validierungslogik, die anderen aus den Validierungsregeln des Modells.

Das größere Problem ist natürlich, die MVC-Rollen matschig, indem der Controller eine Datenvalidierung behandelt. Man könnte so etwas betrachten wollen:

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

Modell:

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

Jetzt ist Ihr Controller ist völlig ahnungslos, wie Ihr Modell seine Daten überprüft, und sogar, wie die Daten sind strukturiert; und Ihre Formularüberprüfung findet im Modell statt.

Hoffe, das hilft.

+4

Apropos MVC, das Modell sollte kein Captcha-Feld haben. UserModel sollte nicht auf "Captcha" achten. Bis jetzt kann ich keine geeignete, logische Lösung für dieses Problem finden. – hongster

+0

@hongster, das ist ein toller Punkt. Ich habe derzeit ein Problem "validieren", ob ein Feld new_password einem Feld confirm_password entspricht. Es wäre jedoch nicht sinnvoll, diese Logik in das Modell aufzunehmen. In Bezug auf das Passwort würden Sie nur gegen Ihre Passwortregeln validieren. Danke, dass du mich richtig gestellt hast. – rob5408

Verwandte Themen