目录
0x00视图创建:
文件分布:Index模块下有个controller目录,model目录,view目录,controller目录下有个IndexController.php控制器。
view目录下需要创建一个index_controller目录来与IndexController.php对应,对应规则为字母全部变成小写,如果是驼峰法命名,驼峰之前用下划线隔开。
index_controller目录下需要创建一个index.html 来与indexController.php控制器中的index方法对应。
在indexController.php中用fetch()方法可以将请求转到index.html
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class IndexController extends Controller
{
public function index(){
// 将请求转到对应view中index.html
return $this->fetch();
}
}
如果index_controller下还有一个list.html,只要fetch('list')如果不加参数的话,默认转到方法名所对应的html文件
如果user_controller下还有一个index.html,要想转到该文件:
return $this->fetch('user_controller/index');
如果想跨模块访问呢?即admin模块下view/login_controller/index.html
return $this->fetch('admin@login_controller/index');
@之前是模块名,之后是view文件下的目录名和文件名
还可以将$this->fetch()替换成助手函数view();
以上便是模板渲染的两个函数
0x01如何传数据给view
如何传数据给view?
index/controller/IndexController.php
将数据封装成关联数组,然后传给fetch或者view的第二个参数
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class IndexController extends Controller
{
public function index(){
// 假设这些数据是Model从数据库读出来的
$data = ['name'=>'liudehua','age'=>23];
return $this->fetch('index',$data);
}
}
index/view/index.html如何接受参数?{$数组中的键名}
<div>name: <span>{$name}</span></div>
<div>age: <span>{$age}</span></div>
方法二:不方便
public function index(){
$this->assign('name','liudehua');
$this->assign('age',33);
return $this->fetch();
}
实际应用场景:
以数组的方式发给前端
$data = ['name'=>'liudehua','age'=>23];
$this->assign('userInfo',$data);
return $this->fetch();
<div>name: <span>{$userInfo['name']}</span></div>
<div>age: <span>{$userInfo['age']}</span></div>
用$userInfo.name也可以,如果$userInfo是一个对象,那么就$userInfo->name
const是tp5在base.php中定义的常量的输出.const可以省略
config可以获取config.php中定义的值
server可以输出$_SERVER中的值
session可以输出$_SESSION中的值
如果想在变量输出时用系统函数做一些处理呢?
cookie可以输出$COOKIE中的值
可以在常量名后面加一个 |函数名
例如:
<div>name: <span>{$userInfo['username']|strtoupper}</span></div>
<div>name: <span>{$userInfo['username']|strtoupper|md5}</span></div>
而像时间戳转日期date(‘Y-m-d H:i:s’,时间戳)这种需要传两个参数的函数,则需要用以下格式,其中###是占位符,前面的变量$userInfo['reg_time']将替换他
<div>reg_time: <span>{$userInfo['reg_time']|date='Y-m-d H:i:s',###}</span></div>
如果一个函数变量在前面呢?
例如:substr(字符串变量,开始,截多少个),记住一个原则:将变量的位置用###占位,且如果###在第一位可以省略
<div>{$Think.server.SCRIPT_FILENAME|substr=###,0,10}</div>
这里要特别注意安全性问题,特别是防xss注入。
我们对$_POST/$_GET + echo = xss 很敏感,这里{$}其实就相当于echo,如果用户可以控制变量的值,而开发将接收到的变量直接输出的话 = xss;
建议凡是接受传参的变量,在输出前均用htmlspecialchars过滤,或者直接用strip_tags直接将标签截掉
如果一个变量没有传过来,可以设置一个默认值,即在变量之后加上|default="xxxxx"
如果想在html页面中用原生php代码,可以这样写{:原生php}例如{:substr($user[time],0,5)}等价于{$user[time]|substr=###,0,5}
0x02 如何遍历传来的数组
1.volist标签 相当于原生的foreach( 数组 as [键=>]键值){}
写法:
{volist name=数组名,id=键值[,key=键,offset=从第几个开始,length=循环多少次]}
中间可以写任何东西
{/volist}
例如:
<h1>this is view index.html </h1>
{volist name="userInfo" id="value"}
<div>{$value['username']}=={$value['pwd']}</div>
{/volist}
volist中内置了一个迭代计数变量{$i},如果想知道打印的是第多少条数据,可以输出{$i}
如果想输出键,可以加上,key=键,其实i是key的默认值,如果设置了key就不可以用i了
2.tp5封装的foreach标签
{foreach 数组名 as 键=>键值}
{/foreach}
{foreach $userInfo as $value}
<div>{$value['username']}=={$value['pwd']}</div>
{/foreach}
看需求吧,volist功能更强大一些
3.for标签
{for start='0' end='5' name='i' step='2'}
<div>{$i}</div>
{/for}
4.if标签
{volist name="userInfo" id="v"}
{if($v.id>20)}
{$v.username}<br/>
{elseif($v.id == 9)}
{$v.pwd}<br/>
{else}
{$v.reg_time}<br/>
{/if}
{/volist}
5.switch标签,break默认添加
{volist name="userInfo" id="v"}
{switch name="$v.username"}
{case value="liyuan3"}
{$v.pwd}
{/case}
{default/}
this is default
{/switch}
{/volist}
6.三元运算符
{$v.username=='hello7'?$v.username:'no'}
7.原生写法:
{php}
foreach($userInfo as $user){
echo $user['username'];
}
{/php}
8.tp5.0.4之后添加了模板输出替换
指向public:__ROOT__<br>
指向public/static:__STATIC__ <br>
指向public/static/css:__CSS__<br>
指向public/static/js:__JS__<br>
以上输出的是相对路径,建议打开httpd.conf下的vhost,修改域名后使用以上方法导入css文件或者js文件,以及图片文件
0x04 相关配置
并且支持自定义的配置文件
application/config:
// 视图输出字符串内容替换
'view_replace_str' => ['__IMG__'=>'/static/images'],
实例:
<link rel="stylesheet" href="__CSS__/style.css">
以上是相对路径,因为虽然配置了路由,但是现在访问的目录仍然是public/index.php,所以要访问同目录下的/static/css/style.css
原样输出:
{literal}
{$name}
{/literal}
{$name}便不会当做变量去解析,直接输出
运算:
注释:
在config.php中可以修改模板标记:
如果你修改了一些配置,但是却没有生效,需要清理一下缓存
所有用模板写的html文件都会在缓存中,转化成php文件。
标签库标签:即像{if xxxx}这种两边的标签属于标签库标签
修改view的位置:
我们现在是一个模块下面一个view,我们可以修改成在public下有一个view文件夹,里面有个对应各个模块的文件夹,
config.php中修改: