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; } }