Memorizzare le visite

Ciao a tutti, sarà che sono passate un pò di ore dall’ultima pausa ma ho questa domanda da farvi.

Ma se voglio fare in modo di monitorare la visita dell’utente dove lo piazzo il codice?

Mi spiego meglio all’interno della mia applicazione si può entrare da diverse pagine e da diversi indirizzi.

A seconda di dove arrivo devo fare alcune operazioni (ma questo è successivo), perciò devo memorizzarmi nel Db l’ingresso del nuovo visitatore con il suo referrer ed altre info.

Io mi sono fatto una classe CActiveRecord visite.

Questa ha una funzione ‘logVisita’.

Questa funzione la richiamo dal layout di default ma sorpresa … mi inserisce 9 righe e non 1 quindi il layout al caricamento della pagina viene richiamato 9 volte?

Per carità posso anche non inserire più nulla nell’arco del secondo in base alla sessione ma mi sembra una soluzione veramente assurda perciò ho capito che sto facendo una stupidata e quindi confido nella sapienza del forum.

Grazie

Falexio

Non mi è chiara la parte"si può entrare da diverse pagine e da diversi indirizzi". Non hai controllo su quelle pagine e/o indirizzi?

Ciao!

dall’ultima conversazione qualche progresso l’ho fatto …

Ora mi sono andato a cercare questa grana

Sì in effetti rileggendo non è che sia così chiara la mia richiesta :)

Praticamente cosa succede noi abbiamo diversi partner che attraverso banner e pubblicità diverse linkano al nostro sito.

Però possono decidere se linkare direttamente alla registrazione, ad una scheda del prodotto oppure ad un determinato elenco.

Questo comporta che io debba memorizzare il primo ingresso dell’utente (da qualunque pagina avvenga) per poter sapere chi lo ha spedito.

Il mio dubbio era appunto che se metto un richiamo nella layout me lo richiama 9 volte e quindi direi che non è il posto corretto…

Spero di aver chiarito meglio il mio problema.

Ciao

Falexio

A prescindere da dove inserisci il codice, puoi usare il pattern singleton che inizializza il valore la prima volta che lo richiami senza rieseguire i calcoli. Non so, immagino tu possa estendere la classe Yii, o addirittura mettere qualche cosa nella index.php =).

Però non capisco cosa intendi con "richiamo". Potresti mostrarci il codice?

PS. Io fossi in te metterei tutto il codice che ti serve all’interno del/dei controller. Quelli vengono chiamati una volta sola. Oppure nella singola view che viene caricata.

Aggiungo questo:

creerei un metodo privato dentro al controller. Questo metodo avrebbe il compito di catturare la provenienza dell’utente. A questo punto, potresti richiamare quel metodo in qualunque controller ne abbia bisogno (lo sai tu quali ne hanno).

Più di così non credo di poterti aiutare.

Innanzitutto grazie,

Non ho ancora postato il codice perchè stavo ancora cercando di capire bene.

Allora avevo fatto quasi come mi avevi detto tu. Avevo sbagliato il posto.

Nel senso che ora ho:

MODELS:

Visite (CActiveRecord): Con il metodo logVisita che si occupa di memorizzare o modificare la visita nella riga del database.

Dalla index.php richiamo: $modelVisita = visite::model()->logVisita(‘ciao’);

Probabilmente è un accrocchio che non è proprio buona programmazione però funziona.

Ora però mi hai messo il dubbio del singleton ho provato a dare una lettura ma non mi è proprio chiaro. Tu l’hai già utilizzato?

Si, ma non usare il singleton che trovi qui su yii. Giorni fa ho trovato una twittata su un singleton che singleton in realtà non è. Ricordati che si tratta solo di un pattern: istanzi la classe una sola volta:

Se provi ad istanziare die volte


$var = new Classe();

$var1 = new Classe();

$var e $var1 saranno uguali se Classe usa il pattern singleton.

Il costruttore dovrebbe essere di questo tipo:




class Classe {


    public static $obj = null; // Variabile statica della classe


    public function __construct() {

       if(Classe::$obj == null) {

          Classe::$obj = new Classe();

       }

    }


}



Come vedi, viene istanziata la classe una sola volta. Io scritto del codice alla buona, se cerchi su wikipedia trovi di meglio.