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.

Whoi is online im Frontend anzeigen

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