20.7 内置ThinkTemplate模板引擎

20.7 内置ThinkTemplate模板引擎

视频讲解:光盘TMlx20内置ThinkTemplate模板引擎.exe

ThinkPHP内置了一个基于XML的性能卓越的模板引擎ThinkTemplate,这是一个专门为ThinkPHP服务的内置模板引擎。ThinkTemplate是一个使用XML标签库技术编的模板引擎,支持两种类型的模板标签(普通标签和XML标签),使用了动态编译和缓存技术,而且支持自定义标签库。

ThinkTemplate模板引擎生成的编译文件默认存储于RuntimeCache目录下,以模板文件的md5编码作为缓存文件名保存。

下面介绍一些ThinkTemplate模板引擎中的常用标签,如表20.6所示。

表20.6 ThinkTemplate模板引擎中的常用标签

续表

续表

【例20.11】仍然以用户登录和数据的输出为背景,应用ThinkPHP中提供的验证码类和分页类生成验证码,完成数据的分页输出。(实例位置:光盘TMsl2011)

(1)定位到AppLibAction目录下,编写项目控制器。创建Index模块,继承系统的Action基础类,定义index方法,验证SESSION变量存储的验证码与用户提交的验证码是否相同,验证用户提交的用户名和密码是否正确,如果正确则将登录用户名存储到SESSION变量中,并且将网页重定向到main.html页面。其代码如下:

<?php session_start(); header("Content-Type:text/html; charset=utf-8"); //设置页面编码格式 class IndexAction extends Action{ public function index(){ if(isset($_POST['user'])){ if(isset($_POST['user']) && isset($_POST['pass']) && isset($_POST['validatorCode'])){ if($_SESSION['verify']==md5($_POST['validatorCode'])){ //验证验证码是否正确 $db=M(); //实例化模型类,参数数据表名称,不包含前缀 $select = $db->query("select * from think_user where user='".$_POST['user']."' and pass='".$_POST['pass']."'"); //执行查询语句,验证用户名和密码是否正确 if($select){ $_SESSION['admin']=$_POST['user']; $this->redirect('Index/main', '',2, ’用户 '.$_POST['user'].' 登录成功!'); //页面重定向 }else{ $this->redirect('Index/index', '',2, ’用户名或者密码不正确!'); //页面重定向 } }else{ $this->redirect('Index/index', '',2, ’验证码不正 确!'); //页面重定向 } }else{ $this->redirect('Index/index', '',2, ’用户名、密码不能为空!'); //页面重定向 } } $this->display(); }

定义main方法,载入分页类,完成数据库中数据的分页查询,并且将查询结果赋给模板变量。这里应用的是Page类和limit方法完成数据的分页输出,其代码如下:

public function main(){ $db=M('User'); //实例化模型类,参数数据表名称,不包含前缀 import("ORG.Util.Page"); //导入分页类 $count=$db->count(); //统计总记录数 //$count=$User->where("status=1")->count(); //查询满足要求的总记录数 $Page=new Page($count,1); //实例化分页类,传入总记录数和每页显示的记录数 $show=$Page->show(); //分页显示输出 //进行分页数据查询,注意limit方法的参数要使用Page类的属性 $list = $db->order('id')->limit($Page->firstRow.', '.$Page->listRows)->select(); $this->assign('select', $list); //赋值数据集 $this->assign('page', $show); //赋值分页输出 $this->display(main); //输出模板 }

定义verify方法,载入ThinkPHP中提供的验证码扩展类,调用buildImageVerify方法生成验证码。其代码如下:

public function verify(){ import("ORG.Util.Image"); //载入验证码类 image::buildImageVerify(4,5); //生成验证码 }

说明

buildImageVerify方法的语法如下:

buildImageVerify($length, $mode, $type, $width, $height, $verifyName)

参数说明如表20.7所示。

表20.7 验证码类中buildImageVerify方法的参数说明

生成验证码之后,需要在模板页中通过<img src="__APP__/Index/verify/" />输出生成的验证码图像;在控制器中通过如下代码:

if($_SESSION['verify'] ! = md5($_POST['verify'])) { $this->error(’验证码错误!'); }

(2)定位到AppTpl目录下,创建Index模块文件夹。编辑index操作的模板文件index.html,载入css样式文件和javascript文件,创建表单,完成用户登录信息的提交操作,通过img标签输出生成的验证码。其关键代码如下:

<link href="__ROOT__/Public/Css/style.css" rel="stylesheet" type="text/css" /> <js href="__ROOT__/Public/Js/check.js" /> <form name="form1" method="post" action="__URL__/index" onSubmit="return chkinput(this)" > <table width="265" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="title" id="td">用户名:</td> <td><input name="user" type="text" size="15" /></td> </tr> <tr> <td class="title" id="td">密码:</td> <td><input name="pass" type="password" size="15" /></td> </tr> <tr> <td class="title" id="td">验证码:</td> <td><input type="text" name="validatorCode" size="10" /></td> <td><img src="__APP__/Index/verify/" /></td> </tr> </table> </form>

(3)在Index模块文件夹下编辑main.html文件,通过模板引擎中的session标签输出当前登录的用户名,通过foreach标签循环输出模板变量传递的数据,最后输出模板变量传递的分页超链接。其关键代码如下:

<table width="405" border="1" cellpadding="1" cellspacing="1" bgcolor="#99CC33" bordercolor="#FFFFFF"> <tr> <td colspan="3" bgcolor="#FFFFFF" class="title" align="center">当前登录用户:{$Think.session.admin}</td> </tr> <foreach name='select' item='user' > <tr class="content"> <td bgcolor="#FFFFFF">&nbsp; {$user.id}</td> <td bgcolor="#FFFFFF">&nbsp; {$user.user}</td> <td bgcolor="#FFFFFF">&nbsp; {$user.address}</td> </tr> </foreach> <tr class="content"> <td colspan="3" bgcolor="#FFFFFF">&nbsp; {$page}</td> </tr> </table>

说明

这里应用的验证码是区分字母的大小写的。

其运行结果如图20.19所示。

图20.19 验证码类和分页类的应用效果

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

20.7 内置ThinkTemplate模板引擎