视图
视图是 Web 的可见内容,一般是 HTML结合 PHP 获取的数据提供给用户使用的部分,属于 MVC 中的 V。
一. 模版定义
模版在使用之前需要一定的设置,才能方便开发者使用。每个模块的模版文件是独立的,
为了对模版文件更加有效的管理,ThinkPHP 对模版文件机型目录划分,默认的模版文件定
义规则是:
视图目录/[模版主题/]控制器名/操作名+模版后缀
第一步:在 User 控制器模块执行一条语句: (即在 Home/controller/UserController.class.php 中插入)
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 5 class UserController extends Controller { 6 public function index() { 7 $this->display(); 8 } 9 }
什么都没有定义的情况下,会自动报错,错误信息提示如下:
1 模板不存在:./WeiBo/Home/View/User/index.html
也就是这时,显示的是 ./WeiBo/Home/View/User/index.html 中的代码
通过这个错误提示,我们只要在 View 目录下创建 User 目录,并在 User 目录下创建
index.html 文件,这时模版渲染模版输出成功。
默认情况下视图目录是 View,如果你想改变成别的目录名可以设置:(在 WeiBo/Common/Conf/config.php 中插入)
1 //修改模版的视图目录 2 'DEFAULT_V_LAYER' =>'Template',
也就是以后会在 ./WeiBo/Home/Template/User/index.html 中显示内容
默认情况下的模版文件后缀是.html,如果你想改变成别的后缀可以设置:
1 //修改模版中的文件的后缀 2 'TMPL_TEMPLATE_SUFFIX'=>'.tpl',
如果感觉每一个模块,都要创建相应的目录太过于麻烦,可以设置:
1 //用下划线代替目录层次 2 'TMPL_FILE_DEPR'=>'_', //User_index.tpl
以后访问的则是: ./WeiBo/Home/View/User_index.html 了。
如果不想将模版存在在当前 Weibo 目录下,而设置在外部:
1 //设置外部的模版目录 2 'VIEW_PATH'=>'./Public/',
这时的Public是与weibo目录同级的
如果一个系统要考虑多套界面皮肤的话,要考虑到默认皮肤以及可选皮肤:
1 //设置默认主题目录 2 'DEFAULT_THEME'=>'default',
以后访问的默认主目录是 WeiBo/View/default 下的内容,也就是说,View下可建立多个不同名字的目录,
如果要更改的话,可在 Home/controller/UserController.class.php 中写入:
此时已在 WeiBo/View/ 下建立Blue的目录
1 class UserController extends Controller { 2 public function index() { 3 $this->theme('blue')->display(); 4 } 5 }
二.赋值和渲染
如果要在模版中输出变量,必须在控制器中把变量传递给模版。ThinkPHP 提供了
assign 方法对模版变量赋值,无论何种变量类型都统一使用 assign 赋值。
在 Home/controller/UserController.class.php 中插入以下代码:
1 <?php 2 3 namespace Home\Controller; 4 use Think\Controller; 5 6 class UserController extends Controller { 7 public function index() { 8 $this->assign('user','蜡笔小新'); 9 $this->display(); 10 } 11 }
因为这个模版是User,所以默认的则是在 View/User/index.html 显示内容,所以在 View/User/index.html 中代码为:
<html> <head> </head> <body> 传过来的名字是{$user} </body> </html>
在浏览器中显示的是:
PS:这个方法必须在 display()方法之前使用,保存变量正确传递。
渲染模版输出使用的是 display 方法,有三个可选参数:
display([模版文件][,字符编码][,输出类型]);
如果不传递任何参数,它会按照默认的目录定位模版的位置:
当前模块/默认视图目录/当前控制器/当前操作.html
1 //修改默认模版 2 $this->display('add');
则这时调用的文件是: ./Weibo/Home/View/User/add.html
1 //修改默认模版,目录加模版 2 $this->display('Bbb/add');
这时调用的文件是: ./Weibo/Home/View/Bbb/add.html
记得给Bbb/add加上单引号。
//修改默认模版,模块加目录加模版 $this->display('Admin@Bbb/add');
这时调用的文件是 ./WeiBo/Admin/View/Bbb/add.html
需要注意的是:Admin和Home是同级的, $this->display('Admin@Bbb/add'); 里没有View,但是在Admin这个文件夹下,必须要建立View文件夹。Admin和Bbb/add.html中间是@符号。
1 //修改默认模版,主题加目录加模版 2 $this->theme('blue')->display('Bbb/add');
调用的文件是: ./WeiBo/Home/View/blue/Bbb/add.html
1 //修改默认模版,自定义模版 2 $this->display('./Template/Public/add.html');
这时调用的文件是: ./ Template/Public/add.html Template文件与WeiBo文件同级,
需要注意的是,这时是不需要View文件夹的。
1 /修改默认模版,指定编码和文件类型,一般不用填写,默认即可 2 $this->display('add', 'utf-8', 'text/xml');
三. 模版地址
ThinkPHP 封装了一个 T 函数,专门用于生成模版文件。格式如下:
T([资源://][模块@][主题/][控制器/]操作,[视图分层]);
1 //输出当前模版地址 2 echo T();
这时输出的为: ./WeiBo/Home/View/User/index.html
当然可以结合上面讲的所有定义方法来自定义模版:
echo T('Public/add') 显示的路径为: ./WeiBo/Home/View/Public/add.html
echo T('Admin@index'); 显示的路径为: ./WeiBo/Admin/View/User/index.html
echo T('Admin@Public/add', 'Template'); 显示的路径为: ./WeiBo/Admin/Template/Public/add.html
也可以这样:
1 //直接使用T函数输出 2 $this->display(T());
四.获取内容
如果需要获取模版的内容,可以使用 fetch()方法,这个方法的使用和 display()方法一致。
1 //获取模版里的内容 2 $content = $this->fetch(); 3 var_dump($content);
这时在 WeiBo/Home/View/User/index.html 中的代码为:
1 <html> 2 <head> 3 </head> 4 5 <body> 6 这里是WeiBo/Home/View/User/index.html 7 </body> 8 </html>
在浏览器中调用 UserController.class.php 后,显示为: string(87) " 这里是Home/View/User/index.html "
再在 Home/controller/UserController.class.php 中加入一行:
1 //通过内容再渲染输出 2 $this->show($content);
则此时输出的内容为: