PHP Yii2 框架基础和高级模板默认都使用 Bootstrap 作为前端 UI,实际开发中我们都习惯使用自己熟悉的其它 UI 框架,比如 Layui 等等,本文演示如何禁用 Yii2 中的 Bootstrap 以及引入 Layui 进行替代。
资源包
Yii2 中使用资源包来管理前端资源,默认的 Bootstrap 也是使用资源包的方式来引入的。
从/assets/AppAsset.php
中我们可以看到$depends
中引入了 yii\bootstrap5\BootstrapAsset
,当 AppAsset
注册的时候Bootstrap
的 CSS 和 JS 就会被自动加载到项目中。
资源包注册通常写在布局文件中,在布局文件views/layouts/main.php
中我们可以找到 AppAsset
的注册代码
AppAsset::register($this);
当然引入资源包还有其它一些方法,详细可以查阅官方文档
禁用 bootstrap
去掉 AppAsset.php 中的引入的 BootstrapAsset 并不能禁用 bootstrap
正确的做法是在/config/web.php
添加一些配置来禁用
// /config/web.php
<?php
$config = [
'components' => [
'assetManager' => [
'bundles' => [
\yii\bootstrap5\BootstrapAsset::class => false,
\yii\bootstrap5\BootstrapPluginAsset::class => false,
]
],
]
];
禁用掉 Jquery(如有需求)
\yii\web\JqueryAsset::class => false
添加了上面的配置后,默认已经不会加载 bootstrap 相关的文件了
使用 Layui
首先需要安装 Layui,执行 npm i layui
命令进行安装,执行完毕后会看到根目录多了一个 node_modules
文件夹,为了能定位到这个文件夹的位置,我们需要添加一个别名,修改/config/web.php
添加一个@node
别名
// /config/web.php
<?php
$config = [
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
'@node' => '@app/node_modules'
]
];
定义 Layui 资源包
新建文件/assets/LayuiAsset.php
// /assets/LayuiAsset.php
<?php
namespace app\assets;
use yii\web\AssetBundle;
class LayuiAsset extends AssetBundle
{
public $sourcePath = '@node/layui/dist';
public $css = [
'css/layui.css'
];
public $js = [
'layui.js'
];
}
由于根目录的文件夹 node_modules 无法通过 Web 进行访问,所以需要设置类的 sourcePath。
如果是在/web
目录内的资源文件,则需要设置basePath
属性和baseUrl
,/assets/LayuiAsset.php
引入的site.css
就是一个例子。
下一步,修改/assets/LayuiAsset.php
,将 LayuiAsset 添加到$depends
中
// assets/LayuiAsset.php
public $depends = [
'yii\web\YiiAsset',
// 'yii\bootstrap5\BootstrapAsset'
LayuiAsset::class,
];
至此,已完成将 Bootstrap 禁用并添加 Layui 的所有操作。
替换布局文件
新建文件/views/layouts/app.php
,布局文件来自 Layui 管理界面布局
// /views/layouts/app.php
<?php
/** @var yii\web\View $this */
/** @var string $content */
use app\assets\AppAsset;
use yii\helpers\Html;
AppAsset::register($this);
$this->registerCsrfMetaTags();
$this->registerMetaTag(['charset' => Yii::$app->charset], 'charset');
$this->registerMetaTag(['name' => 'viewport', 'content' => 'width=device-width, initial-scale=1, shrink-to-fit=no']);
$this->registerMetaTag(['name' => 'description', 'content' => $this->params['meta_description'] ?? '']);
$this->registerMetaTag(['name' => 'keywords', 'content' => $this->params['meta_keywords'] ?? '']);
$this->registerLinkTag(['rel' => 'icon', 'type' => 'image/x-icon', 'href' => Yii::getAlias('@web/favicon.ico')]);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html>
<head>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo layui-hide-xs layui-bg-black">layout demo</div>
<!-- 头部区域(可配合layui 已有的水平导航) -->
<ul class="layui-nav layui-layout-left">
<!-- 移动端显示 -->
<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
<i class="layui-icon layui-icon-spread-left"></i>
</li>
<li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li>
<li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li>
<li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li>
<li class="layui-nav-item">
<a href="javascript:;">nav groups</a>
<dl class="layui-nav-child">
<dd><a href="">menu 11</a></dd>
<dd><a href="">menu 22</a></dd>
<dd><a href="">menu 33</a></dd>
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item layui-hide layui-show-md-inline-block">
<a href="javascript:;">
<img src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" class="layui-nav-img">
tester
</a>
<dl class="layui-nav-child">
<dd><a href="">Your Profile</a></dd>
<dd><a href="">Settings</a></dd>
<dd><a href="">Sign out</a></dd>
</dl>
</li>
<li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
<a href="javascript:;">
<i class="layui-icon layui-icon-more-vertical"></i>
</a>
</li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
<ul class="layui-nav layui-nav-tree" lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;">menu group 1</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">menu 1</a></dd>
<dd><a href="javascript:;">menu 2</a></dd>
<dd><a href="javascript:;">menu 3</a></dd>
<dd><a href="">the links</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">menu group 2</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">list 1</a></dd>
<dd><a href="javascript:;">list 2</a></dd>
<dd><a href="">超链接</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">click menu item</a></li>
<li class="layui-nav-item"><a href="">the links</a></li>
</ul>
</div>
</div>
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;"><?= $content ?>/div>
</div>
<div class="layui-footer">
<!-- 底部固定区域 -->
底部固定区域
</div>
</div>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
新建/web/js/site.js
并将其添加到/assets/AppAsset.php
文件中
// /web/js/site.js
layui.use(['element', 'layer', 'util'], function(){
var element = layui.element
,layer = layui.layer
,util = layui.util
,$ = layui.$;
//头部事件
util.event('lay-header-event', {
//左侧菜单事件
menuLeft: function(othis){
layer.msg('展开左侧菜单的操作', {icon: 0});
}
,menuRight: function(){
layer.open({
type: 1
,content: '<div style="padding: 15px;">处理右侧面板的操作</div>'
,area: ['260px', '100%']
,offset: 'rt' //右上角
,anim: 5
,shadeClose: true
});
}
});
});
// /assets/AppAsset.php
public $js = [
'js/site.js'
];
加载新的布局
// /config/web.php
$config = [
'layout' => 'app',
];
效果图