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. 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;
$debug = array();
// Datenbankabfrage
$db = JFactory::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
$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 dort FE, da 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;
}
}
// CSS
echo '<style>
.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;
}
</style>';
// Ausgabe
$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);