2010-08-28 15 views
6

Estaba tratando de validar mis datos de modelo de usuario y me encontré con este problema.¿Cómo usar solo ciertos conjuntos de validación para validar datos en Cake PHP?

decir que tengo las siguientes reglas de validación, almacenados en la variable $ validar:

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ... 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ... 
      ) 
     ), 
     //rules for other fields 
    ); 

En el controlador UsersController, tengo dos acciones: Register() y login(). El problema es, ¿cómo validar el campo de nombre de usuario en la acción register() utilizando SOLAMENTE la regla usernameCheckForRegister, y cómo validar el campo de nombre de usuario en la acción de inicio de sesión(), usando la otra regla, usernameCheckForLogin? ¿Hay algún comportamiento o método en CakePHP que me permita elegir qué conjunto de reglas aplicar a un campo de formulario al validar?

Gracias de antemano por su ayuda!

+0

Mis preguntas serían por qué te gustaría para validar el nombre de usuario al iniciar sesión? Al iniciar sesión, la única pregunta que debe responderse es "¿este nombre de usuario con esta contraseña existe en la base de datos?" No debería importar si el nombre de usuario es válido o no. Si no lo es, el inicio de sesión fallará porque el nombre de usuario no existe de todos modos. – deceze

+0

La razón por la que quisiera validar el nombre de usuario al iniciar sesión es porque también estoy usando una validación del lado del cliente, que le indicará al usuario si dejó el campo de nombre de usuario vacío o no. – linkyndy

+0

Lo sentimos, todavía no lo entiendo. :) Un mensaje genérico de "Información de inicio de sesión inválida" debería ser suficiente, posiblemente incluso mejor. Los ajustes de validación del modelo Cake son para garantizar que solo los datos validados se guarden en la base de datos. Sin embargo, cuando inicia sesión, no está guardando nada en la base de datos, por lo que no debe usar las reglas de validación. Si solo desea advertir al usuario sobre una entrada vacía, hágalo de forma directa sin utilizar las reglas de validación de modelos. – deceze

Respuesta

8

Creo que revisé la solución que se ajusta a mis necesidades.

http://bakery.cakephp.org/articles/view/multivalidatablebehavior-using-many-validation-rulesets-per-model

En lugar de definir varias reglas para cada campo, este comportamiento implica definir varias reglas "generales" en las que se definen todas las reglas relacionadas con el campo.

Así, en lugar de hacerlo:

var $validate=array(
    "username" => array(
     "usernameCheckForRegister" => array(
      "rule" => ..., 
      "message" => ... 
     ), 
     "usernameCheckForLogin" => array(
      "rule" => ..., 
      "message" => ... 
     ) 
    ), 
    //rules for other fields 
); 

que hacer:

/** 
* Default validation ruleset 
*/ 
var $validate = array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */ 
    ); 

/** 
* Custom validation rulesets 
*/ 
var $validationSets = array(
    'register' => array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */, 
    ), 
    'login' => array(
     'username' => /* rules */, 
     'password' => /* rules */ 
    ) 
); 

Y luego, en su controlador permite alternar entre conjuntos de validación de la siguiente manera: $this->User->setValidation('register');

A pesar de que usted tiene que escribir un poco más de código, creo que esta solución se ajusta mejor a mis necesidades

+0

si ese tipo de solución también existe para la regla bindig por acción? –

0

Comprobar la manual: ACTUALIZACIÓN

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "create" 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "update" 
      ) 
     ), 
     //rules for other fields 
    ); 

: Oh ... Sólo se dio cuenta de que parece imposible de usar regla de validación de inicio de sesión a menos que actualice el usuario en cada intento de inicio de sesión. Puede modificar el método login() para verificar el nombre de usuario en su lugar.

+0

Gracias por su respuesta. Aún así, no creo que sea una solución limpia. Prefiero buscar algo como $ this-> use ValidationRule ("usernameCheckForRegister"); – linkyndy

0

Es una solución algo torpe, pero acabo de desarmar las que no uso dentro del controlador. Podría ser complicado, pero para un simple inicio de sesión/registro, hace el truco.

unset($this->User->validate['username']['usernameCheckForRegister']); 
+0

La solución funciona, pero preferiría algo más flexible, ya que usaré muchos conjuntos de reglas de validación. – linkyndy

Cuestiones relacionadas