如何使用带有Codeigniter的jQuery Nestable插件创建子级菜单?
我正在使用带有Codeigniter3的jQuery Nestable插件为网站创建5个级别的菜单,这是一个很好的解决方案,用户可以单调和删除以更改菜单项的级别和位置。 但是我的下面的function只能创建第一级菜单,当我更改为菜单项的子级别(2,3,4,5)时,它对我不起作用。
问题我无法将菜单项从第一级更改为另一级。 如果我把它改成父母的孩子 ,我就无法将菜单项反转回Parent 。 无论Jquery Nestable如何努力工作。
以下函数用于将菜单项更新为依赖于菜单列的数据库,如: id , parent_id , m_order 。
此函数将通过foreach和array_key_exists检查$ List数组内部,如下所述:
- 使用$ this-> get_child($ this-> input-> post(’list’))从表单中获取数组数据;
- 使用Foreach和array_key_exists函数检查$ List数组的任何子项,如果找到任何子项,它将更新到数据库,如下面的CI函数。
-
而这个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; }
谢谢,我希望这对你有所帮助。