2011-09-25 62 views
0

我有树,用户可以在其中拖放元素并更改元素位置。 每次更改后,我发送这个序列化数组,我想保存它。保存阵列位置

例树:

Economics 
Blogging 
General Dev 
Japan 
Productivity 

    Humanities 
     Education 
     Science 
      Haskell 
       Earth 
      PHP 

我送树序列阿贾克斯throught,所以我有数组临客此。

'0' => "1" 
'1' => "2" 
'2' => "3" 
'3' => "4" 
'4' ... 
    '0' => "5" 
    '1' ... 
     '0' ... 
      '0' => "6" 
      '1' ... 
       '0' => "7" 
       '1' ... 
        '0' => "8" 
        '1' ... 
         '0' ... 
          '0' => "9" 
          '1' ... 
           '0' => "10" 
         '1' ... 
          '0' => "11" 

数组值是表行ID。

如何将这个数组插入数据库的正确位置?你需要填写正确的数据库,然后其余的应该好办

create table catalogue (
    id int not null auto_increment primary key, 
    name varchar(255), 
    catalogue_id int, 
    ord int 
); 

所以第一:

回答

1

我会建议使用传统的树存储方法。

实际代码。

客户端:

<ul id="enclosure_0" class="sortable"> 
     <li id="item_1">Level0 - Item 1</li> 
     <li id="item_2">Level0 - Item 2</li> 
     <li id="item_3">Level0 - Item 3</li> 
     <li id="item_4">Level0 - Item 4</li> 
     <li id="item_5">Level0 - Item 5 
      <ul id="enclosure_5" class="sortable"> 
       <li id="item_6">Level1 - Item 1</li> 
       <li id="item_7">Level1 - Item 2</li> 
       <li id="item_8">Level1 - Item 3</li> 
       <li id="item_9">Level1 - Item 4</li> 
      </ul> 
     </li> 
    </ul>   
    <script>  
     $(document).ready(function(){ 
      $(".sortable").sortable({ 
       stop: function(ev, ui){ 
        var list = $(this).sortable("toArray"); 
        $.get("sort.php", {items: list, parent_id: $(this).attr('id')}, function(data){window.alert("stored");}); 
       } 
      }); 
     }); 
    </script> 

服务器侧(sort.php):

<?php 

/* you have new order in $_GET["items"], you have parent id in $_GET["parent_id"] */ 

/* easiest way: 
* */ 

preg_match("/enclosure_([0-9])+/", $_GET["parent_id"], $tmp); 
$parent_id = (int) $tmp[1]; 
$counter = 0; 
foreach ($_GET["items"] as $item){ 
    $counter++; 
    preg_match("/item_([0-9]+)/", $item, $tmp); 
    $item_id = (int) $tmp[1]; 
    $db->query("update catalogue set ord = $counter where id = $item_id"); 
    /* alternatively, somewhat safer */ 
    $db->query("update catalogue set ord = $counter where id = $item_id and catalogue_id = $parent_id"); 
} 

注释和假设:

1)catalogue_id应为顶级类别为0
2 )我相信你很聪明,可以动态呈现客户端。 3)假设ord是基于1的。 4)php没有测试,但应该没问题

+0

如何检查数组并正确插入数据库。 – devsoft

+0

为你添加的代码 – jancha

+0

是的,对我来说最有价值的部分是这个PHP代码,但我认为这是错误的,因为它应该递归保存位置。像这样,它只适用于两个可排序级别。如果我们有更多的级别呢? – devsoft

0

我不会试图按照正确的顺序保留数据库表中的行,我会在表中添加一个“位置”列。我假设你已经有一个“父”列来坚持层次结构。

当用户重新排列项目时,只需更新位置列。

+0

是的,我在数据库中有“位置”和“父”列。我不知道如何通过这个数组并保存到数据库中。服务器站点。 – devsoft