tp5自定义标签扩展,模块标签使用说明
模块标签说明
模块标签,以标签方式,自动引用模块代码,包含模块的 css、js、html、img 文件以及模块使用到的数据
模块标签让代码结构更加清晰,让程序更加方便和专注的对模块开发,类似于VUE组件,但更胜于它的是模块标签将样式文件与html等文件分离,而非堆在一个文件里
模块标签使用非常灵活,任意组合调用,一个页面可能就几行模块标签而以
模块标签使用说明
模块标签是tp5自定义扩展标签,按tp5说明使用即可
1. 下载Bp.php 自定义标签文件,放到 /app/common/taglib 目录下

2. 修改你的项目配置文件,模板设置 - 预先加载的标签库
// 预先加载的标签库
'taglib_pre_load' => 'app\common\taglib\Bp',
模块标签参数说明
| name | 模块名称 | 模块文件夹下的模块css、js、html文件都以模块名称命名 |
| dir | 模块存放路径 | |
| data | 模块数据 | 引用模块数据变量 $模块名称+Data, 例: $headData 数据赋可直接使用php语句 data="[1,2,3]" 此参数可不填 |
例:引入'/public/block'目录下的 header模块, 模块数据等于$data变量
{bp:blockphp name="header" dir="public/block" data="$data"}
header模块代码结构

模块标签配置说明
模块标签,会自动合并当前页面下的所有模块css和js文件并自动引入,默认存放路径 'runtime/blockStatic/',在模块标签代码第22行,可修改
模块标签开发调式,请开启 tp5 为应用调试模式,'app_debug' => true, 若未开启,则不会实时更新引入的css和js文件
一个企业网站首页的使用场景, 一个页面五行模块代码,就可以了

模块demo
模块标签代码
<?php
// +----------------------------------------------------------------------
// | Author: lijiadong <2420355482@qq.com> Update: 2020-07-05
// +----------------------------------------------------------------------
namespace app\common\taglib;
use think\template\TagLib;
class Bp extends TagLib{
/*
* 模块标签
* name 模块名称
* dir 模块路径
* data 模块数据
*/
protected $tags = [
'blockphp' => [
'attr' => 'name,dir,data','close' => 0
],
];
public $staticPath = 'runtime/blockStatic/'; //自定义模块样式存储路径
public $styleFile = false;
public $autoStyle = false;
public $updateStyle = false;
public function tagBlockphp($tag)
{
//tp是否在开启调试模式,如果是,则实时更新模块样式(需ctrl+f5刷新两次才生效)
if(!$this->updateStyle){
$phpCode = "<?php if(config('app_debug')){ deldir(RUNTIME_PATH.'temp/');} ?>";
$this->updateStyle = true;
}else{
$phpCode ='';
}
//初始化,模块样试文件
$site2 = explode('.',$_SERVER['HTTP_HOST'])[0];//域名前辍
if(request()->isMobile()){$equipment = 'm';}else{$equipment = 'pc';} //区分pc端与移动端
$cacheFolder = ROOT_PATH.$this->staticPath;
$cssFile = $cacheFolder.$equipment.'-'.$site2.'-'.request()->module().'-'.strtolower(request()->controller()).'-'.request()->action().'.css';
$jsFile = $cacheFolder.$equipment.'-'.$site2.'-'.request()->module().'-'.strtolower(request()->controller()).'-'.request()->action().'.js';
//判断缓存文件夹是否存在,不存在则创建
is_dir($cacheFolder)?null:mkdir($cacheFolder,0777,true);
if(!$this->styleFile){
//初始化css文件
is_file($cssFile)? file_put_contents($cssFile,''):null;
//初始化js文件
is_file($jsFile)? file_put_contents($jsFile,''):null;
$this->styleFile = true;
}
//判断文件是否存在
if(!is_dir(ROOT_PATH.$tag['dir'].'/'.$tag['name'])){
return '模块不存在';
}
//模块文件
$mkCss = ROOT_PATH.$tag['dir'].'/'.$tag['name'].'/'.$tag['name'].'.css';
$mkJs = ROOT_PATH.$tag['dir'].'/'.$tag['name'].'/'.$tag['name'].'.js';
$mkHtml =ROOT_PATH.$tag['dir'].'/'.$tag['name'].'/'.$tag['name'].'.html';
//代码换行
$br = '
';
//判断模块是否存在css,有就向模块总css新增
if(is_file($mkCss)){
$mkCssFile = $br.file_get_contents($mkCss);
//生成模块缓存文件并追加css缓存
if (!file_put_contents($cssFile,$mkCssFile,FILE_APPEND)) {
exit('ERROR:模块css文件生成出错!');
}
}
//判断模块是否存在js,有就向模块总css新增
if(is_file($mkJs)){
$mkJsFile = $br.file_get_contents($mkJs);
//生成模块缓存文件并追加css缓存
if (!file_put_contents($jsFile,$mkJsFile,FILE_APPEND)) {
exit('ERROR:模块js文件生成出错!');
}
}
//判断模块data数据是否存在,有就声明模块数据
$data = '';
if(isset($tag['data'])){
$data = '<?php $'.$tag['name'].'Data = '.$tag['data'].'; ?>';
}
//判断模块是否存在html,有就返回
$htmlFile = '';
if(is_file($mkHtml)){
$htmlFile = file_get_contents($mkHtml);
}
//自动引入模块样式
if(!$this->autoStyle){
$site2 = explode('.',$_SERVER['HTTP_HOST'])[0];//域名前辍
//区分pc端与移动端
if(request()->isMobile()){$equipment = 'm';}else{$equipment = 'pc';}
$cacheFolder = $this->staticPath;
$blockCssPath = request()->domain().'/'.$this->staticPath.$equipment.'-'.$site2.'-'.request()->module().'-'.strtolower(request()->controller()).'-'.request()->action().'.css';
$blockJsPath = request()->domain().'/'.$this->staticPath.$equipment.'-'.$site2.'-'.request()->module().'-'.strtolower(request()->controller()).'-'.request()->action().'.js';
$styleCode = '<script>
$(document).ready(function(){
//在head标签最后面引入模块css样式
var head = document.head || document.getElementsByTagName("head")[0];
var style = document.createElement("link");
style.setAttribute("rel", "stylesheet");
style.setAttribute("type", "text/css");
style.setAttribute("href", "'.$blockCssPath.'");
head.appendChild(style);
//在html标签最后面引入模块js样式
var html = document.html || document.getElementsByTagName("html")[0];
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", "'.$blockJsPath.'");
html.appendChild(script);
});
</script>';
//$styleCode ='';
$this->autoStyle = true;
}else{
$styleCode = '';
}
return $phpCode.$data.$htmlFile.$styleCode;
}
}