2010-03-24 14 views
5

He dado validación en el modelo. Además, he dado alguna validación en el controlador para verificar el código captcha. Después de eso, la aplicación no muestra los errores de validación del modelo. Si comento el código del controlador, la validación del modelo funciona bien y muestra los errores. Tanto que no trabaja ..validación cakephp de modelo y controlador

Código modelo (muestra)

class User extends AppModel { 

var $name = 'User'; 

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

}

código del controlador

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

}

he sustituido la línea if ($this->User->save($this->data, array('validate' => 'only'))) con if ($this->User->validates()), a continuación, también no está funcionando.

favor ayuda

Respuesta

11

El código debería trabajar con if ($this->User->validates()). El comportamiento incorrecto con el que tiene problemas es porque Model::save() restablece el miembro Model::validationErrors, borrando su error de validación personalizado. Model::validates() no, por lo que su configuración de doble validación debería funcionar.

Por ejemplo, las siguientes funciones funcionan correctamente, en CakePHP 1.2.

Modelo:

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

controlador:

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

Enviado tal cual anteriormente, los errores de validación de formularios aparecen por debajo de los dos campos, uno siempre desde el controlador de la lógica de validación, la otra de las reglas de validación del modelo.

El problema más amplio, por supuesto, es enturbiar los roles de MVC al tener el controlador manejando algunos datos de validación. Es posible que desee considerar algo como esto:

controlador:

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

Modelo:

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

Ahora su controlador es felizmente ignorante de cómo su modelo valida sus datos, e incluso de cómo el los datos están estructurados; y la validación de su formulario ocurre en el modelo.

Espero que esto ayude.

+4

Hablando de MVC, el Modelo no debería tener un campo de captcha. UserModel no debe tener conocimiento de "captcha". Hasta ahora, no puedo encontrar una solución lógica adecuada para ese problema. – hongster

+0

@hongster, este es un gran punto. Actualmente tengo un problema para "validar" si un campo new_password coincide con un campo confirm_password. Sin embargo, poner esta lógica en el Modelo no tendría sentido. En cuanto a la contraseña, solo estarías validando tus reglas de contraseña. Gracias por corregirme. – rob5408

Cuestiones relacionadas