Variable Listensortierung durch Anwender

radarin

Angesehenes Mitglied
Hallo Liste
Ich arbeite gerade an einer Variante eine Liste nach 5 Spalten zu sortieren. Dabei geht es mir darum nicht immer nur nach einer zu sortieren, das ist ja ganz simpel einfach, sondern zuerst nach Spalte 2 aufsteigend, dann Spalte 1 absteigend und dann auch noch Spalte 5 aufsteigend. Dabei soll der User durch einfaches Anklicken die Reigenfolge selber bestimmen können?

Hat sowas schon wer mal umgesetzt? Ein Stichwort das zu beachten wäre?



Gruss René
 
Du schreibst leider nicht, in welcher Programmiersprache Du arbeitest.

Ich hab sowas schon öfters gemacht, allerdings in Dotnet. Da gibts fertige Objekte (Datagrid, Datatable) mit denen sich das sehr einfach realisieren lässt. Die Sortierung gibt man genau gleich an wie die SQL-Anweisung ORDER BY. Aber ich nehm an, Du benutzt nicht Dotnet?

Griessli
Irene
 
Dann kann ich leider nicht helfen, damit kenn ich mich nicht aus ;-)

Griessli
Irene
 
Naja, mit Session-Variablen geht es jedenfalls besser als mit ohne. Will gerne auf eine session versichten, da ich diese auf meiner webseite nur im Adminbereich verwenden will um so kein durcheinander zu bekommen, sicher ist sicher. Bin dafür jetzt ordentlich am kniffeln wie das aller in der URL zusammen zu stückeln...
 
Hab jetzt eine wirklich konfortable Lösung hingekriegt. Wer sich für den Code interessiert kann hier weiterlesen, den Anderen sei gesagt, die Lösung sei gefunden, Thema erledigt :)

Meine Liste stellt auf der Webseite 9 Spalten dar. Davon verwende ich 5 zur Sortierung. Wird die Seite erstmalig geladen, wird nach einem beliebigen Default-Wert, z.B. der DS-ID sortiert. Zur Auswahl der Sortierung habe ich folgende Linkzeile:

Spalte 1 | Spalte 2 | Spalte 3 | Spalte 4 | Spalte 5 || Aufsteigend | Absteigend || Reset

Die ersten 5 Links sind anklickbar, die Anderen nicht, da sie noch keine Funktion haben. Jetzt kann ich eine beliebige Spalte zur Sortierung auswählen. Nach dieser wird in erster Instanz aufsteigend sortiert. Die ausgewählte Spalte ist nun nicht mer anklickbar, dafür nun 'Absteigend' und 'Reset'. Mit den Links 'aufsteigend' und 'Absteigend' kann ich die Sortierrichtung der zuletzt gewählten Spalte ändern. Danach wähle ich die Spalte aus, nach der in zweiter Instanz sortiert wird und setzt die Prozedur wie gehabt fort. So generiere ich folgende Abfrage:

ORDER BY spalte1 ASC
ORDER BY spalte1 ASC, spalte4 DESC
ORDER BY spalte1 ASC, spalte4 DESC, spalte3 ASC

Die Sortierlinks sind jeweils nur dort anklickbar wo sie funktionell Sinn machen. Mit dem 'Reset' wird die Sortierung wieder auf den Default-Wert zurück gesetzt.

Der Code sieht dann folgendermassen aus, erst mal die Sortierzeile:

CODE
echo "<p class=\"text\">Sortierung:\n";
echo "<p class=\"text\">\n";
if ($link1 == 1){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=1&order=$order&asc=$asc\" class=\"link\">Spalte 1</a>\n";}else{echo "Spalte 1\n";}
echo " | \n";
if ($link2 == 1){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=2&order=$order&asc=$asc\" class=\"link\">Spalte 2</a>\n";}else{echo "Spalte 2\n";}
echo " | \n";
if ($link3 == 1){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=3&order=$order&asc=$asc\" class=\"link\">Spalte 3</a>\n";}else{echo "Spalte 3\n";}
echo " | \n";
if ($link4 == 1){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=4&order=$order&asc=$asc\" class=\"link\">Spalte 4</a>\n";}else{echo "Spalte 4\n";}
echo " | \n";
if ($link5 == 1){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=5&order=$order&asc=$asc\" class=\"link\">Spalte 5</a>\n";}else{echo "Spalte 5\n";}
echo " || \n";
if ($linkascdesc == "DESC"){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=$clm&dir=0&order=$order&asc=$asc\" class=\"link\">Aufsteigend</a>\n";}else{echo "Aufsteigend\n";}
echo " | \n";
if ($linkascdesc == "ASC"){echo "<a href=\"index.php?page=adressen&orpos=$orpos&clm=$clm&dir=1&order=$order&asc=$asc\" class=\"link\">Absteigend</a>\n";}else{echo "Absteigend\n";}
echo " || \n";
if ($orstat == 1){echo "<a href=\"index.php?page=adressen\" class=\"link\">Reset</a>\n";}else{echo "Reset\n";}



$link1 bis $link5 definieren ob die Spalte bereits zur Sortierung verwendet wird
$linkascdesc definiert ob Auf- oder Absteigend sortiert werden kann
$orstat definiert, ob eine Sortierung ausgewählt ist.
$orpos definiert die wievielte Spalte sortiert wird
$clm definiert welche Spalte sortiert wird
$dir definiert ob die letzte Spalte Auf- oder Absteigend sortiert wird
$order beinhaltet welche Spaltenreihenfolge verwendet wird
$asc beinhaltet welche Spalte in welcher Richtung sortiert wird

Der folgende Code kommt nun VOR die Linkzeile:


CODE
if(isset($_GET['order'])){ //wenn in der URL mit beliebigem Wert vohanden
$orstat = 1; // Sortierung findet statt
if(!isset($_GET['dir'])){$orpos = $_GET['orpos']+1;}
if(isset($_GET['dir'])){$orpos = $_GET['orpos'];}
$order = $_GET['order'];
$asc = $_GET['asc'];
$clm = $_GET['clm'];
if(isset($_GET['dir'])){$dir = $_GET['dir'];}
if(!isset($_GET['dir'])){$dir = 0;}
}else{
$orstat = 0; // Sortierung findet nicht statt
$orpos = 0;
$order = 100000;
$asc = 100000;
$dir = 0;
$clm = 0;
}



Hier werden die Variablen gesetzt oder übernommen. Um in der URL Platz zu sparen und keine Spaltennamen der DB dem User Preis zu geben, werden die Daten in der URL verschlüsselt:

index.php?page=adressen&orpos=3&clm=2&dir=1&order=143200&asc=101000

$orpos zeigt das nach 3 Spalten sortiert wird
$clm zeigt welche Spalte zuletzt zur Sortierung ausgewählt wurde
$dir sagt aus ob die letzte Spalte Auf- oder Absteigend sortiert wird
$order sagt aus, 1. Spalte Spalte 4, 2. Spalte Spalte 3, 3. Spalte Spalte 2
$asc sagt aus, 1. Spalte ASC, 2. Spalte DESC, 3. Spalte ASC *

* die erste Ziffer, immer eine 1 ist eine Hilfsziffer, damit aus 00000 nicht 0 wird. sondern dass 100000 auch 100000 bleibt. Würde man mit Buchstaben arbeiten wäre diese Hilfsziffer nicht nötig.





CODE
if ($orstat == 0) // leine Sortierung, Default Wert
{
$link1 = 1;
$link2 = 1;
$link3 = 1;
$link4 = 1;
$link5 = 1;
$sqlorder = "id ASC";
}



Findet keine Sortierung statt, werden Default-Werte gesetzt.


CODE
if ($orstat == 1) // Sortierung
{
if ($orpos == 1){$order = substr($order,0,1).$clm."0000";}
if ($orpos == 2){$order = substr($order,0,2).$clm."000";}
if ($orpos == 3){$order = substr($order,0,3).$clm."00";}
if ($orpos == 4){$order = substr($order,0,4).$clm."0";}
if ($orpos == 5){$order = substr($order,0,5).$clm."";}

if ($orpos == 1){$asc = substr($asc,0,1).$dir."0000";}
if ($orpos == 2){$asc = substr($asc,0,2).$dir."000";}
if ($orpos == 3){$asc = substr($asc,0,3).$dir."00";}
if ($orpos == 4){$asc = substr($asc,0,4).$dir."0";}
if ($orpos == 5){$asc = substr($asc,0,5).$dir."";}



Hier wird wenn zuerst nach Spalte 3 sortiert wird aus '100000' '130000', wird danach nach Spalte 2 sortiert aus '130000' '132000'
Das Selbe für die Sortierrichtung, wobei 0 für ASC, 1 für DESC steht.


CODE
if(substr($order,1,1) == 1 OR substr($order,2,1) == 1 OR substr($order,3,1) == 1 OR substr($order,4,1) == 1 OR substr($order,5,1) == 1){$link1 = 0;} else {$link1 = 1;}
if(substr($order,1,1) == 2 OR substr($order,2,1) == 2 OR substr($order,3,1) == 2 OR substr($order,4,1) == 2 OR substr($order,5,1) == 2){$link2 = 0;} else {$link2 = 1;}
if(substr($order,1,1) == 3 OR substr($order,2,1) == 3 OR substr($order,3,1) == 3 OR substr($order,4,1) == 3 OR substr($order,5,1) == 3){$link3 = 0;} else {$link3 = 1;}
if(substr($order,1,1) == 4 OR substr($order,2,1) == 4 OR substr($order,3,1) == 4 OR substr($order,4,1) == 4 OR substr($order,5,1) == 4){$link4 = 0;} else {$link4 = 1;}
if(substr($order,1,1) == 5 OR substr($order,2,1) == 5 OR substr($order,3,1) == 5 OR substr($order,4,1) == 5 OR substr($order,5,1) == 5){$link5 = 0;} else {$link5 = 1;}



Dieser Block überprüft ob eine Spalte bereits zur Sortierung vwerwndet wird um den Link zu deaktivieren.


CODE
$sqlorder = "";

$i = 1;

while ($i <= 5)
{
if ($i == 1){$tn = "";} else {if (substr($order,$i,1) == 0){$tn = "";} else {$tn = ", ";}}
if (substr($order,$i,1) == 0){$spalte = "";}
if (substr($order,$i,1) == 1){$spalte = "spalte1";}
if (substr($order,$i,1) == 2){$spalte = "spalte2";}
if (substr($order,$i,1) == 3){$spalte = "spalte3";}
if (substr($order,$i,1) == 4){$spalte = "spalte4";}
if (substr($order,$i,1) == 5){$spalte = "spalte5";}
if ($spalte != "")
{
if (substr($asc,$i,1) == 0){$ascdesc = " ASC";}
if (substr($asc,$i,1) == 1){$ascdesc = " DESC";}
$linkascdesc = trim($ascdesc);
}
else
{
$ascdesc = "";
}

$i = $i+1;
$sqlorder = $sqlorder.$tn.$spalte.$ascdesc;
}
}



Zuletzt wird nun die Variable $sqlorder generiert, welche in der SQL Abfrage eingesetzt wird.
 
Zurück
Oben