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.