Yii2 框架 - 禁用 Bootstrap 并引入 Layui

310 阅读1分钟

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',
];

效果图

Snipaste_2023-03-22_16-38-18.png