Un dossier dashboard/ dans le plugin, deux sortes de fichiers :
plugins/monplugin/
└── dashboard/
├── monplugin.dash.php ← renvoie les signaux
├── monplugin.dash.fr.json ← ses textes, une langue par fichier
├── monplugin.dash.en.json
├── monplugin.dash.de.json
├── monplugin.dash.pt.json
└── monplugin.dash.es.json
Un plugin absent du serveur n'a pas de diagnostic, sans rien configurer : c'est ce qui permet à un site sans IA de ne rien afficher de l'IA.
2.1 Le fournisseur #
monplugin.dash.php renvoie un tableau de signaux, rien d'autre : pas d'echo, pas de HTML.
<?php
use Beamreactor\Database\SQL;
use Beamreactor\Dashboard\Dashboard;
$since = $lastSeen ?? '1970-01-01 00:00:00';
$r = SQL::queryFirst(
"SELECT COUNT(*) n, SUM(created_at > ?) nv FROM mes_demandes WHERE status = 'open'",
[$since],
['string']
);
if (!$r) return []; // la couche SQL rend false en cas d'échec : pas de signal inventé
return [
[
'count' => (int)$r['n'],
'new' => (int)$r['nv'],
'level' => (int)$r['nv'] > 0 ? 'critical' : 'todo',
'title' => Dashboard::t($dial, 'open', (int)$r['n']),
],
];
Le fournisseur tourne dans sa propre portée et reçoit :
| Variable | Contenu |
|---|
$userId | le membre |
$userLevel | son niveau (entier) |
$lastSeen | sa dernière visite de la page du plugin, 'Y-m-d H:i:s', ou null s'il ne l'a jamais ouverte |
$dial | les textes de monplugin.dash.<langue>.json |
$cfg | la configuration du site |
2.2 Un signal #
| Clé | Obligatoire | Rôle |
|---|
count | oui | le nombre affiché ; 0 = rien à montrer, le signal est ignoré |
level | oui | 'info', 'todo' ou 'critical' |
title | oui | l'infobulle, seul texte du panneau |
new | non | la part du compte postérieure à $lastSeen ; > 0 déclenche la pulsation |
icon | non | un émoji ; sinon l'icône du plugin (monplugin.svg ou .png) |
url | non | le lien ; sinon ?obj=monplugin |
Un signal mal formé (clé manquante, gravité inconnue) est écarté et signalé dans le journal d'erreurs. Une exception dans le fournisseur ne fait tomber que ses propres signaux, elle aussi signalée.
2.3 Les textes #
{
"_ver": "$VER: monplugin.dash.fr 1.0 (25.09.2026)",
"open": "%d demande(s) ouverte(s)"
}
Dashboard::t($dial, 'clé', ...$args) applique vsprintf. Une clé absente s'affiche telle quelle, et un fichier de langue absent est signalé : on voit le trou, il n'y a pas de langue de repli silencieuse.