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