[Yii1] Problema Con Login Dopo La Verifica Di Un Parametro

Salve,

ho un azione nel controller “Cassa” (con omonima tabela) che serve per assegnare una cassa all’ operatore.

Questa azione, oltre ad inserire i dati nella propria tabella, inserisce anche l’ id della cassa nella tabella user all’ utente selezionato, facendo un update dell’ utente stesso.

Tutto questo funziona.

Il problema è, che se l’ utente è già connesso all’ applicazione, quando clicca su Cassa, nonostante la cassa gli sia già stata assegnata, non viene riconosciuto se prima non fa un logout e poi si ricollega.

L’ azione che mi verifica se l’ utente ha una cassa assegnata è questa e si trova in un’ altro Controller:




public function actionControllocassa()

	{

		User::model()->cassa_id=0; //valore di default

		Yii::app()->user->cassa_id=Yii::app()->user->cassa_id; //parametro che recupero grazie alla modifica di UserIdentity

		

	   		if(User::model()->cassa_id==Yii::app()->user->cassa_id){ //i parametri coincidono?

				$this->redirect('nocassa'); //i parametri non coincidono redirect alla vista

                      }else{

                $this->redirect('rs_step1'); //ok i parametri coincidono - redirect alla vista

				}

	}

	

	public function actionNocassa()

	{

		$model=new Missiva;

		$this->render('nessunaCassa');

	}



Come posso fare per far si che, anche se l’ utente è già connesso all’ applicazione, e gli viene assegnata una cassa non debba disconnettersi e riconnettersi?

Ho provato a crearmi delle sessioni durante l’ assegnazione della cassa ( dal Controller Cassa) ma quando le verifico nel controller che mi esegue il “ControlloCassa” non viene trovata la sessione. Forse perchè sono Controller diversi? Anche se credo di poter dire che questo non c’ entra…spero di non dire caxxate.

Grazie in anticipo per l’ aiuto!!!

non capisco… se hai già in sessione la cassa perchè queste righe?


        User::model()->cassa_id=0; //valore di default

		Yii::app()->user->cassa_id=Yii::app()->user->cassa_id; //parametro che recupero grazie alla modifica di UserIdentity




non ne capisco il senso…

io avrei scritto così…




public function actionControllocassa()

{

	if(isset(Yii::app()->user->cassa_id) && Yii::app()->user->cassa_id>0){

		$this->redirect('rs_step1'); //ok i parametri coincidono - redirect alla vista

	}else{

		$this->redirect('nocassa');

	}

}

public function actionNocassa()

{

	$model=new Missiva;

	$this->render('nessunaCassa');

}



Ciao proid, la cassa non la ho in sessione…o meglio non creo la sessione con




$session = new CHttpSession();

$session->open;

$session['MiaSessione']= "Cassa Assegnata";

...........................



Io praticamente all’ actionAssegnaCassa faccio si che mi faccia un’ update dell’ utente selezionato nel menu a tendina nella tabella User assegnandogli l’ id della cassa che ho gli ho assegnato.

Es:

Ho un utente chiamato Bruno e gli assegno la CASSA 1 (cassa_id = 2)

quindi all’ actionAssegnaCassa nella tabella user l’ utente Bruno avra il campo cassa_id = 2.

Quindi cercavo di fare una verifica, tramite User::model… per vedere se nella tabella user, a quel dato utente corrispondeva veramente l’ id della cassa assegnata. La verifica fatta come l’ ho fatta io funziona solo che non è istantanea. Praticamente se l’ utente è già connesso nel momento che gli sto assegnando la cassa, deve disconnettere e riconnettere per far si che Yii capisca che ha la cassa assegnata. Io volevo che invece NON dovesse disconnettersi in caso sia già connesso. Riesco a recuperare tramite Yii::app()->user->cassa_id l’ id della cassa perchè quando eseguo l’ actionAssegnaCassa come detto prima cambio il valore cassa_id di quell’ utente nella tabella usr. Ora cmq provo a fare come dici tu e vedo che succede. Ti aggiorno al volo e grazie della risposta.

Ecco anche facendo come dici tu devo comunque disconnettere e riconnettere. Uff…come posso evitare questo…mannaggia????

Facendo cosi il problema sorge nella chiusura. Infatti se chiudo la cassa ma l’ utente è ancora connesso, può comunque continuare a utilizzare quella cassa e infatti la vista rs_step1 continua a vederla anche se io ho chiuso quella cassa che quindi risulta non assegnata a nessun utente. Oddio questa cosa mi sta facendo perdere anni di vita !!!

quando parli di [color=#1C2837][size=2]Yii::app()->user->cassa_id vuol dire che stai usando la sessione o cookie quindi la cassa la tieni in sessione :)[/size][/color]

[size=“2”][color="#1c2837"]Se non vuoi usare la sessione allora in [/color][/size][size=2]actionControllocassa carica il model del’user e vedifica cassa_id ma non con [/size][color=#660066][size=2]User[/size][/color][color=#666600][size=2]::[/size][/color][size=2]model[/size][color=#666600]size=2->[/size][/color][size=2]cassa_id[/size][color=#666600][size=2]=[/size][/color][color=#006666][size=2]0[/size][/color][color=#666600][size=2]; (che non so cosa faccia… parametro statico della classe User?) ma usa [/size][/color][color=#660066][size=2]User[/size][/color][color=#666600][size=2]::[/size][/color][size=2]model[/size][color=#666600]size=2->findByPk(id)[/size][/color]

[color=#1C2837][size=2]

[/size][/color]

Si scusa facevo casini da solo a quanto pare. Hai ragione infatti l’ id della cassa se non disconetto e riconnetto NON si aggiorna anche se gliel’ assegno.




if(Yii::app()->user->username=='proid') echo "Hello me!"; else echo "Proid";

ma cosi come verifico che l’ utente che è connesso ha veramente una cassa assegnata? E che possa usare solo quella cassa? da dove ricavi l’ id della cassa? Sempre come faccio io con Yii::app()->user->cassa_id…visto che quando l’ utente si logga riesco a recuperare comunque quel parametro e a portarmelo dietro per tutte le sessioni nelle quali si loggherà?

Al posto di proid cosa dovrei mettere? :( Oddio mi sa che mi sono perso !!!

non ho ben chiaro il tuo problema della gestione delle casse.

Mi sembra di capire che le casse sono dei contenitori che possono essere assegnati solo ad un utente alla vola quindi se c’è un altro utente collegato sulla cassa X, nessun’altro la può usare fin quando l’utente che ce l’ha non fa logout liberandola.

In questo caso non devi gestire SOLO in sessione la cassa ma anche lato server quindi forse dovresi farti una tabella che gesisce le casse con un campo cassa_id, user_id, timestamp_start, timestamp_stop, timestamp_last_post per tracciare le casse in uso (con timestamp_stop nullo) e quelle libere ([size=“2”](con timestamp_stop NON nullo) e da quanto tempo gli utenti non usanol’applicazione ([/size][size=“2”]timestamp_last_post[/size][size=“2”] )[/size]

Poi dovresti gestire il flusso dell’applicazione così:

User A : login

-verifico la tabella delle casse e controllo se c’è una cassa a me assegnata non rilasciata [size=“2”](con timestamp_stop nullo)… succede se la sessione va in timeout… in quel caso memorizzo in sessione la cassa_id ‘appesa’ … diversamente cerco la prima cassa libera, la assegno all’utente registrando un nuovo record nella tabella delle casse e memorizzo in sessione la nuova cassa_id[/size]

[size="2"]Dovrai anche gestire il caso in cui tutte le casse rimangano occupate perchè gli utenti non fanno logoff[/size]

[size=“2”]Per evitare questo problema, se tutte le casse risultano occupate dovrai verificare nelle casse in uso se il valore [/size][size=“2”]timestamp_last_post[/size][size=“2”] supera il valore massimo di vita della sessione, in tal caso si tratta di cassa ‘appesa’ e devi prima liberarla compilando il campo [/size][size=“2”]timestamp_stop del record che tratteneva la cassa e creando il nuovo record di presa in carico della cassa.[/size]

[size="2"]Ad ogni POST[/size]

[size="2"]-uso direttamente la casa_id che ho in sessione senza controllare il database[/size]

[size="2"]-aggiorno il campo [/size][size="2"]timestamp_last_post[/size][size="2"] della mia cassa nel database[/size]

[size="2"]Al logoff[/size]

[size="2"]-libero la cassa registrando il campo [/size][size="2"]timestamp_stop[/size]

ciao

Ciao proid e grazie dell’ aiuto. Ti spiego un po il funzionamento dell’ applicazione che non è proprio come dici tu :slight_smile:

L’ applicazione consente a un utente che ha il ruolo di direttore di assegnare una cassa a ogni operatore.

La cassa NON deve liberarsi anche se l’ utente fa il logout perchè quell’ utente avrà quella cassa assegnata finchè il direttore non chiude la cassa all’ ora di chiusura… Un po come si lavora con le casse dei supermercati etc. Finchè non si chiude la cassa, la stessa continua a lavorare assegnata a quel determinato operatore.

Quindi dicevo, il direttore la mattina all’ apertura dell’ attività assegna una cassa a ogni suo dipendente, fino all’ orario che decide lui (Es: dalle 08:00 alle 13:00). La sera, prima di chiudere l’ attività, il direttore chiude e quadra tutte le casse.

Ecco perchè voglio verificare che ogni utente nel campo cassa_id abbia una cassa assegnata e verifico che cassa_id (della tabella user) sia uguale a cassa_id (della tabella cassa) perchè nella tabella cassa, a ogni cassa, ho un nome utente, un’ id utente etc. Tutto questo perchè a ogni operazione la cassa visualizzerà solo le operazioni dell’ utente alla quale è assegnata, in maniera tale che lo stesso possa vedere a video quanto resto deve dare in base a quanto il cliente gli ha dato, etc etc. Tutto questo per far si che si possa quadrare la cassa al momento della chiusura. Ti Ringrazio per il suggerimento che rileggerò per capire se posso applicarlo alla mia applicazione e sopprattutto come applicarlo :D … sai sono nuovo di Yii. :) Un Saluto e se hai qualche link nel quale posso leggere qualche metodo per applicare ciò che mi hai detto, mi farebbe piacere leggere e imparare. Grazie ancora proid

In questo caso l’assegnazione della cassa e la liberazione della stessa si sposta al direttore il resto rimane invariato.

Credo che il mio post adattato a quello che mi hai detto diventi così… vedi se ti può essere utile

[color="#1C2837"][size="3"]Dovresi farti una tabella che gestisce le casse con i campi:[/size][/color]

[color="#1C2837"][size="3"]-cassa_id[/size][/color]

[color="#1C2837"][size="3"]-user_id[/size][/color]

[color="#1C2837"][size="3"]-timestamp_start (presa in carico cassa)[/size][/color]

[color="#1C2837"][size="3"]-timestamp_stop (liberazione cassa)[/size][/color]

[color="#1C2837"][size="3"]…per tracciare le casse in uso (con timestamp_stop nullo) e quelle libere ([/size][/color][size="2"][color=#1C2837]con timestamp_stop >0)[/color][/size].

[color="#1C2837"][size=“3”]Poi dovresti gestire il flusso dell’applicazione così:[/size][/color]

Direttore : assegna casse

-creare una videata che elenca gli user, evidenzia la cassa assegnata (left outer join user/cassa quando [color="#1C2837"][size="3"]timestamp_stop>0) e permette di assegnare la cassa creando un nuovo record nella tabella o libera la cassa assegnando il valore a [/size][/color][color="#1C2837"][size="3"]timestamp_stop [/size][/color]

[color="#1C2837"] [/color]

User A : login

[color="#1C2837"][size=“3”]-verifico la tabella delle casse e controllo se c’è una cassa a me assegnata non rilasciata [/size][/color][color="#1C2837"][size=“2”](con timestamp_stop nullo)… in quel caso memorizzo in sessione la cassa_id … diversamente redirezione alla videata che avvisa “cassa assente, rivolgersi al direttore”[/size][/color]

[color="#1C2837"] [/color]

[color="#1C2837"][size="2"]Ad ogni POST[/size][/color]

[color="#1C2837"][size="2"]-uso direttamente la casa_id che ho in sessione senza controllare il database[/size][/color]

[color="#1C2837"] [/color]

[color="#1C2837"][size="2"]A fine giornata il direttore libera le casse usando la videata dedicata registrando nella tabella delle casse il valore [/size][/color][color="#1C2837"][size="2"]timestamp_stop[/size][/color]

[color="#1c2837"][size=2]

[/size][/color]Requisito fondamentale è che il direttore liberi le casse solo dopo che gli operatori hanno smesso di usarle altrimenti devi fare ad ogni post la verifica che non sia cambiata l’assegnazione della cassa nel db

ciao

Ciao proid e innanzitutto un grazie IMMENSO perchè questo tuo post è una nuova guida per me. Alla tabella che univa le altre due come detto ci avevo pensato e l’ avevo crata :)

Ma purtroppo non riuscivo a farla funzionare perchè come scritto nel post sono novizio per quanto riguarda Yii (circa 4 mesi di apprendistato all’ attivo :D ).

Quindi le verifiche che tu mi scrivi non saprei come usarle nel controller del login, anche per quanto riguarda il left outer join user/cassa quando timestamp_stop>0.

Io nella videata ho le casse. Quindi seleziono la cassa che voglio assegnare. Nella videata mi mostra la cassa con un dropdown degli utenti facenti parte di quell’ attività (o “negozio” se preferisci). Poi ho dei campi aggiuntivi dove inserisco orario di apertura e di chiusura della cassa. In automatico poi mi genero la data con


$model->data_apertura=new CDbExpression('NOW()');

e lo stesso faccio quando faccio la chiusura rigenerandomi la data chiusura e inserendo automaticamente anche l’ orario di chiusura. Questa è attualmente la mia videata per l’ assegnazione della e ti allego uno screenshot.

Incornicerò questo post in attesa di capire come realizzare ciò che dici. Quindi ancora grazie per il tempo che mi hai dedicato :) . Un Saluto