如何使用带有Codeigniter的jQuery Nestable插件创建子级菜单?

我正在使用带有Codeigniter3的jQuery Nestable插件为网站创建5个级别的菜单,这是一个很好的解决方案,用户可以单调和删除以更改菜单项的级别和位置。 但是我的下面的function只能创建第一级菜单,当我更改为菜单项的子级别(2,3,4,5)时,它对我不起作用。

问题我无法将菜单项从第一级更改为另一级。 如果我把它改成父母孩子 ,我就无法将菜单项反转回Parent 。 无论Jquery Nestable如何努力工作。

以下函数用于将菜单项更新为依赖于菜单列的数据库,如: idparent_idm_order

此函数将通过foreacharray_key_exists检查$ List数组内部,如下所述:

  1. 使用$ this-> get_child($ this-> input-> post(’list’))从表单中获取数组数据;
  2. 使用Foreacharray_key_exists函数检查$ List数组的任何子项,如果找到任何子项,它将更新到数据库,如下面的CI函数。
  3. 而这个if($ parent_id!= $ item [‘id’]){…}将不会更新parent_id作为parent的当前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 Plugin和Ajax函数用于将任何表单数据发送到服务器。

  $(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); });  

我怎么只创建一个表来存储所有菜单项。 当我的菜单ID 等于 Parent_id时,我在PHP中创建一个条件来检查 ,这是我的表结构

 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 ; 

最后我得到了菜单编辑器,如下图所示,我只能更改一个级别的菜单。

在此处输入图像描述

我有与你的相同的要求和锻炼,看看我的代码几乎与你的相同,

这是我的控制器:

 public function select_menu_priority() { $data['product'] = $this->menu_model->select_menu_priority(); $data['li'] = $this->generate_li($data['product']); $this->load->view("set_menu_priority_table", $data); } function generate_li($product,$parent = NULL){ $li = ""; $p1 = array_filter($product, function($a)use($parent){ return $a['parent_menu_id'] == $parent; }); foreach ($p1 as $p){ $inner_li = ""; $p2 = array_filter($product,function($a)use($p){ return $a['parent_menu_id'] == $p['id']; }); if($p2){ $inner_li = $this->generate_li($product,$p['id']); } $li .= "
  • ".$p['title']."
    ".$inner_li."
  • "; } $ol = "
      ".$li."
    "; return $ol; }

    查看set_menu_priority_table.php:

     input->post("entity"); $entity = $entity['id']; if (count($product) > 0) { ?> 

    Go to Category PriorityDrag Menu to set Priority.

    No found.Go to Category Priority

    Please select Category to Set Priority within the Category.

    更新优先级在Controller中添加functionupdate_menu_priority

     public function update_menu_priority() { $data = $this->input->post("product_data"); if (count($data)) { $update = $this->menu_model->update_priority_data($data); if ($update) { $result['status'] = "success"; } else { $result['status'] = "error"; } } else { $result['status'] = "error"; } echo json_encode($result); } 

    最后,该update_priority_data广告模型function:

     function update_priority_data($data, $parent = NULL) { $i = 1; foreach ($data as $d) { if (array_key_exists("children", $d)) { $this->update_priority_data($d['children'], $d['id']); } $update_array = array("priority" => $i, "parent_menu_id" => $parent); $update = $this->db->where("id", $d['id'])->update("menu", $update_array); $i++; } return $update; } 

    谢谢,我希望这对你有所帮助。