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