TP将网站进行了MVC的划分,之前的学习笔记中,多是将重点放在M与C的部分,现在就来记录下网站的前端视图表现——模板。
ThinkPHP中的模板及目录命名规则
TP将MVC中View的功能交给了模板。所谓模板,其实是一个html文件(在配置文件中可以设置模板扩展名),在这个html文件中,我们可以引用TP的函数,并通过TP来解析。这样我们就做到了动态的显示网页内容的功能。
TP的模板文件,默认放在工程目录下的Tpl目录下。在Tpl目录下,其又会根据控制器名称有若干子文件夹,每个子文件夹下,才会存放对应的模板文件。
路径规则如下:
工程名文件夹/Tpl文件夹/控制器名称文件夹/控制器函数名.html
<p>例如,我有一个前台工程叫做Index,那么其Index控制器对应的add函数的模板文件add.html应该放在</p>Index/Tpl/Index/add.html
对于模板文件用到的CSS及JS等文件,我们可以放在与ThinkPHP框架目录同级的Public文件夹中,TP会自动为我们寻找到路径。当然有个前提,那就是在模板里面对应的引用路径要用__PUBLIC__来表示(这里是双下划线),如
<link rel="stylesheet" href="__PUBLIC__/Css/index.css" />
<script type="text/javascript" src='__PUBLIC__/Js/jquery-1.7.2.min.js'></script>
<script type="text/javascript" src='__PUBLIC__/Js/index.js'></script>
模板文件的显示输出
如果我们严格的按照上面的目录命名规则的话,那么在对应控制器的函数中,我们只需要键入
$this->display();
即可轻松输出模板显示到浏览器。
当然,TP给我们提供了足够的灵活性,即使我们没有严格按照命名规则来命名,同样可以用display函数显示模板。方法如下:
格式:display('操作名')
例如,假设当前操作是User控制器下面的read操作,我们需要调用User控制器的edit操作模版,使用:
$this->display('edit');
不需要写模板文件的路径和后缀。
调用其他控制器文件夹下的操作模板
格式:display('控制器文件夹名:操作名')
例如,当前是User控制器,我们需要调用Member控制器的read操作模版,使用:
$this->display('Member:read');
这种方式也不需要写模板文件的路径和后缀,严格来说,这里面的控制器文件夹名和操作名并不一定需要有对应的控制器或者操作,只是一个目录名称和文件名称而已,例如,
你的项目里面可能根本没有Public控制器,更没有Public控制器的menu操作,但是一样可以使用
<span class="pln">$this</span><span class="pun">-></span><span class="pln">display</span><span class="pun">(</span><span class="str">'Public:menu'</span><span class="pun">); </span>
甚至可以直接写路径名称
<span class="pln">$this</span><span class="pun">-></span><span class="pln">display</span><span class="pun">(</span><span class="str">'./Public/menu.html'</span><span class="pun">);</span>
display函数还有第二个参数,可以指定网页显示的字符编码格式,如
$this->display('Member:read', 'gbk');
在配置文件中,我们可以配置来设定默认的模板输出字符编码
'DEFAULT_CHARSET'=> 'gbk'
ThinkPHP的模板赋值
在模板中我们可以设置变量,来动态的显示网页内容。
在模板中,我们可以在任意地方运用{$变量名} 以及配合TP的函数 {:函数名}来动态的替换模板内容。
而在后台的php代码中,我们使用
$this->assign(...)
方法来对模板变量进行赋值。
assign方法一般使用方式为 assign('变量名', 变量值)来使用。注意,这里的变量名是同模板中{$变量名}对应起来的,同时,这里没有$符号。
同时,我们可以用array来为多个变量同时赋值。
如下
$array['name'] = 'thinkphp';
$array['email'] = 'liu21st@gmail.com';
$array['phone'] = '12335678';
$this->assign($array);
下面的代码展示了如何在Index控制器中取出数据库中的值,并显示在模板列表中的
控制器代码:
class IndexAction extends Action {
public function index(){
//将数据库中 wish表中的所有数据取出(包含id, username, content, time字段),并显示到模板wish.html的列表中
$this->assign('wish', M('wish')->select())->display('wish');
}
wish.html模板代码
<foreach name='wish' item='v'> //TP的模板函数foreach会将wish变量数组中的所有元素一一取出
<dl class='paper a{:mt_rand(1, 5)}'> //这里用{:}形式调用了随机数函数
<dt>
<span class='username'>{$v.username}</span>
<span class='num'>No.{$v.id}</span>
</dt>
<dd class='content'>{$v.content}</dd>
<dd class='bottom'>
<span class='time'>{$v.time|date='Y-m-d H:i', ###}</span> //这里使用了一个date函数,date=后面是传入参数,###表示$v.time变量本身
<a href="" class='close'></a>
</dd>
</dl>
</foreach>
好了,上面就是TP中模板的表示以及模板变量替换的一些常规方法。当然,除了这些基本应用,还有一些方法 我们可以自己去查TP的手册,毕竟边用边学是效率最高的吗~