当前位置:  首页>> 技术小册>> Yii2框架从入门到精通(中)

12.6.7 集成AdminLTE后台主题及菜单展示

在Web应用的开发中,后台管理界面的美观与易用性对于提升用户体验至关重要。Yii2框架作为一个高效、灵活的PHP开发框架,支持通过集成第三方主题库来快速搭建美观的后台管理系统。AdminLTE是一个流行的基于Bootstrap的后台管理模板,它提供了丰富的界面组件和预定义的样式,使得开发者能够轻松构建出既美观又实用的后台界面。本章节将详细介绍如何在Yii2项目中集成AdminLTE后台主题,并实现菜单的动态展示。

1. 准备工作

在开始集成之前,请确保你的Yii2项目已经搭建完成,并且具备基本的开发环境(如PHP、Composer、数据库等)。同时,你还需要了解Yii2的模块、视图、布局等基本概念。

2. 引入AdminLTE

2.1 使用Composer安装

虽然AdminLTE通常不直接通过Composer安装(因为它是HTML/CSS/JS的集合,而非PHP库),但你可以通过Composer安装一些封装了AdminLTE的Yii2扩展包,这些扩展包可能已经为你处理好了文件结构和一些基础配置。如果找不到合适的扩展包,你也可以手动下载AdminLTE的官方资源包并整合到你的项目中。

这里,我们假设你选择手动下载AdminLTE。首先,访问AdminLTE的官方网站或GitHub仓库下载最新版本。下载后,解压并将所需文件(如CSS、JS、图片和HTML模板文件)放置到你的Yii2项目的合适位置,比如web/assets/adminlte目录下。

2.2 配置Asset Bundle

为了在Yii2中方便地管理和使用AdminLTE的CSS和JS文件,你需要创建一个Asset Bundle。在assets目录下创建一个新的PHP类文件,例如AdminLteAsset.php,并继承自yii\web\AssetBundle。在该类中,指定AdminLTE的CSS和JS文件的路径,以及其他必要的配置。

  1. // assets/AdminLteAsset.php
  2. namespace app\assets;
  3. use yii\web\AssetBundle;
  4. class AdminLteAsset extends AssetBundle
  5. {
  6. public $basePath = '@webroot';
  7. public $baseUrl = '@web';
  8. public $css = [
  9. 'assets/adminlte/css/adminlte.min.css',
  10. ];
  11. public $js = [
  12. 'assets/adminlte/js/adminlte.min.js',
  13. ];
  14. public $depends = [
  15. 'yii\web\YiiAsset',
  16. 'yii\bootstrap\BootstrapAsset',
  17. ];
  18. }

3. 布局文件调整

接下来,你需要在Yii2的布局文件中(通常是views/layouts/main.php或类似文件)引入AdminLTE的样式和脚本,并调整HTML结构以符合AdminLTE的布局要求。

  1. // views/layouts/main.php
  2. <?php
  3. use app\assets\AdminLteAsset;
  4. AdminLteAsset::register($this);
  5. ?>
  6. <!DOCTYPE html>
  7. <html lang="<?= Yii::$app->language ?>">
  8. <head>
  9. <!-- Meta tags and title -->
  10. <title><?= Html::encode($this->title) ?></title>
  11. <?php $this->head() ?>
  12. </head>
  13. <body class="hold-transition skin-blue sidebar-mini">
  14. <div class="wrapper">
  15. <!-- Header -->
  16. <header class="main-header">
  17. <!-- Logo -->
  18. <a href="index2.html" class="logo">
  19. <!-- mini logo for sidebar mini 50x50 pixels -->
  20. <span class="logo-mini"><b>A</b>LT</span>
  21. <!-- logo for regular state and mobile devices -->
  22. <span class="logo-lg"><b>Admin</b>LTE</span>
  23. </a>
  24. <!-- Header Navbar: style can be found in header.less -->
  25. <nav class="navbar navbar-static-top">
  26. <!-- Sidebar toggle button-->
  27. <a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
  28. <span class="sr-only">Toggle navigation</span>
  29. </a>
  30. <!-- Navbar Right Menu -->
  31. <div class="navbar-custom-menu">
  32. <ul class="nav navbar-nav">
  33. <!-- Messages: style can be found in dropdown.less-->
  34. <!-- Notifications: style can be found in dropdown.less -->
  35. <!-- Tasks: style can be found in dropdown.less -->
  36. <!-- User Account: style can be found in dropdown.less -->
  37. </ul>
  38. </div>
  39. </nav>
  40. </header>
  41. <!-- Left side column. contains the logo and sidebar -->
  42. <aside class="main-sidebar">
  43. <!-- sidebar: style can be found in sidebar.less -->
  44. <section class="sidebar">
  45. <!-- Sidebar user panel -->
  46. <div class="user-panel">
  47. <div class="pull-left image">
  48. <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image">
  49. </div>
  50. <div class="pull-left info">
  51. <p>Alexander Pierce</p>
  52. <a href="#"><i class="fa fa-circle text-success"></i> Online</a>
  53. </div>
  54. </div>
  55. <!-- Sidebar Menu -->
  56. <ul class="sidebar-menu" data-widget="tree">
  57. <!-- 动态菜单项将在这里通过PHP代码生成 -->
  58. <?php echo $this->render('_menu'); ?>
  59. </ul>
  60. </section>
  61. <!-- /.sidebar -->
  62. </aside>
  63. <!-- Content Wrapper. Contains page content -->
  64. <div class="content-wrapper">
  65. <!-- Content Header (Page header) -->
  66. <section class="content-header">
  67. <h1>
  68. <?= Html::encode($this->title) ?>
  69. <small>it all starts here</small>
  70. </h1>
  71. <ol class="breadcrumb">
  72. <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
  73. <li class="active"><?= Html::encode($this->title) ?></li>
  74. </ol>
  75. </section>
  76. <!-- Main content -->
  77. <section class="content">
  78. <?= $content ?>
  79. </section>
  80. <!-- /.content -->
  81. </div>
  82. <!-- /.content-wrapper -->
  83. <!-- Footer -->
  84. <footer class="main-footer">
  85. <div class="pull-right hidden-xs">
  86. <b>Version</b> 2.4.0
  87. </div>
  88. <strong>Copyright &copy; 2014-2019 <a href="https://adminlte.io">AdminLTE</a>.</strong> All rights
  89. reserved.
  90. </footer>
  91. </div>
  92. <!-- ./wrapper -->
  93. <?php $this->endBody() ?>
  94. </body>
  95. </html>

4. 实现动态菜单

为了实现动态菜单,你可以创建一个视图文件(如views/layouts/_menu.php),并在其中通过PHP代码生成菜单项。菜单项的数据可以来源于数据库、配置文件或硬编码的数组。这里以数据库为例,假设你有一个menu表来存储菜单项的信息。

  1. // views/layouts/_menu.php
  2. <?php
  3. use yii\helpers\Html;
  4. // 假设你有一个方法来从数据库获取菜单项
  5. $menuItems = \app\components\MenuHelper::getMenuItems();
  6. foreach ($menuItems as $item) {
  7. // 根据菜单项的级别和类型生成相应的HTML结构
  8. if ($item['parent_id'] == 0) { // 假设parent_id为0表示顶级菜单
  9. echo '<li class="treeview">';
  10. echo Html::a($item['label'], '#' . $item['url'], ['class' => 'treeview-link']);
  11. echo '<ul class="treeview-menu">';
  12. // 递归调用以生成子菜单项
  13. generateSubMenu($item['id'], $menuItems);
  14. echo '</ul>';
  15. echo '</li>';
  16. }
  17. }
  18. function generateSubMenu($parentId, $menuItems) {
  19. foreach ($menuItems as $item) {
  20. if ($item['parent_id'] == $parentId) {
  21. echo '<li>';
  22. echo Html::a($item['label'], '#' . $item['url']);
  23. if (isset($item['children']) && count($item['children']) > 0) {
  24. echo '<ul class="treeview-menu">';
  25. generateSubMenu($item['id'], $item['children']);
  26. echo '</ul>';
  27. }
  28. echo '</li>';
  29. }
  30. }
  31. }
  32. ?>

注意:上面的generateSubMenu函数是一个简化的示例,实际情况下你可能需要根据menuItems数组的具体结构来调整代码。此外,为了简化示例,MenuHelper::getMenuItems()方法并未在代码中定义,你需要根据自己的