Contrôler les connexions des auteurs/visiteurs

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Pouvoir avoir d’un seul coup d’oeil quels sont les auteurs et visiteurs qui se connectent (réservé aux administrateurs)

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 :

Actuellement connecté

Commencons par modifier le petit bout de code qui permet de mettre à jour la date de dernière connexion d’un visiteur :

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 :

Visiteurs

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']."&nbsp;"._T('info_article_2');
	else if($row['compteur'] == 1)
		echo "1&nbsp;"._T('info_article');
	else
		echo "&nbsp;";

	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']."&nbsp;"._T('info_article_2');
	else if($row['compteur'] == 1)
		echo "1&nbsp;"._T('info_article');
	else
		echo "&nbsp;";

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

Discussion

6 discussions

  • 1

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

    • Pascale

      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

  • 1

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom