Einträge neu sortieren | Einfach Switchen reicht nicht

Kalma

Erfahrenes Mitglied
Hi,


ich habe folgendes Problem:

Ein Benutzer hat die Möglichkeit MenüElemente auf seiner Seite neu zu sortieren.

Diese sind in einer Datenbank gespeichert:

Tabelle menu:
------------------------------------------
id (int)
name (varchar)
order (int)
------------------------------------------

Order zählt ASC. 0 ganz oben, desto größer, desto weiter unten.


Wenn jetzt jemand das Element mit `order` 0 an die 3. Stelle von oben haben will, sprich:

von
ID | Order
1 | 0
2 | 1
3 | 2
4 | 3

nach

ID | Order
2 | 1
3 | 2
1 | 2
4 | 3


Müsste ja, damit immer die korrekte Sortierung beibehalten wird, wie der User es wollte, die andere Ordnungszahlen von den betroffenen Elementen geändert werden:
ID | Order
2 | 1 - 1 = 0
3 | 2 -1 = 1
1 | 2
4 | 3



Wie bekomme ich das hin?
Ich dachte an einen BubbleSort, weiß aber nicht, wie ich die Elemente dort tausche.
Der Algorithmus vom BubbleSort ist mir wohl bekannt, aber ich weiß nicht, wie ich an die Elemente komme, bzw. die ID des zu Ordnen Objekts und dessen Order-Zahl


Wäre super wenn ihr mir helfen könntet :)
David
 
Hey,
hatte nur kurz Zeit mir etwas einfallen zulassen.
Versuchs mal so, muss wohl noch bisl was geändert werden aber der Ansatz müsste klappen:
PHP:
<?php
$menupunkt[0] = "0"; // in $menupunkt steht 'id' mit dem wert 'order'
$menupunkt[1] = "1";
$menupunkt[2] = "2";
$menupunkt[3] = "3";
$menupunkt[4] = "4";
$menupunkt[5] = "5";

$menus = count($menupunkt); // anzahl der menupunkte


// wenn menupunkt[4] nach order 2 soll dann


$changemenu_from =	$menupunkt[4];
$changemenu_to =	$menupunkt[2];


for($i = 0; $i < $menus; $i++)
{
	if($i >= $changemenu_to && $i < $changemenu_from)
	{
		$menupunkt[$i] = $menupunkt[$i] + 1; // alle menupunkte zwischen dem ziel order und der aktuellen order + 1 setzen, sprich 1 nach unten rutschen
	}
}

$menupunkt[4] = $changemenu_to; // zuletzt dann noch den zusetzenden menupunkt auf gewünschte order setzen
?>
nach dem ganzen:
$menupunkt[0] = "0";
$menupunkt[1] = "1";
$menupunkt[2] = "3";
$menupunkt[3] = "4";
$menupunkt[4] = "2";
$menupunkt[5] = "5";

achja!
Wenn dann ein Menupunkt nach unten verschoben werden soll musst du die Loop so zu sagen umdrehen ^^
viel Spass beim basteln ;) sollte nicht so schwer sein.
greetz
 
Ok, und hier:

PHP:
 $menupunkt[$i] = $menupunkt[$i] + 1; // alle menupunkte zwischen dem ziel order und der aktuellen order + 1 setzen, sprich 1 nach unten rutschen


Muss dann immer mein MySQL-Update befehl sein, richtig?


Danke für den Denkanstoß! Werde ich gleich probieren!
 
Aber eine Frage noch:

Wenn das jetzt genau andersrum ist, muss ich dann nur das +1 zum -1 machen? Ja oder?

// Ach ne, verdammt, is ja voll falsch.

Dann muss ich die ganze For-Bedingung umdrehen oder?
Das i = $anzahl ist und bis 1 runterzählt oder wie?
Ich bin wieder mal total verwirrt...
 
Zuletzt bearbeitet:
PHP:
for($i = 0; $i < $menus; $i++)
{
    if($i <= $changemenu_to && $i > $changemenu_from)
    {
        $menupunkt[$i] = $menupunkt[$i] - 1; // alle menupunkte zwischen dem ziel order und der aktuellen order - 1 setzen, sprich 1 nach oben
    }
}
so , 5 edits und jetzt muss es passen :D
 
Zuletzt bearbeitet:
Hm, ne, irgendwie läuft das ganze nicht...

Fällt mir jetzt grade mal auf.


Also das ganze bezieht sich (wiedermal) auf diese Seite:
http://guerilla.ifloegel.de

Rechts die Widgets.
-----------------------------------------------------------------------------------------------

Die Tabelle (mySQL) aus der das ganze kommt, sieht so aus:
awidget_id
awidget_user_id
awidget_order

Das Array mit den 3 Widgets (wie es so grad auf der seite ist) würde so aussehen:
$widget[1] = 0; // kalendar
$widget[2] = 1; // postings
$widget[3] = 2; // suche
( $widgets['awidget_id'] = awidget_order)

Habe zwar den Code hier, aber da das ganze in eine mySQL Klasse geht, weiß ich nicht ob ihr da so durchblickt, bzw. du.
Aber ich denke:

PHP:
$change_from      = 2; // position von der gezogen wird
$change_to           = 0; // position zu der gezogen wird


for($i = 1; $i < $widget_count; $i++)
			{
				// E.G Change_to	= 4
				//	   Change_from	= 2
				if($i >= $change_to && $i <= $change_from) {
					// update entrys
					// order + 1
					// alternate: order - 1
					
					$data					 = array();
					$data['awidget_order']	 = $widgets[$i]+1;
					$where					 = '`awidget_id` = "'.array_search($widgets[$i], $widgets).'"';
					$where					.= ' AND `awidget_user_id` = "'.$_SESSION['user_id'].'"';
				}
				
				if($i <= $change_to && $i > $change_from) {
					// update entrys
					// order + 1
					// alternate: order - 1
					
					$data					 = array();
					$data['awidget_order']	 = $widgets[$i]-1;
					$where					 = '`awidget_id` = "'.array_search($widgets[$i], $widgets).'"';
					$where					.= ' AND `awidget_user_id` = "'.$_SESSION['user_id'].'"';
    			}
				
				parent::query_update($this->allocation_table, $data, $where);
			}
			
			// set pulled widget to new order		
			$data					 = array();
			$data['awidget_order']	 = $change_to;
			$where					 = '`awidget_id` = "'.$pulledid.'"';
			$where					.= ' AND `awidget_user_id` = "'.$_SESSION['user_id'].'"';
				
			parent::query_update($this->allocation_table, $data, $where);


Wäre super, wenn du mir mal sagen könntest, was da nicht korrekt ist.
 
Hallo,

es gibt keinen Grund, warum man das nicht alles per SQL machen sollte:
PHP:
if ($old_order < $new_order) {
  mysql_query("UPDATE `menu` SET `Order` = `Order` - 1 WHERE `Order` BETWEEN $old_order AND $new_order");
} elseif ($old_order > $new_order) {
  mysql_query("UPDATE `menu` SET `Order` = `Order` + 1 WHERE `Order` BETWEEN $new_order AND $old_order");
}
mysql_query("UPDATE `menu` SET `Order` = $new_order WHERE `ID` = $ID");

Grüße, Matthias
 
@ Matthias:

Brauch ich dafür die Schleife?
Oder ist die dann überflüssig?

$old_order und $new_order sind einfach nur die Werte von der Position wo das Element vorher war, und $new_order wo es hinsoll?
 
Zurück