Le besoin spécifique
Aujourd'hui je vous présente un petit plugin qui permet de calculerr le nombre de personnes simultanément connectées sur un site Joomla. Une personne m'a posé une question sur le groupe Joomla Lorraine Groupe à savoir, "comment conaitre le nombre de personnes simultanément connectées sur un site Joomla". Nous allons voir comment mon plugin répond à cette problématique.
Principe de fonctionnement
Le principe de fonctionnement est très simple mais il faut connaitre un point particulier du fonctionnement des sessions de Joomla. En effet, chaque fois qu'un utilisateur se connecte avec un login ou non à Joomla, une ligne est enregistrér dans la base de données. En effet, il faut savoir qu'à chacune des connexions effectuées sous Joomla, une requete SQL modifie la table #__session (où #_ représente le nom de la base Joomla dans MySQL) et intègre un enregistrement dans la base de données. De ce fait, une "simple" requête de type SELECT permet donc de trouver le nombre de personnes simultaménent connectées sur un site.
Il faut aussi savoir que chaque fois qu'un utilisateur se connecte à Joomla, une ligne est créée dans la base de données, dans la table qui répertorie les sessions.
Ainsi, il suffit de "lire" le contenu de la table #_session (et de compter le nombre de résultats retournés) si on veut connaitre les informations des utilisateurs connectés. Et si l'on souhaite connaitre le nombre d'utilisateurs connectés, il suffit de compter le nombre de lignes. Et si vous souhaitez rentrer encore plus dans le détail, j'ai écrit cette requete :
select session_id,client_id, guest, userid, mn8eb_users.username, mn8eb_users.name from mn8eb_session, mn8eb_users where(guest = 0) and mn8eb_session.userid=mn8eb_users.id
Point particulier
Dans la table dénommée #_session, nous pouvons nous rendre compte que des informations sont différenciées. En effet, sur chacune des lignes que nous avons, vous trouverez un champ, dénommé client_id, qui permet de savoir si l'utilisateur connecté l'est dans la partie administrateur de Joomla ou dans la partie front office.
Si la valeur est de 1, utilisateur est connecté dans la partie d'administration, dans le cas où la valeur est à zéro, l'utilisateur est connecté sur la partie publique de Joomla. C'est la raison pour laquelle, dans le reste de mon script, je fais un distinguo nous verrons plus tard.
Les paramètres dans la console d'administration
Dans mon plugin, et vous pouvez le vérifier dans mon fichier XML, j'ai opté pour un paramètre de "templating" à la main de l'utilisateur. Ce paramètre correspond à une chaîne de caractères qui aura pour rôle de jouer un modèle d'affichage au format html.
Comme cela est mentionné dans mon code ainsi que dans le libellé de ce paramètre, vous avez la possibilité de définir une sorte de modèle HTML qui sera affiché. La seule contrainte est d'utiliser le terme {nbonline} dans ce champ texte, mot-clef qui sera au niveau de votre Joomla, remplacé par le nombre d'utilisateurs connectés simultanément.
Dans ce champ, ainsi, si vous saisissez "{nbonline} utilisateurs" ( sans les guillemets bien entendu) le plugin remplacera le terme entre crochet par le nombre. Vous pouvez ici spécifier du code HTML et CSS inline dans ce champs.
Tag utilisé dans vot articles et module pour ce plugin
J'ai opté pour le terme : {nbonlineusers}
nbonlinesusers.php
<?php
defined('_JEXEC') or die('Access deny');
class plgContentnbonlineusers extends JPlugin
{
function onContentPrepare($content, $article, $params, $limit){
/***************
* Je récupère le template html
***************************/
$param = $this->params->get('template', '');
/**************************
* client_Id = 1 means admin access
* client_Id = 0 means frontend access
*********************************************/
$sql = "select session_id,client_id, guest, userid, mn8eb_users.username, mn8eb_users.name from mn8eb_session, mn8eb_users where (guest = 0) and (mn8eb_session.userid=mn8eb_users.id)";
$db = JFactory::getDBO();
$db->setQuery($sql);
$nb=0;
foreach($db->loadObjectList() as $A)
{
if ($A->client_id == 0)
{
$nb = $nb+1;
}
}
$article->text = str_replace('{nbonline}', $nb, $param);
}
}
nbonlinesusers.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="1.0" type="plugin" group="Content">
<name>nbOnlineUsers</name>
<author>Sebastien LHUILLIER</author>
<creationDate>Juin 2023</creationDate>
<copyright>Sébastien LHUILLIER</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail>Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.</authorEmail>
<authorUrl>www.sebastien-lhuillier.com</authorUrl>
<version>1.0</version>
<description>Ce plugin compte le nombre d'utilisateur actuellement ONLINE dans Joomla avec {nbonlineusers}</description>
<files>
<filename plugin="nbonlineusers">nbonlineusers.php</filename>
<filename>nbonlineusers.xml</filename>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="template" type="textarea" default="" label="Modele HTML d'affichage avec {nbonline} pour spécifier le nombre" description="" rows="10" cols="5"/>
</fieldset>
</fields>
</config>
</extension>
