Introduction :
Cette contrib permet de voir qui s’est connecté récemment (auteurs ou visiteurs) à partir de l’interface privée de SPIP.
Première étape :
Spip gère la date de connexion pour les auteurs, cela permet d’afficher qui est en ligne en ce moment dans la partie privée.
Comme les visiteurs n’ont pas acces à la partie privée,
SPIP ne gère pas la date de connexion d’un visiteur.
Nous allons corriger ca :
Mais du coup, si on met à jour la date de connexion d’un visiteur, il va apparaître connecté dans la partie privée :
Commencons par modifier le petit bout de code qui permet de mettre à jour la date de dernière connexion d’un visiteur :
Modification du fichier spip_cookie.php3 pour mettre à jour la connexion des visiteurs
Dans le fichier spip_cookie.php3 :
Ligne 123 (Sur une version 1.7.2)
Vous avez :
$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($auth->login)."'";
$result = spip_query($query);
if ($row_auteur = spip_fetch_array($result))
$cookie_session = creer_cookie_session($row_auteur);
if (ereg("ecrire/", $cible->getUrl())) {
$cible->addVar('bonjour','oui');
}
Ajoutez ce petit code en ligne 128 pour donner ceci :
$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($auth->login)."'";
$result = spip_query($query);
if ($row_auteur = spip_fetch_array($result))
$cookie_session = creer_cookie_session($row_auteur);
// Petit hack pour indiquer la connexion d'un visiteur
@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='" . $row_auteur['id_auteur'] . "'");
// Fin de la modif
if (ereg("ecrire/", $cible->getUrl())) {
$cible->addVar('bonjour','oui');
}
Deuxième étape :
Maintenant, nous allons devoir modifier un tout petit peu le code d’affichage des présents, pour enlever les visiteurs. C’est tout simple, il suffit de changer une requête SQL comme suivant :
Fichier ecrire/inc_presentation.php3, ligne 1728 (SPIP 1.7.2), vous avez le code suivant :
if ($activer_imessage != "non" AND ($connect_activer_imessage != "non" OR $connect_statut == "0minirezo")) {
$query2 = "SELECT id_auteur, nom FROM spip_auteurs WHERE id_auteur!=$connect_id_auteur AND imessage!='non' AND messagerie!='non' AND en_ligne>DATE_SUB(NOW(),INTERVAL 5 MINUTE)";
Changez simplement la chaine $query2 comme suivant :
if ($activer_imessage != "non" AND ($connect_activer_imessage != "non" OR $connect_statut == "0minirezo")) {
$query2 = "SELECT id_auteur, nom FROM spip_auteurs WHERE id_auteur!=$connect_id_auteur AND imessage!='non' AND messagerie!='non' AND statut!='6forum' AND en_ligne>DATE_SUB(NOW(),INTERVAL 5 MINUTE)";
Troisième étape :
Maintenant il ne vous reste plus qu’à afficher la date de dernière connexion pour un visiteur et la date de dernière connexion OU dernière déconnexion pour un auteur.
Soit vous faites un petit script vous même, soit vous pouvez modifier l’affichage de la page auteurs.php3 dans la partie privée.
Voici simplement comment faire pour modifier l’affichage des auteurs/visiteurs et obtenir ceci :
Modification de ecrire/auteurs.php3 afin d’ajouter une colonne de date de connexion
Ligne 232 de ecrire/auteurs.php3 (version 1.7.2)
Vous avez le code :
}
echo "</td></tr>\n";
if ($nombre_auteurs > $max_par_page) {
Ajouter cette ligne pour donner le nouveau titre de colonne comme ceci :
}
if ($connect_statut == '0minirezo') echo "</td><td>En ligne";
echo "</td></tr>\n";
if ($nombre_auteurs > $max_par_page) {
Au passage, on pourrait ajouter « En ligne » dans la liste des variables de langue, mais je ne vais pas vous compliquer la tâche :-)
Maintenant vous avez à la ligne 310 le code suivant :
// nombre d'articles
echo '</td><td>';
if ($row['compteur'] > 1)
echo $row['compteur']." "._T('info_article_2');
else if($row['compteur'] == 1)
echo "1 "._T('info_article');
else
echo " ";
echo "</td></tr>\n";
}
Ajoutez-y les 9 lignes afin de donner ceci :
// nombre d'articles
echo '</td><td>';
if ($row['compteur'] > 1)
echo $row['compteur']." "._T('info_article_2');
else if($row['compteur'] == 1)
echo "1 "._T('info_article');
else
echo " ";
// En ligne
if ($connect_statut == '0minirezo') {
echo '</td><td>';
if ($row['en_ligne'] == 0) {
echo '<i>Jamais</i>';
} else {
echo affdate_court( $row['en_ligne']);
}
}
echo "</td></tr>\n";
}
Ceci va afficher la colonne de la date de connexion.
Et maintenant, il va falloir sélectionner le champ « en_ligne » dans les requêtes SQL afin qu’elle remontent ce champs de la base.
Les 4 requêtes à modifier sont sous le format suivant :
$result_* = spip_query("SELECT auteurs.id_auteur, [...]
FROM spip_auteurs AS auteurs [...]
WHERE [...]
[...]
$sql_order");
Il suffit d’ajouter le code :
, auteurs.en_ligne
à la fin de la ligne SELECT des 4 requêtes SQL sous la forme indiquée et qui se trouvent aux lignes 109, 125, 147 et 167 pour SPIP 1.7.2
Celà va donner ceci :
$result_auteurs = spip_query("SELECT id_auteur, statut, source, pass, login, nom, email, url_site, messagerie, UPPER(nom) AS unom, auteurs.en_ligne
FROM spip_auteurs AS auteurs
WHERE 1 $sql_statut_auteurs
$sql_order");
[...]
$result_nombres = spip_query("SELECT auteurs.id_auteur, UPPER(auteurs.nom) AS unom, COUNT(articles.id_article) AS compteur, auteurs.en_ligne
FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien, spip_articles AS articles
WHERE auteurs.id_auteur=lien.id_auteur AND lien.id_article=articles.id_article
$sql_statut_auteurs $sql_statut_articles
GROUP BY auteurs.id_auteur
$sql_order");
[...]
$result_nombres = spip_query("SELECT auteurs.id_auteur, auteurs.statut, auteurs.source, auteurs.pass, auteurs.login, auteurs.nom, auteurs.email, auteurs.url_site, auteurs.messagerie, UPPER(nom) AS unom, COUNT(articles.id_article) AS compteur, auteurs.en_ligne
FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien, spip_articles AS articles
WHERE auteurs.id_auteur=lien.id_auteur AND lien.id_article=articles.id_article
$sql_statut_auteurs $sql_statut_articles
GROUP BY auteurs.id_auteur
$sql_order");
[...]
$result_auteurs = spip_query("SELECT auteurs.id_auteur, auteurs.statut, auteurs.source, auteurs.pass, auteurs.login, auteurs.nom, auteurs.email, auteurs.url_site, auteurs.messagerie, UPPER(nom) AS unom, 0 as compteur, auteurs.en_ligne
FROM spip_auteurs AS auteurs
WHERE id_auteur NOT IN (0$vus)
$sql_statut_auteurs_ajout
$sql_order");
Et voilà, le tour est joué !
C’était pas facile, mais ca en valait la peine non ?
Partie publique
Maintenant que la date et l’heure de connexion est disponible aux visiteurs, vous pouvez utiliser un petit
filtre qui permet d’afficher si un auteur ou un visiteur est en ligne.
Si besoin
J’ai fait la modif pour SPIP 1.7, 1.7.1 et SPIP 1.7.2 donc si vous avez besoin du fichier final, demandez-le moi !
Bon courage.
Discussions par date d’activité
6 discussions
Merci pour cette contribution. Je suis toujours en 183 et le patch fonctionne bien.
Pourrait-on pousser la logique jusqu’au bout et imaginer un véritable système de tracking gardant en mémoire toutes les connections leur durée etc... ?
Ce serait très pratique pour les sites à visée pédagogique...
Parce que la pédagogie c’est le flicage ?
Beurk....
Répondre à ce message
Sur la base du travail présenté ici, j’ai tenté de présenter deux évolutions :
- une version classique (remplaçant ecrire/exec/auteurs.php) pour spip 1.9
- une version Plugin
Répondre à ce message
Voici les fichiers modifiés pour spip 1.8.3, ils se trouvent ici :
http://gouarfig.free.fr/spip-contrib/article474/spip1.8.3.zip
Hop !
Répondre à ce message
Il faut que je fasse la modif pour mon site, après maj avec la 1.8.2 actuelle. Je regarde, et je vous donnerai les infos !
A suivre...
Répondre à ce message
Même remarque que la précédante. Est ce que cette contribution très intéresante fonctionne avec la 1.8.2d ou e ?
Merci
Quelques essais avec spip 182e :
- dans spip_cookie on cherche la ligne 150 au lieu de 123 et on insère ligne 155 au lieu de 128
- dans ecrire/auteurs.php3 on cherche la ligne 246 au lieu de 232
L’insertion de compteur se fait ligne 130 ???
Bon la bonne nouvelle c’est que le spip n’explose pas !, j’arrive même à afficher la connection d’un visiteur enregistré dans la partie admin, c’est ce que je cherche...
La mauvaise nouvelle c’est que je n’affiche plus aucun admin/auteur/visiteur et encore moins le statut en ligne et la dernière connection. Grosse déception : j’ai du foiré qq part mais c’est normal vu que j’y connait pas grand chose du php !!!....
Au secours....
Répondre à ce message
J’aimerai savoir si cette contribution a été remise à jour pour 1.8.2d car la partie public (connectés en ligne) m’interesse vivement.
Superbe contribution en tous les cas ! Bravo !
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |