Подтвердить что ты не робот

Как создать дополнительный уровень меню с помощью плагина jQuery Nestable с помощью Codeigniter?

Я использую плагин jQuery Nestable с Codeigniter3, чтобы создать 5 уровней меню для веб-сайта, которое может помочь правильному решению пользователя для изменения уровня и положения пунктов меню. Однако моя нижняя функция может создавать только первый уровень меню, и когда я перехожу на суб-уровень (2,3,4,5) пункта меню, он не будет работать для меня.

Проблема Я не мог изменить элемент меню на другой уровень с первого уровня. и я не мог отменить пункт меню до Родитель, если я изменил его как детей любого родителя. Независимо от того, что работает JQuery Nestable, он будет работать.

Эта функция используется для обновления пункта меню до базы данных, которая зависит от Таблица меню: id, Parent_id, m_order.

Эта функция будет проверяться внутри массива $List foreach и array_key_exists как описано ниже:

  • получить данные массива из формы с помощью $this- > get_child ($ this- > input- > post ('list'));
  • Использование функции Foreach и array_key_exists для проверки любого дочернего массива $List и если он найдет любой children, он будет обновляться до базы данных, как показано ниже. Функция CI.
  • И этот if ($ parent_id!= $item ['id']) {...} не будет обновлять parent_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 Plugin и функция 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, чтобы проверить Родительский и Дети, когда меню id равно до Parent_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 ;

Наконец, я получил редактор меню, как показано ниже, что позволило мне изменить только одно меню уровня os.

введите описание изображения здесь

4b9b3361

Ответ 1

У меня есть те же требования, что и у вас, и тренировка с этим взглядом на мой код, который почти такой же, как у вас,

Вот мой контроллер:

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:

<?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 в контроллере:

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

Надеюсь, это поможет вам, спасибо.