Thread Verfasser: Layzee
Thread ID: 1706
Thread Info
Es gibt 5 Beiträge zu diesem Thema, und es wurde 2833 Mal angesehen.
 Thema drucken
Zuletzt gesehen
Layzee
Moin zusammen,

ich glaub ich hab nen Corona-Koller oder sowas.
Ich verzweifle grad an einer doch eigentlich ganz einfachen Funktion.
Es handelt sich um ein "last seen Panel", welches einfach nur die letzten (in diesem Fall) 12 Mitglieder anzeigt, die online sind/waren.

Der Code:

<?php
// Datumsfunktion
    function modern_date($timestamp) {
    $timeframe = time() - $timestamp;
    if ($timeframe <= 10) return "vor wenigen Sekunden";
    elseif ($timeframe >= 11 && $timeframe <= 59) return "vor ".$timeframe." Sekunden";
    elseif ($timeframe >= 60 && $timeframe <= 3599) return "vor ".ceil($timeframe / 60)." Minuten";
    elseif ($timeframe >= 3600 && $timeframe <= 86399) return "vor ".ceil($timeframe / 3600)." Stunden";
    elseif ($timeframe >= 86499 && $timeframe <= 604799) return "vor ".ceil($timeframe / 86400)." Tagen";
    elseif ($timeframe >= 604800 && $timeframe <= 6048000) return "vor ".ceil($timeframe / 604800)." Wochen";
    else return "am ".strftime("%d.%m.%Y", $timestamp);
    }

// Datenbankabfrage   
$result = dbquery("SELECT user_id, user_name, user_avatar, user_status, user_lastvisit FROM ".DB_USERS." ORDER BY user_lastvisit DESC LIMIT 0,12");
if (dbrows($result)) {
while ($data = dbarray($result)) {

// Variablen setzen
$user_id = $data['user_id'];
$user_name = $data['user_name'];
$user_status = $data['user_status'];
$user_avatar = ((!$data['user_avatar'] || !file_exists(IMAGES."avatars/".$data['user_avatar'])) ? IMAGES."avatars/noavatar100.png" : IMAGES."avatars/".$data['user_avatar']);

$user_class = (($data['user_lastvisit'] < (time() - 80)) ? "user-offline" : "user-online");
$user_lastvisit = modern_date($data['user_lastvisit']);


// Ausgabe
echo profile_link($user_id, "<img align='left' style='margin:5px; width:60px; height:60px; border:1px solid #fff; border-radius:50%;' src='".$user_avatar."' alt='".$data['user_name']."' class='".$user_class." rotate' height='40' width='40' title='".$data['user_name']." ".$user_lastvisit."' />", $user_status)."\n";
}
}
echo "<div style='margin-top:10px; font-size:12px; align:center; text-align:center; color:#ffffff;'>Mitglieder gesamt: ".number_format(dbcount("(user_id)", DB_USERS, "user_status<='1'"))."&nbsp;|&nbsp;";
      $data = dbarray(dbquery("SELECT user_id,user_name FROM ".DB_USERS." WHERE user_status='0' ORDER BY user_joined DESC LIMIT 0,1"));
      echo "Neu dabei: <a class='side' style='display:inline; color:#ffffff;' href='".BASEDIR."profile.php?lookup=".$data['user_id']."'>".trimlink($data['user_name'],25)."</a>\n";
echo "</div>";
?>


Das Ganze sieht dann auf der Seite aber SO aus:
rl4y.de/last_seen.PNG

Wie man sieht, wird der Online/Offline Status anhand eines kleinen Icons dargestellt, welches aber eigentlich mit in "title" stehen sollte, also erst bei Mouseover angezigt werden soll.
Verantwortlich dafür ist diese Zeile:

echo profile_link($user_id, "<img align='left' style='margin:5px; width:60px; height:60px; border:1px solid #fff; border-radius:50%;' src='".$user_avatar."' alt='".$data['user_name']."' class='".$user_class." rotate' height='40' width='40' title='".$data['user_name']." ".$user_lastvisit."' />", $user_status)."\n";


Jetzt wäre es mir auch noch egal, wenn der Userstatus komplett ausgeblendet werden würde, aber egal wie ich die Ausgabe schreibe, es führt zu einem Fehler auf der Webseite.

Also hab ich jetzt zwei Fragen:
1. bekomme ich das Icon irgendwie IN die Title-Anzeige (erst bei Mouseover) oder wenn nicht, wie nehme ich das korrekt GANZ raus?

Wie gesagt, ich hab irgendwie grad echt nen Durchhänger :)

PHP-Fusion Version: V8 von Krelli (Systemweb)
PHP-Version: 7.1


Danke im Voraus.
Bearbeitet von Layzee am 11. April 2020 12:31:55
Information:
PHP Version: 7.2.x •  MySQL Version: 8.0 •  PHP-Fusion: IUP-FIX-PHP8
 
Krelli
Moin Layzee,
habe das mal durchgespielt und das Problem liegt in deinem Fall zuallererst in der Funktion profile_link in der maincore.php.
Sobald Benutzer deren Profil unsichbar gemacht haben und du in der Funktion statt nur den Usernamen einen kompletten String mit Image-Code usw. mitlieferst, wurde der Benutzername falsch "zensiert" für die gekürzte Ausgabe (beispielsweise S*****)
Du müsstest in der maincore.php die Zeile 1151 von

$user_name = substr($user_name, 0, 1)."*****";
ändern zu

$user_name = str_replace($udata['user_name'], substr($udata['user_name'], 0, 1)."*****", $user_name);
Nach dieser Änderung sollte dein Code funktionieren, wenn du im Funktionsaufruf für profile_link(.....) ebenfalls noch alle $data['user_name'] änderst zu $user_name. Schließlich hast du dem Script ja wenige Zeilen oben drüber gesagt, dass du diese Variable festlegst.
Bei mir hat dein Code funktioniert. Mit der vorstehenden Änderung werden übrigens alle Vorkommen des Benutzernamens -falls notwendig- korrekt gekürzt.

Ich werde das exakt so übernehmen, da es durchaus nützlich ist. Diese Änderung kommt also in die Final Version mit rein.
Information:
PHP Version: 8.2.x •  MySQL Version: Nicht ausgewählt •  PHP-Fusion: IPv9-DE-MOD
 
Layzee
Hi Krelli,

erstmal Danke für die Antwort und den nicht unwichtigen Hinweis.

Der Code entstand beim "Rumtesten", deshalb waren die Variablen noch nicht vollständig richtig....

Ich habe die von dir genannten Änderungen vorgenommen, leider löst das aber das Problem nicht.
Es geht bei dem Problem um die im roten Rahmen markierten Icos... die müssen entweder weg oder IN den "title" tag:
rl4y.de/last_seen2.PNG

Ich werd bald kirre damit...
Information:
PHP Version: 7.2.x •  MySQL Version: 8.0 •  PHP-Fusion: IUP-FIX-PHP8
 
Krelli
Das sind die FontAweSome Icons. Entweder FAS deaktivieren oder in der maincore.php die profile_link Funktion abändern

Zusammengefügt am 12. April 2020 um 12:36:59:
Tausche doch mal die Funktion profile_link in deiner maincore.php komplett aus mit folgendem Code

// User profile link
function profile_link($user_id, $user_name, $user_status, $class = "profile_link") {
   global $locale, $settings, $userdata;
   $class = ($class ? $class : ""); $hide_user = false; $online_status = "offline";   
   $udata = dbarray(dbquery("SELECT * FROM ".DB_USERS." WHERE user_id = '".$user_id."' LIMIT 1"));   
   $fas_class = false;
   if($udata['user_name'] == $user_name && $settings['fontawesome'] == 1) { $fas_class = true; }   
   // check if online
   if ((dbcount("(online_user)", DB_ONLINE, "online_user='".$udata['user_id']."'")) == 1) {
      $class .= " status-online";
      $online_status = "online";
   }
   else {
      $class .= " status-offline";
   }
   $hide_user = false;   
   if(!iADMIN && (IsSet($udata['user_hideme']) && $udata['user_hideme'] == 1)) {
      if((!iMEMBER) || (iMEMBER && $userdata['user_id'] != $udata['user_id'])) {
         $user_name = str_replace($udata['user_name'], substr($udata['user_name'], 0, 1)."*****", $user_name);
         $hide_user = true;
      }
   }
   elseif(!iMEMBER && ($settings['hide_userprofiles'] == "1" || (IsSet($udata['user_hideme']) && $udata['user_hideme'] != 0))) {
      $hide_user = true;
   }
   elseif(iADMIN && (IsSet($udata['user_hideme']) && $udata['user_hideme']==1)) {
      $user_name = str_replace($udata['user_name'], $udata['user_name']."*", $user_name);
      $hide_user = false;
   }
   if ((in_array($user_status, array(0, 3, 7)) || checkrights("M"))) {
      if(!isset($udata)) {
         $link = $user_name;
      } else {
         if ($udata['user_status'] == "5" || $udata['user_status'] == "6") {
            //this will showing that user has gone (anonymized or deactivated)
            $user_name = $locale['user_anonymous'];
         }
         $link = "".($hide_user ? $user_name : ($fas_class ? "<i class='fa fa-user ".$class."' title='".$online_status."'></i>" : "")."<a href='".BASEDIR."profile.php?lookup=".$user_id."' title='".$online_status."'>".$user_name."</a> ");
      }
   } elseif ($user_status == "5" || $user_status == "6") {
      $link = $locale['user_anonymous'];
   } else {
      $link = $user_name;
   }
   return "<span style='white-space:nowrap;'>".$link."</span>";
}

Anschließend änderst du deinen Code noch so, dass du den nicht zwansgweise benötigten 4. Parameter für die zu verwendende CSS-Klasse ebenfalls übergibst, hängst demnach hinten noch ein , "" an: profile_link(....... , "")
Bearbeitet von Krelli am 12. April 2020 09:36:59
Information:
PHP Version: 8.2.x •  MySQL Version: Nicht ausgewählt •  PHP-Fusion: IPv9-DE-MOD
 
Layzee
JA VERDAMMT!
Das war's!

Das hat mich wahnsinnig gemacht *lach*

VIELEN LIEBEN DANK KRELLI!
Hast definitiv einen gut bei mir Wink
Information:
PHP Version: 7.2.x •  MySQL Version: 8.0 •  PHP-Fusion: IUP-FIX-PHP8
 
Springe ins Forum: