Addon:Userliste mehrseitig sortierbar
Aus VMS1 Tutorial
Dieses Addon erstellt im VMS1 eine mehrseitige sortierbare Userliste.
Inhaltsverzeichnis |
Voraussetzung
Diese Anleitung baut auf dem Addon:Userliste mehrseitig auf, daher muss die Datei userliste.php im Verzeichnis /content/intern/ vorhanden sein. Es empfiehlt sich, die Anleitung Schritt für Schritt durchzugehen, alternativ kann aber auch gleich die komplette Datei verwendet werden: Addon:Userliste mehrseitig#Komplette_Datei.
Schritt 1: Parameter festlegen
Zusätzlich zur Seitenzahl werden Parameter einmal für die Spalte, nach der sortiert werden soll, und einmal für die Richtung, benötigt.
$sort = 'uid'; $valid_sort = <|>array|>('uid' => 'k.uid', 'nickname' => 'u.nickname', 'angemeldet_seit' => 'u.angemeldet_seit'); <|>if|>(<|>isset|>($_GET['sort']) && <|>array_key_exists|>($_GET['sort'], $valid_sort)){ $sort = $_GET['sort']; } $dir = 'ASC'; $valid_dir = <|>array|>('ASC', 'DESC'); <|>if|>(<|>isset|>($_GET['dir']) && <|>in_array|>($_GET['dir'], $valid_dir)){ $dir = $_GET['dir']; }
Schritt 2: Links
Für die Erzeugung der Pfeile zur Sortierung sind folgende Funktionen zuständig:
<|>function|> down_link($sort){ sort_link($sort, 'DESC', '⇓'); } <|>function|> up_link($sort){ sort_link($sort, 'ASC', '⇑'); } <|>function|> sort_link($sortkey, $direction, $symbol){ <|>global|> $seite, $sort, $dir; <|>if|>($dir != $direction || $sortkey != $sort) <|>echo|> '<a href="?content=/intern/userliste&seite='.$seite.'&sort='.$sortkey.'&dir='.$direction.'">'.$symbol.'</a>'; <|>else|> <|>echo|> $symbol; }
Die Seitenlinks müssen angepasst werden, um die Sortierung über Seitenwechsel hinweg zu erhalten:
<|>function|> userlist_show_navi(){ <|>global|> $seite, $seiten, $sort, $dir; <|>echo|> '<p>'; <|>for|>($i=1; $i <= $seiten; $i++){ <|>if|>($i!=$seite) <|>echo|> '<a href="?content=/intern/userliste&seite='.$i.'&sort='.$sort.'&dir='.$dir.'">'.$i.'</a>'; <|>else|> <|>echo|> '<b>'.$i.'</b>'; <|>if|>($i<$seiten) <|>echo|> ', '; } <|>echo|> '</p>'; }
Diese Funktionsaufrufe müssen nun noch in den Tabellenkopf eingefügt werden:
<table> <tr> <th>ID <|><?php|> down_link('uid'); <|>?>|> <|><?php|> up_link('uid'); ?></th> <th>Nickname <|><?php|> down_link('nickname'); <|>?>|> <|><?php|> up_link('nickname'); ?></th> <th>Anmeldedatum <|><?php|> down_link('angemeldet_seit'); <|>?>|> <|><?php|> up_link('angemeldet_seit'); ?></th> <th>Status</th> </tr>
Um dem Benutzer die aktuelle Sortierung anzuzeigen, wird die Zeile:
head("Userliste Seite ".$seite);
erweitert auf:
$pretty_sort = <|>array|>('uid' => 'ID', 'nickname' => 'Nickname', 'angemeldet_seit' => 'Anmeldedatum'); $pretty_dir = <|>array|>('ASC' => 'aufsteigend', 'DESC' => 'absteigend'); head("Userliste Seite ".$seite.", sortiert nach ".$pretty_sort[$sort]." ".$pretty_dir[$dir]."");
Schritt 3: Datenbankabfrage anpassen
$daten = db_query("SELECT k.uid, k.status, u.nickname, u.angemeldet_seit FROM ".$db_prefix."_kontodaten AS k LEFT JOIN ".$db_prefix."_userdaten AS u ON u.uid=k.uid ORDER BY ".$valid_sort[$sort]." ".$dir." LIMIT ".$start.", ".$pro_seite." ");
Das Ergebnis kann man unter index.php?content=/intern/userliste sehen.
Komplette Datei
<|><?php|> $pro_seite = 20; $user = <|>mysql_fetch_row|>(db_query("SELECT COUNT(uid) FROM ".$db_prefix."_kontodaten")); $seiten = <|>ceil|>($user[0]/$pro_seite); $seite = 1; <|>if|>(<|>isset|>($_GET['seite']) && $_GET['seite'] > 0 && $_GET['seite']<= $seiten){ $seite = (int)$_GET['seite']; } $start = ($seite-1)*$pro_seite; $sort = 'uid'; $valid_sort = <|>array|>('uid' => 'k.uid', 'nickname' => 'u.nickname', 'angemeldet_seit' => 'u.angemeldet_seit'); <|>if|>(<|>isset|>($_GET['sort']) && <|>array_key_exists|>($_GET['sort'], $valid_sort)){ $sort = $_GET['sort']; } $dir = 'ASC'; $valid_dir = <|>array|>('ASC', 'DESC'); <|>if|>(<|>isset|>($_GET['dir']) && <|>in_array|>($_GET['dir'], $valid_dir)){ $dir = $_GET['dir']; } <|>function|> userlist_show_navi(){ <|>global|> $seite, $seiten, $sort, $dir; <|>echo|> '<p>'; <|>for|>($i=1; $i <= $seiten; $i++){ <|>if|>($i!=$seite) <|>echo|> '<a href="?content=/intern/userliste&seite='.$i.'&sort='.$sort.'&dir='.$dir.'">'.$i.'</a>'; <|>else|> <|>echo|> '<b>'.$i.'</b>'; <|>if|>($i<$seiten) <|>echo|> ', '; } <|>echo|> '</p>'; } <|>function|> down_link($sort){ sort_link($sort, 'DESC', '⇓'); } <|>function|> up_link($sort){ sort_link($sort, 'ASC', '⇑'); } <|>function|> sort_link($sortkey, $direction, $symbol){ <|>global|> $seite, $sort, $dir; <|>if|>($dir != $direction || $sortkey != $sort) <|>echo|> '<a href="?content=/intern/userliste&seite='.$seite.'&sort='.$sortkey.'&dir='.$direction.'">'.$symbol.'</a>'; <|>else|> <|>echo|> $symbol; } $pretty_sort = <|>array|>('uid' => 'ID', 'nickname' => 'Nickname', 'angemeldet_seit' => 'Anmeldedatum'); $pretty_dir = <|>array|>('ASC' => 'aufsteigend', 'DESC' => 'absteigend'); head("Userliste Seite ".$seite.", sortiert nach ".$pretty_sort[$sort]." ".$pretty_dir[$dir].""); userlist_show_navi(); <|>?>|> <table> <tr> <th>ID <|><?php|> down_link('uid'); <|>?>|> <|><?php|> up_link('uid'); ?></th> <th>Nickname <|><?php|> down_link('nickname'); <|>?>|> <|><?php|> up_link('nickname'); ?></th> <th>Anmeldedatum <|><?php|> down_link('angemeldet_seit'); <|>?>|> <|><?php|> up_link('angemeldet_seit'); ?></th> <th>Status</th> </tr> <|><?php|> $gfx_status = <|>array|>(); $gfx_status[0] = '<img src="images/gelb.gif" width="15" height="15" border="0" alt="Nicht freigeschaltet" title="Nicht freigeschaltet">'; $gfx_status[1] = '<img src="images/gruen.gif" width="15" height="15" border="0" alt="Aktiv" title="Aktiv">'; $gfx_status[2] = '<img src="images/rot.gif" width="15" height="15" border="0" alt="Gesperrt" title="Gesperrt">'; $daten = db_query("SELECT k.uid, k.status, u.nickname, u.angemeldet_seit FROM ".$db_prefix."_kontodaten AS k LEFT JOIN ".$db_prefix."_userdaten AS u ON u.uid=k.uid ORDER BY ".$valid_sort[$sort]." ".$dir." LIMIT ".$start.", ".$pro_seite." "); <|>while|>($row=<|>mysql_fetch_assoc|>($daten)){ <|>?>|> <tr> <td align="right"><?php <|>echo|> $row['uid']; ?></td> <td><?php <|>echo|> $row['nickname']; ?></td> <td align="right"><?php <|>echo|> <|>date|>('d.m.Y', $row['angemeldet_seit']); ?></td> <td align="center"><?php <|>echo|> $gfx_status[$row['status']]; ?></td> </tr> <|><?php|> } <|>?>|> </table> <|><?php|> userlist_show_navi(); foot(); <|>?>|>