나는 전통 나무의 저장 방식을 사용하는 것이 좋습니다 것입니다 :
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는 테스트되지 않았지만 정상이어야합니다.
어째서 배열을 만들고 데이터베이스에 올바르게 삽입합니까? – devsoft
코드를 추가했습니다 – jancha
나를 위해 가장 intresting 부분은이 PHP 코드지만, 그것은 recursivly 위치를 저장해야하기 때문에 잘못 생각합니다. 이처럼 그것은 두 가지 수준의 정렬 만 가능합니다. 더 많은 레벨이 있다면? – devsoft