'2019/02/27'에 해당되는 글 1건

728x90

MDB(Meterial Design for Bootstrap) 에서 sidenav 에 표시할 메뉴를 PHP 와 연동하여 자동으로 표시하는 방법을 구현했다.


먼저, 구글에서 multi level sidenav 를 검색하면 https://mdbootstrap.com/support/jquery/multi-level-in-sidenav-items/ 가 검색될 것이다.


검색된 Tree 구조는 아래와 같다.

 <li>
    <ul class="collapsible collapsible-accordion">
    <li><a class="collapsible-header waves-effect arrow-r"><i class="fa fa-hand-pointer-o"></i>메뉴1-1<i class="fa fa-angle-down rotate-icon"></i></a>
    <div class="collapsible-body">
        <ul>
            <li>
            <ul class="collapsible collapsible-accordion">
            <li><a class="collapsible-header waves-effect arrow-r"><i class="fa fa-hand-pointer-o"></i>메뉴2-1</a>
            <div class="collapsible-body">
                <ul>
                <li><a href="#" class="waves-effect">메뉴3-1</a></li>
                <li><a href="#" class="waves-effect">메뉴3-2</a></li>
                <li><a href="#" class="waves-effect">메뉴3-3</a></li>
                </ul>
            </div>
            </li>
        </ul>

        <ul>
        <li><a href="#" class="collapsible-header waves-effect">메뉴2-2</a></li>
        </ul>

    </div>
    </li>
    </ul>
</li>

<li>
    <a href="#" class="collapsible-header waves-effect">메뉴1-2</a>
</li>


이걸 가지고 PHP 와 연동된 자동 메뉴를 만들어 보자.

MDB 는 bootstrap 4 기반으로 연동된 템플릿이다.

bootstrap 4 에서는 순환구조가 매끄럽지 못한 거 같다. (내가 제대로 이해를 못했겠지만....)


테이블 구조

CREATE TABLE IF NOT EXISTS `menu_item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `depth` int(3) NOT NULL DEFAULT '1',
  `name` varchar(50) NOT NULL,
  `text` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 


Treeview 메뉴 코드

아래 코드는 https://link2me.tistory.com/1194 게시글과 비교하면서 살펴보면 도움될 것이다.

파일명 : muti_treeview.php

 <?php
if(!isset($_SESSION)) {
    session_start();
}
require_once 'path.php'; // root 폴더를 기준으로 상대적인 경로 자동 구하기
require_once $g['path_config'].'config.php';
require_once $g['path_config'].'dbconnect.php';
require_once $g['path_class'].'dbDataClass.php';
$d = new DBDataClass();
$res = $d->getDbresult("menu_item", "", "id,parent_id,name");
while($row = mysqli_fetch_assoc($res)){
    $sidemenu[] = $row;
}

$side_menu = bootstrap4_sideMenu($sidemenu);
echo $side_menu;

function bootstrap4_sideMenu($array,$parent_id = 0,$parents = array())
{
    global $d,$key;
    if($parent_id==0){ // sub가 있는 parent_id 값 추출
        foreach ($array as $element) {
            if (($element['parent_id'] != 0) && !in_array($element['parent_id'],$parents)) {
                $parents[] = $element['parent_id'];
            }
        }
    }

    $menu_html = '';
    foreach($array as $element){
        if($element['parent_id']==$parent_id){
            $url = $element['id'].";".$element['parent_id'];            

            if(in_array($element['id'],$parents)){
                $menu_html .= '<li>';
                $menu_html .= '<ul class="collapsible collapsible-accordion">';
                $menu_html .= '<li><a class="collapsible-header waves-effect arrow-r" href="'.$url.'"><i class="fa-hand-pointer-o">';
                $menu_html .= '</i>'.$element['name'].'<i class="fas fa-angle-down rotate-icon"></i></a>';
                $menu_html .= '<div class="collapsible-body">';

            } else {
                $menu_html .= '<li>';
                $menu_html .= '<a class="collapsible-header waves-effect" href="'.$url.'">'.$element['name'].'</a>';
                $menu_html .= '</li>';
            }

            if(in_array($element['id'],$parents)){
                $menu_html .= '<ul>';
                $menu_html .= bootstrap4_sideMenu($array, $element['id'], $parents);
                $menu_html .= '</ul>';
                $menu_html .= '</div>';
                $menu_html .= '</ul>';
                $menu_html .= '</li>';
            }
           
        }
    }
    return $menu_html;
}
?>


이제 MDB 템플릿 구조에 포함된 HTML 파일구조다. jQuery 코드는 모두 생략했다.

<!DOCTYPE html>
<head>
<?php require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기 ?>
<?php require_once $g['path_config'].'config.php';?>
<?php require_once $g['path_layout'].'default/_import.head.php';?>
<?php require_once $g['path_root'].'deviceChk.php';?>
</head>

<body class="fixed-sn mdb-skin">
<header>
    <!-- Sidebar navigation -->
    <div id="slide-out" class="side-nav sn-bg-4 fixed">
        <ul class="custom-scrollbar">
            <!-- Side navigation links -->
            <?php require_once $g['path_menu'].'item/multi_treeview.php' ?>
        </ul>
        <div class="sidenav-bg mask-strong"></div>
    </div><!--/. Sidebar navigation -->
    <!-- Navbar -->
    <nav class="navbar fixed-top navbar-toggleable-md navbar-expand-lg scrolling-navbar double-nav">
        <!-- SideNav slide-out button -->
        <div class="float-left">
            <a href="#" data-activates="slide-out" class="button-collapse"><i class="fas fa-bars"></i></a>
        </div>
        <!-- Breadcrumb-->
        <div class="breadcrumb-dn mr-auto">
            <p><?=$hostName;?></p>
        </div>
        <ul class="nav navbar-nav nav-flex-icons ml-auto">
            <?php require_once $g['path_menu'].'item/item_login.php' ?>
        </ul>
    </nav>
    <!-- /.Navbar -->
</header>

<!--Main layout-->
<main>
    <div class="container-fluid text-center">
        <div class="row">
            <div class="col-md-12">
                <div class="content" id="panel_content">
                </div>
                <div id="ajaxPath" menu-path="<?php echo $g['path_help'];?>"  ></div>
            </div>
        </div>
    </div>
</main>
<!--/Main layout-->
<!-- SCRIPTS -->
<?php require_once $g['path_layout'].'default/_import.tail.php';?>
</body>
</html>


블로그 이미지

Link2Me

,