houdunwang / view
日志管理
Installs: 1 575
Dependents: 2
Suggesters: 0
Security: 0
Stars: 1
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: >=5.4.0
- houdunwang/arr: ~1.0
- houdunwang/cache: ~1.0
- houdunwang/config: ~1.0
Requires (Dev)
- phpunit/phpunit: ^6.1
README
#视图模板组件
##介绍 视图组件分开了逻辑程序和外在的内容 , 提供了一种易于管理的方法。可以描述为应用程序员和美工扮演了不同的角色 , 因为在大多数情况下 , 他们不可能是同一个人。例如 , 你正在创建一个用于浏览新闻的网页 , 新闻标题 , 标签栏 , 作者和内容等都是内容要素 , 他们并不包含应该怎样去呈现。模板设计者们编辑模板 , 组合使用 html 标签和模板标签去格式化这些要素的输出 (html 表格 , 背景色 , 字体大小 , 样式表 , 等等 )。 有一天程序员想要改变文章检索的方式 ( 也就是程序逻辑的改变 )。这个改变不影响模板设计者 , 内容仍将准确的输出到模板。同样的 , 哪天美工想要完全重做界面也不会影响到程序逻辑。因此 , 程序员可以改变逻辑而不需要重新构建模板 , 模板设计者可以改变模板而不影响到逻辑。 模版组件引擎是编译型模版引擎,模版文件只编译一次,以后程序会直接采用编译文件,效率非常高。
[TOC] #开始使用
####安装组件 使用 composer 命令进行安装或下载源代码使用。
composer require houdunwang/view
HDPHP 框架已经内置此组件,无需要安装
####配置
$config = [
/*
|--------------------------------------------------------------------------
| 开启调试模式
|--------------------------------------------------------------------------
*/
'debug' => true,
/*
|--------------------------------------------------------------------------
| 模板目录
|--------------------------------------------------------------------------
| 只参路由模式有效
| 控制器访问时无效
*/
'path' => 'view',
/*
|--------------------------------------------------------------------------
| 模板文件默认扩展名
|--------------------------------------------------------------------------
| 当使用模板时没有添加扩展名将使用下面定义的扩展名
*/
'prefix' => '.php',
/*
|--------------------------------------------------------------------------
| 扩展标签
|--------------------------------------------------------------------------
| 用于定义扩展的模板标签
*/
'tags' => [
\tests\app\Common::class
],
/*
|--------------------------------------------------------------------------
| 左边界符
|--------------------------------------------------------------------------
| 用于定义模板标签的左边界符
*/
'tag_left' => '<',
/*
|--------------------------------------------------------------------------
| 右边界符
|--------------------------------------------------------------------------
| 用于定义模板标签的右边界符
*/
'tag_right' => '>',
/*
|--------------------------------------------------------------------------
| Blade模板标签开关
|--------------------------------------------------------------------------
| 当设置为FALSE时,模板引擎的blade(父子级包含)功能将失效
*/
'blade' => true,
/*
|--------------------------------------------------------------------------
| 缓存目录
|--------------------------------------------------------------------------
| 框架支持缓存模板文件用于减少服务器压力
| 下面的配置项是定义缓存文件的存放目录
*/
'cache_dir' => 'tests/storage/view/cache',
/*
|--------------------------------------------------------------------------
| 编译目录
|--------------------------------------------------------------------------
| 模板引擎支持一次编译生成PHP代码这样可以提供系统运行性能
| 下面的配置项是定义编译文件的保存目录
*/
'compile_dir' => 'tests/storage/view/compile',
];
\houdunwang\config\Config::batch($config);
#模板文件 模板就是视图界面,模板会在路由与控制器中使用到,如果在路由回调函数中使用,因为没有模块所以与在控制器中使用还是有些不同的。
[TOC]
###语法
View::make($tpl,$vars=[]);
参数 说明
$tpl 模版文件
$vars 分配的变量
##使用 系统调用配置文件的策略如下:
- 模板文件存在时直接读取 如: View::make('index.php')
- 控制器中使用:模块/view/控制器/模板文件
- 路由中使用:到"view.php"配置文件设置的目录中查找
- 文件没有扩展名时以配置项 prefix 添加后缀
####控制器中使用 不设置模板时使用当前请求方法做为文件名
return View::make();
//没有参数时使用当前方法名称做为模板文件名
不添加后缀时使用配置项 prefix 设置的后缀。
return View::make('add');
//添加路径时分2种情况:
//1: 从网站根目录查找即:"add.php"
//2: 从模块的View目录查找:"模块/view/add.php"
####路由器中使用
Route::get('/',function(){
return View::make('index');
});
上面的代码会到"view.php"配置文件设置的目录中查找 index.php
##分配数据
[TOC]
####分配变量
View::with('uri','houdunwang.com');
//模板中读取方式:{{$uri}}
####以数组形式分配
View::with(['name'=>'后盾网','uri'=>'houdunwang.com']);
//模板中读取方式:{{$name}}
####在make时分配 View::make('index.html',['name'=>'后盾人']);
####点语法分配变量
View::with('module.name','后盾人');
//或
View::with(['module.name'=>'后盾人']);
//模板中使用以下方式读取
{{$module['name']}}
####分配变量并显示模板
return View::with(['name'=>'后盾网','uri'=>'houdunwang.com'])->make();
####获取分配的变量 vars() 方法用于获取使用 with()方法分配的所有变量
View::getVars();
##模板使用 通过View::with分配的变量在模板中使用{{变量名}}形式读取
####读取变量
{{$name}}
####读取配置项值
{{Config::get('database.user')}}
提示:在{{ }}中可以使用任意php函数
####忽略解析
@{{$name}}
#系统标签 模板标签是使用预先定义好的tag快速读取数据。开发者也可以根据项目需要扩展标签库。
[TOC]
##运算符 可以在属性中使用以下运算符:
eq ==
neq !=
lt <
gt >
lte <=
gte >=
####使用
<if value="$a gt 2">
</if>
##foreach 标签 foreach标签与 PHP 中的 foreach 使用方法一致
语法
<foreach from='变量' key='键名' value='键值'>
内容
</foreach>
####基本使用
<foreach from='$user' key='$key' value='$value'>
{{strtoupper($value)}}
</foreach>
####多重嵌套
<foreach from='$user' key='$key' value='$value'>
<foreach from='$value' key='$n'value='$m'>
{{$m}}
</foreach>
</foreach>
##list 标签 ####语法
<list from='变量' name='值' row='显示行数' empty='为空时显示内容'>
内容
</list>
####基本使用
<list from='$data' name='$d' row='10' start='0' empty='没有数据'>
{{$d['cname']}}
</list>
####间隔读取 表示每次间隔 2 条数据输出
<list from='$row' name='$n' step='2'>
{{$n['title']}}
</list>
####起始记录 从第 2 条数据开始显示
<list from='$row' name='$n' start='2'>
{{$n.title}}
</list>
####高级使用
<list from='$data' name='$n'>
<if value="$hd['list']['n']['first']">
{{$hd['list']['n']['index']}}: 这是第一条数据<br/>
<elseif value="$hd['list']['n']['last']"/>
{{$hd['list']['n']['index']}}: 最后一条记录<br/>
<else/>
{{$hd['list']['n']['index']}}:{{$n['title']}}<br/>
</if>
</list>
{{$hd['list']['n']['total']}} 部记录数
{{$hd['list']['n']['first']}} 是否为第 1 条记录
{{$hd['list']['n']['last']}} 是否为最后一条记录
{{$hd['list']['n']['total']}} 总记录数
{{$hd['list']['n']['index']}} 当前循环是第几条
##if 标签
<if value="$webname eq 'houdunwang'">
后盾网
</if>
##else 标签
<if value='$webname == "houdunwang"'>
后盾网
<elseif value='$webname == "baidu"'/>
百度
<else/>
其他网站
</if>
##include导入模板
<include file="header"/>
可以在include标签中使用任意的路径常量
<include file="VIEW_PATH/header"/>
导入指定的具体文件
<include file="template/index.html"/>
##php标签 用于生成php代码
<php>if(true){</php>
后盾网
<php>}</php>
##引入CSS文件 可以在标签中使用系统提供的url常量
<css file="__VIEW__/css/common.css"/>
##引入JavaScript文件 可以在标签中使用系统提供的url常量
<js file="__ROOT__/view/css/common.js/>
#扩展标签
框架提供了方便快速的标签定义,大大减少代码量,实现快速网站开发。 设置自定义标签简单、快速,下面我们来学习掌握框架自定义标签的使用方法。
[TOC]
##文件 ####创建文件 使用命令行创建标签类。
php hd make:tag Common
//系统将在 system/tag 目录中生成标签文件
####设置配置 修改config/view.php文件设置如下字段
'tags'=> [system\tag\Common::class]
##创建 标签代码可以放在任何目录中,只需要配置项中正确指定类即可。 ####代码
namespace system/tag;
use hdphp\view\TagBase;
class Common extends TagBase{
//标签声明
public $tags = [
//block说明 1:块标签 0:行标签
'test' => ['block' => 1, 'level' => 4]
];
/**
* 测试标签
* @param $attr 标签属性集合
* @param $content 标签嵌套内容,块标签才有值
* @param $view 视图服务对象
*/
public function _test($attr, $content, &$view){
return '33';
}
}
####说明
- 块标签设置level 用于定义系统解析标签嵌套层数
- 行标签不需要设置level
#缓存模板 缓存可以增加网站加载速度,减少数据库服务器的压力,结合路由操作可以实例与全站静态化相同的效果,并且操作更加便捷。
[TOC]
##创建 生成缓存文件,第二个参数为缓存时间,0(默认)为不缓存
return View::cache(100)->make('article');
//将article缓存100秒
##验证 验证当缓存是否有效
View::isCache('article');
##删除 删除缓存必须在 make 与 isCache 等方法前执行
View::delCache('article');
#模板继承 ##介绍 模板继承类似于PHP中的类继承,有两个角色一个是“布局模板(父模板)”用于定义相应的blade(区块),然后是继承“布局模板”的“视图模板”,视图模板定义块内容替换布局模板中相应的blade区域。
[TOC] ####特点
- 布局模板用于定义区块
- 视图模板用于定义替换布局模板的内容
- 布局模板可以被多个 视图模板 继承
##使用 ####布局模板(父模板) 布局模板是被子模板调用的,不需要在控制器或路由中读取。比如下面的模板文件 master.php ,子模板要调用时可以使用 继承这个父模板。
<html>
<head>
<title>Blade 页面布局(父模板)</title>
</head>
<body>
<blade name="content"/>
<widget name="header">
头部内容(父页面 widget标签内容) {{$title}}
</widget>
<widget name="footer">
底部内容(父页面 widget标签内容)
</widget>
</body>
</html>
####视图模板(子模板) 视图模板指我们在控制器或路由中使用 View::make() 或 view() 函数显示的模板。
<extend file='master'/>
<block name="content">
<parent name="header" title="这是标题">
这是主体内容
<parent name="footer">
</block>
####说明
- extend用于继承 布局模板(父级),必须放在 parent、block 等标签前面调用
- 使用block标签定义视图内容,block替换“父级模板"中相同name属性的blade标签
- parent标签用于将父级模板 widget标签内容显示到此处
- parent标签支持向父级传递内容如上例中的title,父级中使用{{title}}方式调用
#视图函数
[TOC] ##view view函数是View::make()的函数调用方式,就是解析模板使用的。
##widget组件函数 大家不要将 widget 函数与 模板标签中的 widget标签混淆,虽然都在在视图模板中使用,但功能略有不同。
widget函数用于在视图中调用类方法,类方法可以使用View::make()等组件或任何动作只要返回的字符串都会在调用 widget方法的模板位置显示,大家通过下面实例来加深印象。
####类文件定义
namespace app;
class Widget {
public function show($a,$b){
return 'hello hdphp!'.$b;
}
}
####模板中调用
{{widget('app.widget.show',99,'hdphp')}}
widget方法的第一个参数为调用的类方法,以后的参数都是类方法的参数。 上例中将在模板中显示 ‘hello hdphp! hdphp'
##truncate截取内容
{{truncate('后盾人 人人做后盾',3)}}
//结果为:后盾人