메뉴를 수동으로 일일이 작성하지 않고 PHP/MySQL 과 연동하여 테이블 정보를 자동으로 읽어서 메뉴가 생성되도록 하는 방법이다.
=== index.php ===
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta name="apple-mobile-web-app-capable" content="no" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title>Multi level dropdown menu in Bootstrap 3</title>
<link rel="stylesheet" href="css/topmenu.css" />
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
<script src="http://code.jquery.com/jquery.min.js" ></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<!--[if lt IE 9]> <!-- 5. 인터넷익스플로러 9버전 이하일 경우 html5가 인식될 수 있게 해주는 스크립트 -->
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<script src="bootstrap/js/respond.min.js"></script>
<script src="js/topmenu.js"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.php">Home</a>
</div>
<div class="collapse navbar-collapse" id="navbar-collapse-1">
<ul class="nav navbar-nav">
<?php require_once 'menu.php';?>
</ul>
</div>
</div>
</nav>
</body>
</html>
=== menu.php ===
<?php
require_once 'dbconnect.php';
$sql = "SELECT * FROM menu_items";
$res = mysqli_query($dbconn, $sql);
while($row = mysqli_fetch_assoc($res)){
$menu[] = $row;
}
$top_menu = bootstrap_menu($menu);
echo $top_menu;
function bootstrap_menu($array,$parent_id = 0,$parents = array())
{
if($parent_id==0) {
foreach ($array as $element) {
if (($element['parent_id'] != 0) && !in_array($element['parent_id'],$parents)) {
$parents[] = $element['parent_id'];
}
}
}
$php_menu = '';
foreach($array as $element) {
if($element['parent_id']==$parent_id) {
if(in_array($element['id'],$parents)) {
$dropdown_sub=$parent_id > 0 ? 'dropdown-submenu':'';
$php_menu .= '<li class="dropdown '.$dropdown_sub.'">';
$php_menu .= '<a href="'.$element['url'].'" class="dropdown-toggle" data-toggle="dropdown">'.$element['name'].' <span class="caret"></span></a>';
} else {
$php_menu .= '<li>';
$php_menu .= '<a href="' . $element['url'] . '">' . $element['name'] . '</a>';
}
if(in_array($element['id'],$parents)) {
$php_menu .= '<ul class="dropdown-menu">';
$php_menu .= bootstrap_menu($array, $element['id'], $parents);
$php_menu .= '</ul>';
}
$php_menu .= '</li>';
}
}
return $php_menu;
}
?>
=== topmenu.css ===
/* dropdown submenu */
.dropdown-submenu{position:relative;}
.dropdown-submenu>.dropdown-menu{
top:0;left:100%;
margin-top:-6px;
margin-left:-1px;
-webkit-border-radius:0 6px 6px 6px;
-moz-border-radius:0 6px 6px 6px;
border-radius:0 6px 6px 6px;
}
.dropdown-submenu>a:after{
display:block;
content:" ";
float:right;
width:0;
height:0;
border-color:transparent;
border-style:solid;
border-width:5px 0 5px 5px;
border-left-color:#cccccc;
margin-top:5px;
margin-right:-10px;
}
.dropdown-submenu:hover>a:after{
border-left-color:#555;
}
.dropdown-submenu.pull-left{float:none;}
.dropdown-submenu.pull-left>.dropdown-menu{
left:-100%;
margin-left:10px;
-webkit-border-radius:6px 0 6px 6px;
-moz-border-radius:6px 0 6px 6px;
border-radius:6px 0 6px 6px;
}
@media only screen and (max-width: 768px) {
}
@media only screen and (min-width: 768px) {
/* 스마트폰에서는 동작하지 않게 */
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
}
=== topmenu.js ===
$(function(){
$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
event.preventDefault();
event.stopPropagation();
$(this).parent().siblings().removeClass('open');
$(this).parent().toggleClass('open');
});
// 현재 선택한 메뉴 : active
$("ul li").click(function() {
// remove classes from all
$("ul .active").removeClass("active");
// add class to the one we clicked
$(this).addClass("active");
});
});
=== db 스키마 ===
CREATE TABLE IF NOT EXISTS `menu_items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` varchar(11) DEFAULT NULL,
`name` varchar(200) NOT NULL,
`url` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
INSERT INTO `menu_items` (`id`, `parent_id`, `name`, `url`) VALUES
(1, '0', 'Daum', 'http://www.daum.net'),
(2, '0', 'Java', '#'),
(3, '0', 'PHP', '#'),
(4, '3', 'PHP Tutorial', '#'),
(5, '3', '사이트', '#'),
(6, '5', '티스토리', '#'),
(7, '2', 'Java Tutorial', '#'),
(8, '2', 'Java Resources', '#'),
(9, '2', '테이블', 'table.php'),
(10, '5', '네이버', 'http://www.naver.com'),
(11, '3', 'PHP Resources', '#');
메뉴 자동으로 생성하는 것은 구글에서 treemenu 를 검색하면 나온다.
이걸 부트스트랩 기반에 적용하는 것이다.
관리자 화면에서 메뉴를 자동으로 생성하는 것은 아직 완벽하게 만들어놓지 않아서 작성하지 않는다.
다만, 참조할 게시글만 적어둔다.
http://link2me.tistory.com/1146
http://www.phpzag.com/ 사이트에 보면 도움된다.
그리고 구글링으로 jstree 를 검색하면 나온다.
http://phpflow.com/php/dynamic-tree-with-jstree-php-and-mysql/
기존 treemenu를 부트스트랩 기반으로 연동하는 걸 테스트 하는 중이다.
jQuery 기반 동작 소스를 부트스트랩 기반으로 완벽하게 처리할 때까지 시도해볼 생각이다.
'Web 프로그램 > 메뉴 만들기' 카테고리의 다른 글
메뉴 가로 정렬과 세로정렬 (0) | 2018.04.24 |
---|---|
다차원 배열 단순화 및 TreeView SQL (1) | 2017.12.28 |
[bootstrap] Multi level dropdown menu (0) | 2017.02.13 |
[bootstrap] navbar-fixed-top 설정때문에 (0) | 2017.02.07 |
[bootstrap] TopMenu, 로그인, 로그아웃 처리 (0) | 2017.02.01 |