Pour les besoins de genbio.fr j'ai programmé 2 fonctions php
"compteur" et "compteurApply".la fonction compteur, exécutée sur chaque page, stoque ses variables dans $_SESSION.
La fonction compteurApply ne doit être exécuté qu'une fois: lorsqu'un utilisateur quitte le site.
Elle va récupérer les variables de sessions stoquées par compteur, les analyser et mettre à jour la bdd en incrémentant par exemple le nombre de page vues.
Mon problème est le suivant:
Pour que ce système fonctionne correctement il faudrait que la fonction compteurApply soit
executé lors de la fermeture de la fenêtre. Je me suis donc intéressé à la fonction javascript
onbeforeunload que je souhaitais coupler avec de l'ajax pour executer la fonction compteurApply. Malheureusement la fonction compteurApply va alors être executé
à chaque fois que l'on change de page ce qui pose problème ...
Comment faire en sorte que la fonction compteurApply ne soit executé que lorsqu'on quitte le site (90% des pages du sites sont contenues dans un contrôleur (design pattern MVC) nommé avec originalité genbio.php donc au pire si on quitte genbio.php on peut dire qu'on quitte le site) ? Voici pour informations les 2 fonctions incriminées et les fonctions qu'elles utilisent mais normalement vous ne devriez pas en avoir besoin pour comprendre et résoudre mon problème:
function ispro() //retourne vrai si l'on est sur une page qui porte penser que le visiteur est un professionnel
{
if (isprofessionnelsur()) return true;
if ($rubrique == "pro") return true;
return false;
}
function iscandidat() //retourne vrai si l'on est sur une page qui porte penser qu'on est candidat
{
if ((iscandidatsur()) || ($rubrique == "offre") || ($_SESSION['niveauUtilisateur'] == 1)) return true;
return false;
}
function iscandidatsur() //retourne vrai si l'on est sur une page qui porte penser qu'on est candidat
{
if (($action == "postuler") || ($_SESSION['niveauUtilisateur'] == 2)) return true;
return false;
}
function isprofessionnelsur() //retourne vrai si l'on est sur une page qui porte penser qu'on est candidat
{
if (($page == "refana") || ($page == "dmdmat") || ($_SESSION['niveauUtilisateur'] > 2)) return true;
return false;
}
function compteurApply()
{
$cmp = new Compteur();
$cmp = unserialize(Compteur::getLast());
$cmp->__set("pagesVues",($cmp->__get('pagesVues') + (int)$_SESSION['pagesVues']));
if ($_SESSION['professionnelsur'] == 1) $cmp->addPro();
else if ($_SESSION['candidatsur'] == 1) $cmp->addCan();
else
{
//Si on n'est pas totalement sur qu'il est pro ou candidat:
if (($_SESSION['professionnel'] > 0) || ($_SESSION['candidat'] > 0))
{
if (($_SESSION['visiteur'] > $_SESSION['professionnel']) && ($_SESSION['visiteur'] > $_SESSION['candidat']))
{
//Il est tres probablement juste un visiteur si il a vu en grande majorit des pages de visiteurs
$cmp->addVis();
}
else
{
//Il est ou professionnel ou candidat:
if ($_SESSION['professionnel'] > $_SESSION['candidat']) $cmp->addPro();
else $cmp->addCan();
}
}
else
{
//Il est seulement visiteur
$cmp->addVis();
}
}
$cmpt->update();
}
function compteur()
{
//VAR EXTRACTION
$var = $_GET;
$var2 = $_POST;
foreach($var as $v) $v = $v;
foreach($var2 as $v2) $v2 = $v2;
extract($var);
extract($var2);
if (!(isset($_SESSION['ip'])))//nouveau visiteur
{
if (ispro()) $_SESSION['professionnel']++;
else
{
$_SESSION['professionnel']=0;
if (iscandidat()) $_SESSION['candidat']++;
else
{
$_SESSION['candidat']=0;
$_SESSION['visiteur']=1;//on lui attribue un role de visiteur (puisque normalement il est sur la page d'acceuil)
}
}
}
else
{
//ancien visiteur
if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) //ancien visiteur ayant chang d'ip
{
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
if (((int)$_SESSION['professionnelsur'] != 1) && ((int)$_SESSION['candidatsur'] != 1)) //Si on n'est pas certain qu'ils soient pro on candidat
{
if (iscandidat()) // Si il est sur une page qui porte penser qu'il est candidat
{
if ((int)$_SESSION['visiteur'] > 0) (int)$_SESSION['visiteur']--;
$_SESSION['candidat']++;
// Si il est sur une page qui prouve qu'il est professionnel on le met en professionnelsur
if (iscandidatsur())
{
$_SESSION['candidatsur']=1;
$_SESSION['visiteur']=0;
$_SESSION['professionnel']=0;
}
}
else if (isprofessionnel()) // Si il est sur une page qui porte penser qu'il est professionnel
{
if ((int)$_SESSION['visiteur'] > 0) $_SESSION['visiteur']--;
$_SESSION['professionnel']++;
// Si il est sur une page qui prouve qu'il est professionnel on le met en professionnelsur
if (isprofessionnelsur())
{
$_SESSION['professionnelsur']=1;
$_SESSION['visiteur']=0;
$_SESSION['candidat']=0;
}
}
else //Il est sur une page qui porte penser qu'il est simple visiteur
{
$_SESSION['visiteur']++;
}
}
}
$_SESSION['pagesVues']++;
}