Plugin « Date et heure de connexion » (SPIP 1.9.2)

MàJ pour spip 1.9.2

Attention ! Cette contribution modifie des fichiers du noyau de SPIP !

Même si elle a été testée par plusieurs utilisateurs nous ne pouvons garantir qu’il n’y aura pas d’effets secondaires dommageables sur votre SPIP. Conservez toujours les fichiers d’origine pour pouvoir revenir au noyau originel.

De plus, elle n’est compatible qu’avec une version précise de SPIP et sera perdue à la prochaine mise à jour : vous devrez donc recommencer.

Ce plugin permet de voir la date et l’heure de la dernière connexion des utilisateurs. La solution est proposée sous deux formes : la classique réécriture de ecrire/exec/auteurs.php (pour un spip 1.9) et une version « plugin » qui fait exactement la même chose (pour un spip 1.9.2) !

Sans tomber dans la parano ni le flicage, il est des situations où l’on doit pouvoir attester d’une présence, d’une absence (en milieu scolaire par exemple). Que vous utilisiez la version modifiée de exec/auteurs.php ou que vous installiez le plugin, cela vous permettra de voir le jour et l’heure de la dernière connexion...


[*La version classique*]


Examinons donc les différentes modifs à apporter au fichier auteurs.php d’origine.

-  Changer l’ordre « par défaut » de tri des auteurs
Tout en haut du fichier, on trouve :

     function exec_auteurs_dist()
    {
        global  $debut, $tri, $visiteurs;

        if (!$tri) $tri='nom'; else $tri = preg_replace('/["\'?=&<>]/', '', $tri);

On va donc modifier $tri=’nom’ en $tri=’date’.

     function exec_auteurs_dist()
    {
        global  $debut, $tri, $visiteurs;

        if (!$tri) $tri='date'; else $tri = preg_replace('/["\'?=&<>]/', '', $tri);

-  Implémenter un tri "par date de connexion
descendons vers la ligne 65, où l’on trouve :

function affiche_auteurs($auteurs, $lettre, $max_par_page, $nombre_auteurs)
{
  global $debut, $options, $spip_lang_right, $tri, $visiteurs,
  $connect_id_auteur, $connect_statut, $connect_toutes_rubriques;

  if ($tri=='nom') $s = _T('info_par_nom');
  if ($tri=='statut') $s = _T('info_par_statut');
  if ($tri=='nombre') $s = _T('info_par_nombre_articles');
  $partri = ' ('._T('info_par_nombre_article').')';

Aux tris prévus, par nom, statut ou nombre d’articles, on va rajouter la possibilité d’un tri par date. Le _L nous permet de glisser un texte « en dur » qui s’affichera entre le petit bonhomme coloré et le nom des auteurs.

function affiche_auteurs($auteurs, $lettre, $max_par_page,
$nombre_auteurs)
{
  global $debut, $options, $spip_lang_right, $tri, $visiteurs,
  $connect_id_auteur, $connect_statut, $connect_toutes_rubriques;


if ($tri=='nom') $s = _T('info_par_nom');
if ($tri=='statut') $s = _T('info_par_statut');
if ($tri=='nombre') $s = _T('info_par_nombre_articles');

// hack romain
if ($tri=='date') $s = _L('Connexion');

$partri = ' ('._T('info_par_nombre_article').')';

-  modifier l’affichage du tableau des auteurs
aux alentours de la ligne 133, on trouve :

echo "</td><td>";
     if ($tri == '' OR $tri=='nom')
          echo '<b>'._T('info_nom').'</b>';
     else
          echo "<a href='".generer_url_ecrire("auteurs","tri=nom")
          ."'title='"._T('lien_trier_nom')."'>"._T('info_nom')."</a>";

La version d’origine prévoit donc par défaut de trier par nom (avec un lien cliquable pour y revenir si on a trié autrement). Nous allons maintenant rajouter la possibilité de trier par date en affichant un lien « Connexion ».

echo "</td><td>";
     if ($tri == '' OR $tri=='date')
          echo '<b>'._L('Connexion').'</b>';
     else
          echo "<a href='" . generer_url_ecrire("auteurs","tri=date")
          ."'title='"._L('Connexion')."'>"._L('Connexion')."</a>";

echo "</td><td>";
     if ($tri=='nom')
          echo '<b>'._T('info_nom').'</b>';
     else
          echo "<a href='".generer_url_ecrire
          ("auteurs","tri=nom")."'title='"._T('lien_trier_nom')."'>"._T 
          ('info_nom')."</a>";

-  implémenter le tri par date de connexion
à la ligne 252, on trouve :

// tri
switch ($tri) {
case 'nombre':
	$sql_order = ' compteur DESC, unom';
	break;

case 'statut':
	$sql_order = ' statut, login = "", unom';
	break;

case 'nom':
default:
	$sql_sel = ", ".creer_objet_multi ("nom", $spip_lang);
	$sql_order = " multi";
}

Nous allons modifier le tri par défaut en plaçant le critère « default » au niveau d’un nouveau switch ’date’. Ce faisant, nous allons insérer l’ordre sql de trier la table sur le champ « en_ligne’.

// tri
switch ($tri) {
case 'nombre':
	$sql_order = ' compteur DESC, unom';
	break;

case 'statut':
	$sql_order = ' statut, login = "", unom';
	break;
	
case 'nom':
	$sql_sel = ", ".creer_objet_multi ("nom", $spip_lang);
	$sql_order = " multi";
	break;

// hack romain
case 'date':
default:
	$sql_order = ' en_ligne DESC, unom';
}

-  Coder la requête de tri
à la ligne 270, on trouve la »très sympa" petite requête d’origine...

//
// La requete de base est tres sympa
//

 $row = spip_query("SELECT
       aut.id_auteur AS id_auteur,
       aut.statut AS statut,

Nous allons donc nous atteler à la modification de la bête...
en rajoutant ’aut.en_ligne AS en_ligne,’ au début

//
// La requete de base est tres sympa
//

 $row = spip_query("SELECT
       aut.en_ligne AS en_ligne,
       aut.id_auteur AS id_auteur,
       aut.statut AS statut,

-  Permettre un affichage compréhensible de la date
juste en dessous de la « petite requête sympa »...

// 
// hack romain pour afficher les dates
//
function reorderDate($inputDate) {

	// on récupère les morceaux
	$annee = substr($inputDate, 0, 4);
	
	// jamais connecté
   if ($annee == "0000"){
		$outputDate = "Jamais connect&eacute;";
	} else {
		$mois = substr($inputDate, 5, 2);
		$jour = substr($inputDate, 8, 2);
		$heure = substr($inputDate, 10, 3);
	
		if ($mois == "01") $mois = "Jan.";
		if ($mois == "02") $mois = "F&eacute;v.";
		if ($mois == "03") $mois = "Mars";
		if ($mois == "04") $mois = "Avril";
		if ($mois == "05") $mois = "Mai";
		if ($mois == "06") $mois = "Juin";
		if ($mois == "07") $mois = "Juil.";
		if ($mois == "08") $mois = "Ao&ucirc;t";
		if ($mois == "09") $mois = "Sept";
		if ($mois == "10") $mois = "Oct.";
		if ($mois == "11") $mois = "Nov.";
		if ($mois == "12") $mois = "D&eacute;c.";
	
		if ($annee == "2006") $annee_court = "06";
		if ($annee == "2005") $annee_court = "05";
		if ($annee == "2004") $annee_court = "04";

		// cas normal
		$outputDate = "le&nbsp;".$jour."&nbsp;".$mois."&nbsp;".$annee_court." <br />&agrave;&nbsp;".$heure."&nbsp;h";
	}	
	return $outputDate;
}

On récupère les morceaux à grand coups de ’substr’ ; pour le détail de cette fonction, vous pouvez jeter un oeil ici...


-  gérer l’affichage final
à la ligne 343 on trouve :

	// statut auteur
	echo "<td style='border-top: 1px solid #cccccc;'>";
	echo bonhomme_statut($row);

sous lequel on va rajouter
de quoi obtenir l’affichage tant désiré...

Dates de connexion
Affichage obtenu après avoir fait les modifs sur exec/auteurs.php
	// statut auteur
	echo "<td style='border-top: 1px solid #cccccc;'>";
	echo bonhomme_statut($row);

	// hack romain
	// enligne
	if ($connect_statut == '0minirezo' OR $connect_statut == '1comite') {
             $la_date = reorderDate($row['en_ligne']);
             echo "</td><td class='verdana11' style='border-top: 1px solid #cccccc;'>";
		echo "<small>".$la_date."</small>";
	} else {
		echo "</td><td class='verdana11' style='border-top: 1px solid #cccccc;'>";
		echo "<small>Jamais connect&eacute;</small>";
	}

[*La mise en Plugin*]


-  Considérations de départ
Bidouiller un fichier de ecrire/exec, comme nous venons de le faire ci-dessus, c’est bien. Le problème, c’est qu’en cas de mise à jour de la distrib spip, il faut se souvenir du (ou des) fichiers qu’on a modifié pour ne pas les écraser. La mise en « plugin » permet tout d’abord d’éviter ce genre problème. _ En outre, les plugins peuvent être à volonté activés / désactivés, ce qui évite bien des manip fastidieuses.
Alors... on y retourne !

-  Récupérer un modèle
Pour commencer, nous allons récupérer un modèle de plugin sur svn ://zone.spip.org/spip-zone/ (le « plugin_template »). C’est en éditant son contenu et en virant ce qui ne nous est pas utile qu’on va créer notre plugin connexion.

-  Editer plugin.xml
Ce fichier est fourni avec des indications assez claires sur sa structure. Pour l’essentiel, il suffit donc de mettre le nom du plugin, celui de l’auteur, la version et la description dans les balises du même nom.

Les éléments plus « sensibles » sont :

    • la balise « options »
      Le documentation indique que le fichier options (comme l’ancien mes_options.php) sera chargé a chaque hit. C’est donc bien à elle que nous devons nous atteler puisque, si nous voulons savoir qui s’est connecté récemment, il faut recalculer.
      La balise « options » prendra donc la forme suivante :
      <options>
      connexions_options.php
      </options>

      Bien sûr, comme indiqué dans la doc, nous inventons pour ce fichier un nom unique (surtout pas mes_options.php). C’est dans ce fichier « connexions_options.php » que nous copierons tout simplement la totalité de notre fichier ecrire/exec/auteurs.php modifié (tout simplement).

    • La balise « fonctions » :
      Comme nous n’en avons pas besoin, elle restera vide.
    • La balise « prefixe » :
      Là encore la doc fournit des indications précises et claires : pas d’ambiguité dans le nom qui doit être unique et sera repris dans toutes nos fonctions. Ici on reste simple :
      <prefix>
      connexions
      </prefix>
    • La balise « pipeline » :
      C’est le coeur du truc. C’est le pipeline, aussi appelé point d’entrée, qui nous permet d’altérer le fonctionnement standard de spip. La liste des pipelines déjà prévus dans spip peut être étudiée dans inc_version. Là, comme nous cherchons à altérer le fonctionnement d’un fichier de ecrire/exec en entier, nous allons retenir uniquement le pipeline « body_prive ».
      <pipeline>
      	<nom>body_prive</nom> 
      	<action>body_prive</action>
      	<inclure>connexions_pipelines_admin.php</inclure>
      </pipeline>


      La doc indique que l’on peut se dispenser de « inclure ». Nous allons néanmoins indiquer expressément le nom de ce fichier (et tout de suite après l’éditer).

-  Editer « template_pipelines_admin.php »
Avant d’aller plus loin, nous renommons ce fichier sous le nom que nous avons indiqué dans plugin.xml, c’est à dire « connexions_pipelines_admin.php ».
En l’éditant, nous découvrons que plusieurs fonctions ont été prévues. La plupart ne nous servant à rien, nous les effaçons pour arriver au code suivant :

<?php
function connexion_body_prive($flux){
	return $flux;
}
?>

-  Editer « template_options.php »
Avant d’aller plus loin, nous renommons ce fichier sous le nom que nous avons indiqué dans plugin.xml, c’est à dire « connexions_options.php ».
En l’éditant, nous découvrons... qu’il est vide !
Super !
On va y copier/coller la totalité du fichier ecrire/exec/auteurs.php que nous avons modifié selon nos besoins dans la première partie de cet article.

-  Et ensuite ?
et ensuite,... c’est fini (ou presque). Nous pouvons effacer les fichiers templates qui ne servent à rien dans notre cas (template_fonctions, template_pipelines_cron, template_pipelines_typo et template_pipelines_public).
Nous avons donc un plugin tout neuf composé de 4 fichiers :

    • gpl_fr.txt : (pour la license)
    • plugin.xml
    • connexions_pipellines_admin.php
    • connexions_options.php

Si ce n’est déjà fait, on crée un dossier « plugins » à la racine du spip. On y crée ensuite un sous-dossier « _connexions_ » ou « connexions_auteurs » (ou ce que vous voulez, a priori ça n’est pas critique). On y glisse nos quatre fichiers.

Dans l’interface privée, les bouton « Configuration » fait alors apparaître un « Gestion des plugins » qui nous permet d’activer notre plugin. On s’en rend compte aussitôt en allant sur la page « Auteurs » dont le fonctionnement est désormais modifié tant que le plugin est activé.

Discussion

Aucune discussion

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