2011-08-13 56 views
1

我有一個表是editablesortable。該表有2種類型的項目父母和子女。我希望用戶能夠在兩者之間切換並在兩者之間進行拖動,同時更新訂單。數據庫表格與以下內容類似。謎語這個。 PHP繞線機,可排序,可編輯表

+-------------------------------------------------------+-----------+ 
|id | userid | item   | parent | item order | parent_id | 
+-------------------------------------------------------+-----------+ 
|23 | 5  | cheese burger |false |  2  | 128 | 
+-------------------------------------------------------+-----------+ 
|128| 5  | Burgers   |True |  0  | 0  | 
+-------------------------------------------------------+-----------+ 
|10 | 5  | Hamburger  |false |  1  | 128 | 
+-------------------------------------------------------+-----------+ 
|25 | 5  | steak burger |false |  3  | 128 | 
+-------------------------------------------------------+-----------+ 
|90 | 5  | fish burger |false |  4  | 128 | 
+-------------------------------------------------------+-----------+ 
|29 | 5  | fries   |True |  5  |  0  | 
+-------------------------------------------------------+-----------+ 
|22 | 5  | cheese Fries |false |  6  |  29 | 
+-------------------------------------------------------+-----------+ 
|987| 5  | french fries |false |  7  |  29 | 
+-------------------------------------------------------+-----------+ 

這會給我一個菜單,像這樣....

BURGERS 
Hamburger 
Cheese burger 
Steak burger 
Fish burger 
FRIES 
Cheese fries 
French fries 

大寫表示頭*

我能拿到訂單正確的,沒有問題。我的腳本POST是項目順序的數組。

Array 
(
    [0] => 128 
    [1] => 10 
    [2] => 23 
    [3] => 25 
    [4] => 90 
    [5] => 29 
    [6] => 22 
    [7] => 987 
) 

然後我更新數據庫,以反映這一點,類似這樣的...

UPDATE menu SET item_order = '0' WHERE item = '128' 
UPDATE menu SET item_order = '1' WHERE item = '10' 
UPDATE menu SET item_order = '2' WHERE item = '23' 
UPDATE menu SET item_order = '3' WHERE item = '25' 
UPDATE menu SET item_order = '4' WHERE item = '90' 
UPDATE menu SET item_order = '5' WHERE item = '29' 
UPDATE menu SET item_order = '6' WHERE item = '22' 
UPDATE menu SET item_order = '7' WHERE item = '987' 

我在哪裏跌倒越來越父ID的權利。我嘗試了各種瘋狂的方法,找到parent ID,然後做一個< >類似的事情,但似乎沒有任何一貫正確的。你可以拖動一個標題,這會弄亂孩子們。即所有的孩子都會採用拖動的標題。你會如何處理這個問題?上次更新發生在添加新項目或拖動項目時。

編輯

這似乎是工作......

$order = "SELECT itemOrder, itemId, header from menuItems && user = $user order by itemOrder"; 
    $order_query = mysql_query($order); 
    while($order_result = mysql_fetch_array($order_query)) 
     { 
     $parent = $order_result['header']; 
     if ($parent == 'true') 
      { 
      $current_parent = $order_result['itemId']; 
      } 
      $item_id = $order_result['item_id']; 
      $parent_update = "UPDATE menuItems SET parent = '$current_parent' WHERE itemId = $itemId"; 
      mysql_query($parent_update); 
+0

我現在看到您的編輯。大。很高興我能幫上忙。我會更精確地遵循我的僞代碼結構(特別是項目的兩個單獨更新),您不會像現在這樣更新標題以使自己成爲其父項。 :) – GolezTrol

回答

1

由於菜單可能不會是一個分層結構,我不知道它不會是更容易有兩個表,一個包含標題,另一個包含項目。

雖然這對解決方案無關緊要。

關於parentId的:

假設不是父母本身應該有一個家長,你可以只通過其發佈的順序所有項目環和應用此(僞代碼)邏輯每個項目:

$parentId = null; 

loop through items: 
    if item->type == header: 
    set $parentId to item->id 
    update sort order 
    else (item is.. well, item) 
    check if $parentId !== null. Fail otherwise (item above first header) 
    update sort order and parentId