2010-08-28 15 views
6

Stavo provando a convalidare i dati del mio modello utente e mi sono imbattuto in questo problema.Come utilizzare solo determinati set di convalida per la convalida dei dati in Cake PHP?

dire che ho le seguenti regole di convalida, memorizzato nella variabile $ validate:

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

Nel controllore UsersController, ho due azioni: registrare() e il login(). Il problema è: come convalido il campo username nell'azione register() utilizzando SOLO la regola usernameCheckForRegister e come convalido il campo username nell'azione login(), utilizzando l'altra regola, usernameCheckForLogin? C'è un comportamento o un metodo in CakePHP che mi consente di scegliere quale serie di regole applicare a un campo modulo durante la convalida?

Grazie in anticipo per il vostro aiuto!

+0

Le mie domande sarebbero il motivo per cui si desidera convalidare il nome utente al momento dell'accesso? Al momento dell'accesso, l'unica domanda a cui si deve rispondere è "questo nome utente con questa password esiste nel database?" Non dovrebbe importare se il nome utente è valido o meno. Se non lo è, l'accesso fallirà perché il nome utente non esiste comunque. – deceze

+0

Il motivo per cui vorrei convalidare il nome utente al momento dell'accesso è perché sto utilizzando anche una convalida sul lato client, che dirà all'utente se ha lasciato o meno il campo del nome utente vuoto. – linkyndy

+0

Scusa, ancora non lo capisco. :) Un messaggio generico di "Informazioni di accesso non valide" dovrebbe essere sufficiente, forse anche migliore. Le impostazioni di convalida del modello di torta assicurano che solo i dati convalidati vengano salvati nel database. Durante l'accesso, tuttavia, non stai salvando nulla nel database, quindi non dovresti utilizzare le regole di convalida. Se vuoi solo avvisare l'utente di un input vuoto, fallo direttamente senza utilizzare le regole di validazione dei modelli. – deceze

risposta

8

Penso di aver trovato la soluzione adatta alle mie esigenze.

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

Invece di definire alcune regole per ciascun campo, questo comportamento implica la definizione di alcune regole "generiche" sotto il quale si definiscono tutte le regole dei campi correlati.

Così, invece di fare:

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

fare:

/** 
* 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 */ 
    ) 
); 

E poi nel controller di alternare tra le serie di validazione in questo modo: $this->User->setValidation('register');

Anche se si deve scrivere un po 'più di codice, penso che questa soluzione si adatta meglio alle mie esigenze

+0

se esiste anche questo tipo di soluzione per la regola di bindig per azione? –

0

Controllare il manual:

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

UPDATE: Oh ... Ho appena notato che sembra impossibile da usare regola di convalida su login a meno che non si aggiorna l'utente ad ogni tentativo di accesso. È possibile modificare il metodo login() per verificare invece il nome utente.

+0

Grazie per la risposta. Tuttavia, non penso che sarà una soluzione pulita. Stavo cercando qualcosa come $ this-> useValidationRule ("usernameCheckForRegister"); – linkyndy

0

Bit di una soluzione goffa, ma ho appena disattivato quelli che non uso dal controller. Potrebbe essere complicato ma per un semplice login/registrarsi fa il trucco.

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

La soluzione funziona, ma preferirei qualcosa di più flessibile, poiché userò molti set di regole di convalida. – linkyndy

Problemi correlati