Validare Un Campo, Ma Farlo Nell'intera Applicazione

Salve a tutti, vi sottopongo il mio problema. Utilizzo il modulo yii-user per le utenze,

l’autenticazione la faccio tramite un servizio wsdl, una volta che mi dice che l’utente è autenticato, io mi salvo nella mia tabella i campi che mi restituisce il servizio che ahimè non sono abbastanza per il funzionamento intero della mia app.

Ad ogni login controllo se il campo che mi interessa è stato selezionato dall’utente al momento del completamento del profilo, altrimenti lo dirotto nella view profile/edit (ma da lì l’utente è libero di uscire cliccando negli altri menu).

Tutto questo ovviamente funziona.

Ed ora veniamo alla questione:

io voglio poter controllare globalmente che questo campo è stato scelto dall’utente,

altrimenti lo dirotto nuovamente nella view suddetta.

Che strada mi consigliate?

"ahimè non sono abbastanza per il funzionamento intero della mia app" non puoi aumentarli?

no il webservice non dipende da me. e poi comunque quella è una impostazione che conosce l’utente non chi da il servizio.

Potresti estendere la classe WebUser e dotarla di un metodo che controlli la validità del profilo. Oppure usare i filters per controllare l’accesso di un intero controller. O anche semplicemente assegnare ad una porzione di sito un permesso che si può acquisire solo al completamento di quel form.

Sto già dotando WebUser di questo controllo, il problema è quando l’utente interagisce con diverse azioni di diversi controller. Volevo vedere se c’era un modo per estendere il controllo a livello di applicazione in generale, al posto di fare la stessa verifica per ogni controller interessato.

Quindi, prima di scrivere dell’altro codice ho preferito chiedere qui nel forum, magari qualcuno aveva affrontato

una questione similare.

mmm

forse nn ho capito w quindi hai già affrontato la cosa, ma non puoi semplicemente fare un user->setstate(‘parametro’,valore); e mettere in session il valore una volta che l’utente ha eseguito il form?

Se devi fare si che molti controlli devono fare cose in comune puoi agire in diversi modi. Se uso php5.4 puoi usare i traits, altrimenti puoi semplicemente creare una classe ponte tra Controller ed i controller che devi modificare.

Soluzione attuale,

in HomeController:




public function beforeAction($action)

{

   if(is_null(Yii::app()->user->campo_id)){

     Yii::app()->user->setFlash('error', 'Selezionare il campo richiesto.'); 

     $this->redirect(Yii::app()->createUrl('user/profile/edit'));

   }

   else

     return parent::beforeAction($action);

}



una possibilità è estendere Controller e metterci uno snippet di questo tipo, per non replicare il codice inutilmente. Voi che dite?

La mia filosofia è "se funziona, dico che va bene". Ma poi sono anche pignolo e ti dico che forse puoi scrivere anche in questo modo:

(non serve mettere l’else: il redirect termina con una die ed il codice successivo non verrà mai eseguito.)




public function beforeAction($action)

{

   if(is_null(Yii::app()->user->campo_id)){

     Yii::app()->user->setFlash('error', 'Selezionare il campo richiesto.'); 

     $this->redirect(Yii::app()->createUrl('user/profile/edit'));

   }


   return parent::beforeAction($action);

}