Welche Benutzer sind gerade angemeldet? (Joomla-Schnipsel "user-online.php")
Ein einfach gehaltenes Who-is-online-Skript, mit dem man den aktuellen Anmelde-Status der registrierten Besucher im Frontend anzeigen lassen kann. Ich binde ihn mit dieser Technik in diesen Beitrag ein: Mit Modulstil eigene PHP-Dateien einbinden. Der Code funktioniert natürlich auch in eigenen Erweiterungen, Overrides oder mit einer der Joomla-Erweiterungen zum Einbinden von PHP.
Es handelt sich um ein simples Basis-Skript, dass die Einträge der User-Datenbanktabelle mit denen der Session-Tabelle abgleicht. Letztere enthält den Anmelde-Status der aktuellen Seitenbesucher.
In Joomla 4 kann das Skript nur funktionieren, wenn in der Joomla-Konfiguration die Einstellung "Sitzungs-Metadaten verfolgen" aktiviert ist. Das ist ein "Problem" vieler Wer-Ist-Online-Erweiterungen.
Beachten Sie, dass die Einstellungen im Joomla-Plugin "System – Sitzungsdaten bereinigen" erheblichen Einfluss darauf haben können, wie lange User-Einträge in der Session-Datenbanktabelle verbleiben. Das kann u.U. zu "unklaren" Ergebnissen führen. Im Plugin "Benutzer – Joomla!" sollte weiterhin die Einstellung "Alle Sitzungen beenden?" aktiviert sein.
Wer mehr will, sollte noch Fehlerroutinen einprogrammieren. Auch lässt sich der Ausgabeblock sicherlich optimieren.
Es zeigt auch Backend-Anmeldungen an und immer alle in der Datenbank befindlichen Benutzer, ggf. mit einem "OFF". Also bitte überlegen, ob man das wirklich will. Im deaktivierten Code Block //Optionale Filter gibt es dafür ein paar Steuerungsmöglichkeiten.
Am Ende des Artikels wird der von Joomla generierte SQL-Code angezeigt, passend zum verwendeten Server mit dem der Code ausgeführt wird, falls Sie ihn direkt einsetzen wollen. Zum Entfernen dieses Outputs den Block //DEBUG aus dem Code entfernen.
Welche Benutzer sind gerade online?
Gerenderte Ausgabe der Datei user-online.php
Re:Later
OFF
Richardt Rösepöse
OFF
Volkmar Volli Schlothauer (GHSVS)
OFF
SQL-Query-String
SELECT `u`.`name`, `u`.`id`, `s`.`client_id`
FROM `#__users` AS `u`
LEFT JOIN `#__session` AS `s` ON `s`.`userid` = `u`.`id`
ORDER BY `u`.`name`
Quelltext der Datei user-online.php
<?php
/* user-online.php */
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
$debug = array();
// Datenbankabfrage
$db = Factory::getDbo();
$selects = $db->qn(array(
'u.name',
'u.id',
's.client_id',
));
$selects = implode(', ', $selects);
$on = ' ON ' . $db->qn('s.userid') . ' = ' . $db->qn('u.id');
$query = $db->getQuery(true)
->select($selects)
->from($db->qn('#__users', 'u'))
->join('LEFT', $db->qn('#__session', 's') . $on)
->order($db->qn('u.name'));
// OPTIONALE FILTER - START
$client = $db->qn('s.client_id');
// Nur jeweils 1 where-Zeile verwenden (Gatterzeichen # entfernen)!
// Nur Frontendanmeldungen anzeigen, keine Abgemeldeten:
#$query->where($client . ' = "0"');
// Nur Backendanmeldungen anzeigen, keine Abgemeldeten:
#$query->where($client . ' = "1"');
// Nur Angemeldete anzeigen
#$query->where($client . ' IN ("0", "1")');
// OPTIONALE FILTER - ENDE
$db->setQuery($query);
$results = $db->loadObjectList();
//DEBUG - START
// Um verwendetes SQL-Query auszugeben, je nachdem, welchen Filter man oben gesetzt hat (oder keinen).
$debug[] = '<h4>SQL-Query-String</h4>';
$debug[] = '<p><code>' . (string) $query . '</code></p>';
//DEBUG - ENDE
// Ggf. Anmeldung über mehrere Browser raushauen.
// Andererseits berücksichtigen, dass hier FE, dort BE möglich.
// Plumpes Überschreiben mittels ID.
$users = array();
foreach ($results as $result)
{
$users[$result->id]['name'] = $result->name;
if ($result->client_id == '0') {
$users[$result->id]['fe'] = true;
}
elseif ($result->client_id == '1') {
$users[$result->id]['be'] = true;
}
}
// Ausgabe - START
$html = array();
if (empty($users)) {
$html[] = '<p>Keine gefunden.</p>';
}
foreach ($users as $result)
{
$html[] = '<h5>' . $result['name'] . '</h5>';
$html[] = '<p class="showOnline">';
if (isset($result['fe'])) {
$html[] = '<span class="useronlineFE">';
$html[] = 'FE';
$html[] = '</span>';
}
if (isset($result['be'])) {
$html[] = '<span class="useronlineBE">';
$html[] = 'BE';
$html[] = '</span>';
}
if (!isset($result['fe']) && !isset($result['be'])) {
$html[] = '<span class="usernotonline">';
$html[] = 'OFF';
$html[] = '</span>';
}
$html[] = '</p>';
}
echo implode('', $html);
echo implode('', $debug);
// Ausgabe - ENDE
// CSS in Seite einsetzen - START
$css = '.showOnline span{
display: inline-block;
text-align: center;
border-radius: 50%;
height:50px;
width:50px;
font-size:20px;
line-height:50px;
font-weight:bold;
color: white;
}
.useronlineFE{
background-color: green;
}
.useronlineBE{
background-color: blue;
}
.usernotonline{
background-color: gray;
}';
// Joomla 3 oder 4?
$isJ3 = version_compare(JVERSION, '4', 'lt');
$doc = Factory::getDocument();
if ($isJ3) {
$doc->addStyleDeclaration($css);
} else {
// Nur eine WebAssetManager-Spielerei. Fügt dem STYLE-Tag eine id hinzu.
$id = 'userOnlinePhp_' . time();
$doc->getWebAssetManager()->addInlineStyle($css, [], ['id' => $id]);
}
// CSS in Seite einsetzen - ENDE