2011-09-25 8 views
0

사용자가 요소를 드래그 앤 드롭하고 요소 위치를 변경할 수있는 트리가 있습니다. 모든 변경 후 serialize 배열을 보내고 저장하고 싶습니다.배열 위치 저장

예 나무 : 나는 나무 축복하는 아약스를 직렬화 보내고있다

Economics 
Blogging 
General Dev 
Japan 
Productivity 

    Humanities 
     Education 
     Science 
      Haskell 
       Earth 
      PHP 

그래서이 LINKE 배열을 가지고있다.

'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입니다.

올바른 위치로 데이터베이스에이 배열을 삽입하는 방법은 무엇입니까?

답변

1

나는 전통 나무의 저장 방식을 사용하는 것이 좋습니다 것입니다 :

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

을 그래서 먼저 제대로하고 나머지는 취급이 용이해야한다 DB 채우기 위해 필요.

실제 코드.

클라이언트 측 :

<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

나를 위해 가장 intresting 부분은이 PHP 코드지만, 그것은 recursivly 위치를 저장해야하기 때문에 잘못 생각합니다. 이처럼 그것은 두 가지 수준의 정렬 만 가능합니다. 더 많은 레벨이 있다면? – devsoft

0

올바른 순서로 DB 테이블의 행을 유지하려고하지 않을 것이므로 테이블에 "위치"열을 추가 할 것입니다. 난 당신이 이미 "부모"열 ​​계층 구조를 유지할 수 있다고 가정합니다.

사용자가 항목을 재배치하면 위치 열을 업데이트하면됩니다.

+0

예 데이터베이스에 "위치"와 "상위"열이 있습니다. 이 배열을 통과하고 올바른 databse에 저장하는 방법을 모르겠습니다. 서버 사이트. – devsoft