如何创建子级菜单使用jQuery Nestable插件与Codeigniter? [英] How to create sub level of menus using jQuery Nestable plugin with Codeigniter?

查看:581
本文介绍了如何创建子级菜单使用jQuery Nestable插件与Codeigniter?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 jQuery Nestable插件 Codeigniter3 为网站创建5个级别的菜单,为用户提供了一个良好的解决方案,可以拖放更改级别和位置的菜单项。然而,我的下面的功能可以创建只有第一级菜单,当我改变到子级(2,3,4,5)的菜单项,它不会为我工作。

I'm using jQuery Nestable plugin with Codeigniter3 to create 5 levels of menus for website which a good solution for user can drab and drop to change the level and position of menus items. However my below function can create only first level of menus and when I change to sub level (2,3,4,5) of menu item it won't work for me.

问题我无法将菜单项更改为第一级的其他级别。如果我已将其更改为父级子级,则无法将菜单项还原为父级

Issue I could not change menus item to another level from level one. and I couldn't reversed menus item back to Parent if I've been changed it to be a children of any parent. Whatever Jquery Nestable is working very will.

以下函数用于将菜单项更新到依赖于
菜单项的数据库: id Parent_id m_order

This below function is using to update menus item to database which depend on Menus column like :id, Parent_id, m_order.

此功能将检查 / strong>数组, foreach array_key_exists ,如下所示:

This function will check up inside of $List array by foreach and array_key_exists as below description:


  1. 数据从表单使用$ this-> get_child($ this-> input-> post('list'));

  2. strong>和 array_key_exists 函数检查 $ List 数组的任何子树数据,如果发现任何

  3. 而此 if($ parent_id!= $ item ['id']){...}

  1. get array data from form using $this->get_child($this->input->post('list'));
  2. Using Foreach and array_key_exists function to check any childrent of $List array and if it found any children it will update to database as below CI function.
  3. And This if ($parent_id != $item['id']) {...} will not update parent_id for current id of parent.

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



b $ b

此Jquery Nestable插件和Ajax函数用于向服务器发送任何表单数据。

This Jquery Nestable Plugin and Ajax function is using to send any form data to server.

<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 中检查家长儿童,当菜单 ID 等于 Parent_id
这是我的表结构

How ever I've already create only one table to store all the menus item. and I make a conditional in PHP to check up Parent and Children when Menus id equal to Parent_id Here is my table structure

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 ;

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

The finally I got the menus editor as below image which let me change only one level os menus.

推荐答案

这里是我的控制器:

Here is my Controller:

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 .= "<li class='dd-item' data-id='".$p['id']."'><div class='dd-handle'>".$p['title']."</div>".$inner_li."</li>";

        }

        $ol = "<ol class='dd-list'>".$li."</ol>";

        return $ol;
    }

查看set_menu_priority_table.php:

View set_menu_priority_table.php:

<?php
if (isset($product)) {    
    $entity = $this->input->post("entity");
    $entity = $entity['id'];
    if (count($product) > 0) {
        ?>
        <div class="row-fluid" style="margin-bottom: 10px;">
            <button class="btn btn-success btn-sm" tabindex="4" id="save">
                <i class="fa fa-check"></i> Save
            </button>
            <p class="pull-right" style="margin-bottom: 10px;"><?php if ($entity == "product") { ?><a href="javascript:void(0)" id="show_category" class="text-success" style="margin-right:10px;font-weight: bold;text-decoration: underline">Go to Category Priority</a><?php } ?><span class="label label-info ">Drag Menu to set Priority.</span></p>            
            <div class="clear"></div>
        </div>
        <div class="dd" id="product_list">
            <input type="hidden" id="entity_type" name="entity" value="<?php echo $entity ?>" />    
            <?php echo $li; ?>
        </div>
    <?php } else { ?>        
        <p><span class="label label-warning">No <?php echo ($entity == "product") ? "product" : "category"; ?> found.</span><?php if ($entity == "product") { ?><a href="javascript:void(0)" id="show_category" class="text-success" style="margin-left:15px;font-weight: bold;text-decoration: underline">Go to Category Priority</a><?php } ?></p>            
        <?php
    }
} else {
    ?>
    <p class="label label-info">Please select Category to Set Priority within the Category.</p>
<?php } ?>

<script type="text/javascript">
$("#save").off("click").on("click", function() {
            var product_data = $("#product_list").nestable("serialize");
            var data = {product_data: product_data, entity: $("#entity_type").val()};
            if ($.bbq.getState("product_category") !== undefined) {
                data['product_category'] = $.bbq.getState("product_category");
            }
            ajax_call({
                url: '<?php echo site_url("admin/menu/update_menu_priority");?>',
                type: "post",
                dataType: "json",
                data: data,
                beforeSend: function() { },
                success: function(result) {
                    if (result['status'] == "success") {
                        alert("Priority Updated!");
                    } 
            });
        });
</script>

用于更新优先级添加函数 update_menu_priority in Controller:

For Update That Priority Add function update_menu_priority in Controller:

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);

    }

code> update_priority_data :

And at last ad model function for that update_priority_data:

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;
    }



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

I hope this would be help full to you, thanks.

这篇关于如何创建子级菜单使用jQuery Nestable插件与Codeigniter?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆