Yii2 菜單menu管理

前面寫了一篇Yii2-admin RBAC權限管理的實現 有朋友在評論裏問了關於menu的使用,在這裏我作一下統一的回答,稍微講解一下我平時在項目中是怎麼使用menu的。php

menu表是根據權限來控制後臺菜單的顯示和隱藏的。html

先來看看錶結構:sql

-- ----------------------------  
-- Table structure for yc_menu  
-- ----------------------------  
DROP TABLE IF EXISTS `yc_menu`;  
CREATE TABLE `yc_menu` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(128) NOT NULL,  
  `parent` int(11) DEFAULT NULL,  
  `route` varchar(256) DEFAULT NULL,  
  `order` int(11) DEFAULT NULL,  
  `data` text,  
  PRIMARY KEY (`id`),  
  KEY `parent` (`parent`),  
  KEY `name` (`name`),  
  KEY `route` (`route`(255)),  
  KEY `order` (`order`),  
  CONSTRAINT `dh_menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `dh_menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系統管理員菜單權限表';

這裏詳細介紹幾個主要的字段:數據庫

name 是菜單的名稱;yii2

parent 是父類菜單的名稱,留空則表示頂級菜單;app

route 指的是菜單的URL;yii

在數據庫裏的表現:post

在頁面上的表現:url

使用方式:spa

<ul id="main-menu" class="main-menu">
    <li class="<?php if (Yii::$app->controller->id == 'site'){echo 'active';}?>">
    	<a href="/site/index">
    	  <i class="linecons-cloud"></i>
        <span class="title">HOME</span>
    	</a>
    </li>
    <?php $i=0;foreach (MenuHelper::getAssignedMenu(\Yii::$app->user->id) as $k=>$p_menu) {
          if(!empty($p_menu['items'])){
                $if_menu=0;
                $url=parse_url($_SERVER["REQUEST_URI"]);
                $url_arr =  array_filter(explode("/", $url['path']));
                $url_items=$item_arr=[];
                //根據URL判斷顯示
                foreach($p_menu['items'] as $val){
                    if($val['url'][0]){
                        $item_arr = array_filter(explode("/", $val['url'][0]));
                    }
                    $url_items[]=$item_arr[1];
                }
                if(isset($url_arr[1]) && in_array($url_arr[1], $url_items)){
                    $if_menu=1;
                }
  ?>
  <li <?php echo $if_menu==1?'class="active"':''; ?>>
      <a href="<?php echo $p_menu['url']; ?>">
           <i class="<?php echo $linecons[$i];$i++; ?>"></i>
           <span class="title"><?=$p_menu['label']?></span>
      </a>
  <?php if(!empty($p_menu['items'])){ ?>
      <ul <?php echo $if_menu==1?'style="display: block;"':''; ?>>
          <?php foreach ($p_menu['items'] as $c_menu) {?>
          <li>
         	<a href="<?= $c_menu['url'][0] ?>">
         	<span class="title"><?= $c_menu['label'] ?></span>
         	</a>
         </li>
   <?php } ?>
      </ul>
   <?php } ?>
   </li>
   <?php }else{ ?>
         <li>
             <a href="<?= $p_menu['url'][0] ?>"><i class="icon-bar-chart"></i><?=$p_menu['label']?></a>
         </li>
   <?php }} ?>
</ul>

  這裏使用到啦yii2-admin下的MenuHelper類getAssignedMenu方法,該方法用於獲取用戶對應的菜單信息.

  在config\params.php下配置

return [
    'adminEmail' => 'admin@example.com',
    'mdm.admin.configs' => [
        'db' => 'db',
        'menuTable' => '{{%yc_menu}}',
        'cache' => null,
        'cacheDuration' => 3600
    ],
];

  最終顯示結果:

相關文章
相關標籤/搜索