我有树,用户可以拖放元素并更改元素位置。 每次更改后我都会发送这个序列化数组,我想保存它。
示例树:
Economics
Blogging
General Dev
Japan
Productivity
Humanities
Education
Science
Haskell
Earth
PHP
我正在通过ajax发送序列化树,所以我有数组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"
数组值是表行标识。
如何将此数组插入到具有正确位置的数据库中?
答案 0 :(得分: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未经测试,但应该没问题
答案 1 :(得分:0)
我不会尝试以正确的顺序保存数据库表中的行,我会在表中添加“位置”列。我假设您已经有一个“父”列来保持层次结构。
当用户重新排列项目时,只需更新位置列。