我在用着jQuery 可嵌套插件 with 代码点火器 3为网站创建 5 级菜单,这是一个很好的解决方案,用户可以通过拖放来更改菜单项的级别和位置。然而,我的下面的函数只能创建第一级菜单,当我更改为菜单项的子级(2,3,4,5)时,它对我不起作用。
Issue我无法将菜单项从一级更改为另一级。我无法将菜单项反转回Parent如果我已经改变它是children of any parent。无论 Jquery Nestable 正在运行什么,它都会起作用。
下面的函数用于将菜单项更新到数据库,该数据库取决于
菜单栏如:id, 父ID, m_order.
该函数将检查内部$List数组依据foreach and 数组键存在如下描述:
- 从中获取数组数据form使用 $this->get_child($this->input->post('list'));
- Using Foreach and 数组键存在函数来检查任何孩子们 of $List数组,如果找到的话children它将按照下面的 CI 函数更新到数据库。
-
和这个if ($parent_id != $item['id']) {...}不会更新父 ID对于当前的id父母的。
public function savelist() {
if ($this->input->post('list')) {
$this->do_update($this->input->post('list'));
}
}
public function do_update($list, $parent_id = 0, &$m_order = 0) {
foreach ($list as $item) {
$m_order++;
$data = array(
'parent_id' => $parent_id,
'm_order' => $m_order,
);
if ($parent_id != $item['id']) {
$where = array('id' => $item['id']);
var_dump($data . ':' . $where);
$this->db->where($where);
$this->db->update('nav', $data);
}
if (array_key_exists("children", $item)) {
$this->do_update($item["children"], $item["id"], $m_order);
}
}
}
这个 Jquery Nestable 插件和 Ajax 功能用于将任何表单数据发送到服务器。
<script>
$(document).ready(function () {
var updateOutput = function (e) {
var list = e.length ? e : $(e.target), output = list.data('output');
$.ajax({
method: "POST",
url: "savelist",
data: {
list: list.nestable('serialize')
}, success: function (data) { //, textStatus, jqXHR
console.log(list.nestable('serialize'));
}
}).fail(function (jqXHR, textStatus, errorThrown) {
alert(" Unable to save new list order: " + errorThrown);
});
};
$('#nestable').nestable({
group: 1,
maxDepth: 7,
}).on('change', updateOutput);
});
</script>
然而我已经只创建了一张表来存储所有菜单项。我做了一个条件PHP检查Parent and Children当菜单id equal to 父ID这是我的表结构
CREATE TABLE IF NOT EXISTS `nav` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`uid` int(10) NOT NULL,
`text` varchar(500) NOT NULL,
`link` text NOT NULL,
`show_condition` int(5) NOT NULL,
`parent_id` int(5) NOT NULL,
`m_order` int(9) NOT NULL,
`class` varchar(50) NOT NULL,
`data` varchar(50) NOT NULL,
`des` text NOT NULL,
`lang` varchar(50) NOT NULL,
`accord` int(3) NOT NULL,
`footer` int(3) NOT NULL,
`f_sta` int(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
最后我得到了如下图所示的菜单编辑器,它让我只能更改一级操作系统菜单。