[Gelöst] who is online / user.module - function übernehmen und anpassung
am 31.01.2009 - 15:10 Uhr in
Hi.
So, Stück für Stück wurschtel ich mich durch. Jetzt habe ich aber wieder mal eine Frage:
Für die Ausgabe der "Who is online" ist ja folgende Datei zuständig: modules/user/user.module
Ich möchte die Datei jetzt so bearbeiten, dass ich nur noch die Anzahl der User dort stehen habe und nicht mehr den ganzen Salmus wie "Benutzer, Gäste etc.".
Um einen eigenen Block zu haben, habe ich eine block-user-3.tpl.php angelegt. Das klappt auch (denke ich zumindest, hehe). So kann ich das Layout unabhängig von den anderen Boxen gestalten.
Die Textphrasen werden ja jetzt durch die Function in der user.module ausgegeben:
function user_block($op = 'list', $delta = 0, $edit = array()) {
Das wäre dann genau genommen der Abschnitt:
// Format the output with proper grammar.
if ($anonymous_count == 1 && $authenticated_count == 1) {
$output = t('There is currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', '@count users'), '%visitors' => format_plural($anonymous_count, '1 guest', '@count guests')));
}
else {
$output = t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', '@count users'), '%visitors' => format_plural($anonymous_count, '1 guest', '@count guests')));
}
Wenn ich die Daten dort editiere, dann klappt auch alles und es wird so angezeigt, wie ich es haben möchte. Nur ist die Frage, geht das anders als direkt in den Dateien? Wenn es mal ein Update gibt, dann werden meine Änderungen ja direkt wieder überschreiben und ich darf alles manuell neu einpflegen. Zudem weiß ich nicht, ob das die richtige Variante ist, derartige Änderungen vorzunehmen oder ob ich mir das zu kompliziert mache.
------------
Nächste Sache:
Durch die who is online wird ja auch die Liste erstellt, die alle User anzeigt. Ich möchte es später so haben, dass die die Liste in einem anderen Block dargestellt wird, inkl. Bild. Ist das später mit Views machbar oder muss ich hier schon drauf achten, dass ich nichts aus der user.module lösche was dafür verwendet wird?
Hoffe meine Fragen sind soweit verständlich.
Danke für die Antworten.
Gruß
einfachfragen
- Anmelden oder Registrieren um Kommentare zu schreiben
who is online
am 31.01.2009 - 18:28 Uhr
Moin!
Erstmal vorweg: An Modulen (und ganz besonders am Kern von Drupal) wird nicht herumgeschraubt!. Es sei denn, man behebt Fehler und möchte Patches erstellen.
Sonst ist (wie Du ja bereits richtig erahnt hast) beim nächsten Update wieder alles weg und möglicherweise (was noch schlimmer ist) ein schwerwiegender Fehler im Kern von Drupal eingebaut.
Puh. Gerade nochmal gut gegangen.
So, jetzt zum eigentlich Problem.
Ich kann jetzt leider nicht so ad hoc sagen, welche Attribute alles in
$block
enthalten sind. Also schreib doch einfach mal in Deine block-user-3.tpl.php folgenden Quelltext:<?php
drupal_set_message('<pre>'. print_r($block, 1) .'</pre>');
Dann siehst Du die Struktur der Variable
$block
und siehst evtl. ein Attribut, dass bereits die von Dir gewünschte Information enthält.Ansonsten bleibt Dir wohl nichts Anderes, als
$block->content
in derblock-user-3.tpl.php
zu parsen und Dir die Informationen daraus zu beschaffen.hth,
Stefan
Erst einmal vielen Dank
am 01.02.2009 - 16:13 Uhr
für deine Antwort.
Erstmal vorweg: An Modulen (und ganz besonders am Kern von Drupal) wird nicht herumgeschraubt!. Es sei denn, man behebt Fehler und möchte Patches erstellen.
Jawohl Sir, wird gemacht Sir :D.
Die Ausgabe des Blocks sieht so aus:
stdClass Object
(
[bid] => 43
[module] => user
[delta] => 3
[theme] => auto
[status] => 1
[weight] => -13
[region] => header
[custom] => 0
[throttle] => 0
[visibility] => 0
[pages] =>
[title] =>
[cache] => -1
[enabled] => 1
[page_match] => 1
[subject] =>
[content] => Zur Zeit ist 1 Benutzer und 1 Gast online.Benutzer onlinesausi
)
Es gibt somit für mich keine Möglichkeit direkt auf die einzelnen Werte zuzugreifen, da die im [content] stecken.
Somit habe ich das so gelöst:
<div id="topuser">
<?php
preg_match_all("/\d+/",$block->content,$result);
print $result[0][0];
print $result[0][1];
?>
</div>
Das funktioniert auch, stellst sich nur die Frage, ob es der richtige Weg ist.
Wenn ja, werde ich zukünftig weiter so vorgehen und wenn nein, dann wäre es nett wenn man mir sagt welcher Weg der Beste ist ;-).
Mein Problem ist eigentlich nur, dass ich kein Progger bin. Hier ein bisschen, da ein bisschen ok aber sobald es aufwendiger wird muss ich passen. Kann ich Drupal somit individuell anpassen ohne ein guter Progger zu sein?
Gruß und nochmals danke.
who is online
am 02.02.2009 - 12:14 Uhr
Jawohl Sir, wird gemacht Sir :D.
Brav :-)
...Das funktioniert auch, stellst sich nur die Frage, ob es der richtige Weg ist.
Naja, es funktioniert jedenfalls (wie Du schon sagtest). Der richtige Weg wäre, wenn das user-Modul von sich aus schon die Anzahl der Nutzer als Attribute des Objekts mitgeben würde, damit man damit machen kann, was immer man möchte. Oder zumindest die Funktionallität, die die Nutzer zählt, in eine Funktion auslagern, so dass man die von woanders aufrufen kann. Dem ist aber leider nicht so.
Naja, da bleibt Dir also immer noch die Möglichkeit, die Abfrage selbst durchzuführen:
<?php
function count_online_users() {
// Count users active within the defined period.
$interval = time() - variable_get('user_block_seconds_online', 900);
// Perform database queries to gather online user lists. We use s.timestamp
// rather than u.access because it is much faster.
$result['anonymous_count'] = sess_count($interval);
$result['authenticated_count'] = db_num_rows(db_query('SELECT DISTINCT u.uid, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval));
return $result;
}
?>
Wenn Du diese Funktion in Deine template.php packst kannst Du jetzt irgendwo (in einem Block beispielsweise) die Zahl der aktuellen Benutzer auf der Seite anzeigen.
<?php
$users = count_online_users();
print t('Angemeldete Nutzer: !auth_count', array('!auth_count' => $users['authenticated_count']));
print t('Anonyme Nutzer: !anon_count', array('!anon_count' => $users['anonymous_count']));
print t('Nutzer insgesamt: !user_count', array('!user_count' => $users['authenticated_count'] + $users['anonymous_count']));
?>
hth,
Stefan
Klappt, mit kleinen Änderungen, merci
am 02.02.2009 - 21:01 Uhr
Danke für die optimierte Ausgabe. Werde zukünftig schauen, dass ich das über eigene functions löse (kann ich da die Template mit voll packen, sofern es nicht anders lösbar ist, wie in diesem Fall?).
Musste das jedoch ein wenig anpassen:
function count_online_users() {
// Count users active within the defined period.
$interval = time() - variable_get('user_block_seconds_online', 900);
// Perform database queries to gather online user lists. We use s.timestamp
// rather than u.access because it is much faster.
$result['anonymous_count'] = sess_count($interval);
$result['authenticated_count'] = db_result(db_query('SELECT DISTINCT u.uid, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval));
return $result;
}
db_num_rows, kannte Drupal nicht.
Ausgabe habe ich dann auch einfach so gemacht:
<?php print $users['authenticated_count']; ?>
etc.Gruß
db_num_rows
am 02.02.2009 - 22:04 Uhr
kann ich da die Template mit voll packen, sofern es nicht anders lösbar ist, wie in diesem Fall?.
Jup.
Oder Du legst Dir ein Verzeichnis includes in sites/all an, in das Du für die Snippets *.inc Dateien anlegst. Diese kannst Du dann in der template.php inkludieren.
db_num_rows, kannte Drupal nicht.
Ach, verdammich. Das ist ja in D6 entfernt worden. Hatte ich glatt vergessen.
$result['authenticated_count'] = db_result(db_query('SELECT COUNT(DISTINCT u.uid) FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval));
ist der empfohlene Ersatz für
db_num_rows().
hth,
Stefan
und wieder um
am 02.02.2009 - 22:28 Uhr
ein paar Erfahrungen reicher :-D.
Alles funktioniert und alles geht so wie es sein soll. Auf zum nächsten Problem :-D.
Gruß und danke.