Я бы предложил использовать традиционный подход к хранению деревьев:
create table catalogue (
id int not null auto_increment primary key,
name varchar(255),
catalogue_id int,
ord int
);
Итак, сначала вам нужно правильно заполнить БД, затем с остальными нужно легко обращаться.
фактический код.
Клиентская сторона:
<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) Предполагается, что заказ основан на 1.
4) php не проверен, но должен быть в порядке