tp。3.2中的模板基础

模板定义

每个模块的模板文件是独立的,为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:

视图目录/[模板主题/]控制器名/操作名+模板后缀

模板赋值

 

如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。

$this->assign('name',$value); 或者 $this->name = $value; 

assign方法必须在display和show方法之前调用,并且系统只会输出设定的变量,其它变量不会输出(系统变量例外),一定程度上保证了变量的安全性。

系统变量可以通过特殊的标签输出,无需赋值模板变量

赋值后,就可以在模板文件中输出变量了,如果使用的是内置模板的话,就可以这样输出: {$name}

如果要同时输出多个模板变量,可以使用下面的方式:

$array['name']    =    'thinkphp'; $array['email'] = '[email protected]'; $array['phone'] = '12335678'; $this->assign($array); 

这样,就可以在模板文件中同时输出name、email和phone三个变量。

模板变量的输出根据不同的模板引擎有不同的方法,我们在后面会专门讲解内置模板引擎的用法。如果你使用的是PHP本身作为模板引擎的话 ,就可以直接在模板文件里面输出了: <?php echo $name.'['.$email.''.$phone.']';?>

如果采用内置的模板引擎,可以使用: {$name} [ {$email} {$phone} ] 输出同样的内容。

渲染模板

渲染模板输出最常用的是使用display方法,调用格式:

扫描二维码关注公众号,回复: 3706661 查看本文章

display('[模板文件]'[,'字符编码'][,'输出类型'])模板文件的写法支持下面几种:

用法 描述
不带任何参数 自动定位当前操作的模板文件
[模块@][控制器:][操作] 常用写法,支持跨模块 模板主题可以和theme方法配合
完整的模板文件名 直接使用完整的模板文件名(包括模板后缀)

下面是一个最典型的用法,不带任何参数:

// 不带任何参数 自动定位当前操作的模板文件
$this->display(); 

表示系统会按照默认规则自动定位模板文件,其规则是:

如果当前没有启用模板主题则定位到:当前模块/默认视图目录/当前控制器/当前操作.html 如果有启用模板主题则定位到:当前模块/默认视图目录/当前主题/当前控制器/当前操作.html

如果有更改TMPL_FILE_DEPR设置(假设 'TMPL_FILE_DEPR'=>'_')的话,则上面的自动定位规则变成: 当前模块/默认视图目录/当前控制器_当前操作.html 和 当前模块/默认视图目录/当前主题/当前控制器_当前操作.html

所以通常display方法无需带任何参数即可输出对应的模板,这是模板输出的最简单的用法。

通常默认的视图目录是View(了解)

如果没有按照模板定义规则来定义模板文件(或者需要调用其他控制器下面的某个模板),可以使用:

// 指定模板输出
$this->display('edit'); 

表示调用当前控制器下面的edit模板

$this->display('Member:read'); 

表示调用Member控制器下面的read模板。

如果我们使用了模板主题功能,那么也可以支持跨主题调用,使用:

$this->theme('blue')->display('User:edit'); 

表示调用blue主题下面的User控制器的edit模板。

如果你不希望每个主题都重复定义一些相同的模版文件的话,还可以启用差异主题定义方式,设置:

'TMPL_LOAD_DEFAULTTHEME'=>true 

设置后,如果blue主题下面不存在edit模板的话,就会自动定位到默认主题中的edit模板。

渲染输出不需要写模板文件的路径和后缀,确切地说,这里面的控制器和操作并不一定需要有实际对应的控制器和操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有Public控制器,更没有Public控制器的menu操作,但是一样可以使用

$this->display('Public:menu'); 

输出这个模板文件。理解了这个,模板输出就清晰了。

display方法支持在渲染输出的时候指定输出编码和类型,例如,可以指定编码和类型:

$this->display('read', 'utf-8', 'text/xml'); 

表示输出XML页面类型(配合你的应用需求可以输出很多类型)。

事情总有特例,如果的模板目录是自定义的,或者根本不需要按模块进行分目录存放,那么默认的display渲染规则就不能处理,这个时候,我们就需要使用另外一种方式来应对,直接传入模板文件名即可,例如:

$this->display('./Template/Public/menu.html'); 

这种方式需要指定模板路径和后缀,这里的Template/Public目录是位于当前项目入口文件位置下面。如果是其他的后缀文件,也支持直接输出,例如:$this->display('./Template/Public/menu.tpl');

只要./Template/Public/menu.tpl是一个实际存在的模板文件。

获取内容

如果需要获取渲染模板的输出内容而不是直接输出,可以使用fetch方法。

fetch方法的用法和display基本一致(只是不需要指定输出编码和输出类型):

fetch('模板文件')模板文件的调用方法和display方法完全一样,区别就在于fetch方法渲染后不是直接输出,而是返回渲染后的内容,例如:

$content = $this->fetch('Member:edit'); 

使用fetch方法获取渲染内容后,你可以进行过滤和替换等操作,或者用于对输出的复杂需求。

渲染内容(了解)

如果你没有定义任何模板文件,或者把模板内容存储到数据库中的话,你就需要使用show方法来渲染输出了,show方法的调用格式:

show('渲染内容'[,'字符编码'][,'输出类型'])例如,$this->show($content);

也可以指定编码和类型: $this->show($content, 'utf-8', 'text/xml');

show方法中的内容也可以支持模板解析。

内置标签

volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出。 在控制器中首先对模版赋值:

$User = M('User'); $list = $User->limit(10)->select(); $this->assign('list',$list); 

在模版定义如下,循环输出用户的编号和姓名:

<volist name="list" id="vo"> {$vo.id}:{$vo.name}<br/> </volist> 

Volist标签的name属性表示模板赋值的变量名称,因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突,例如:

<volist name="list" id="data"> {$data.id}:{$data.name}<br/> </volist> 

支持输出查询结果中的部分数据,例如输出其中的第5~15条记录

<volist name="list" id="vo" offset="5" length='10'> {$vo.name} </volist> 

输出偶数记录

<volist name="list" id="vo" mod="2" > <eq name="mod" value="1">{$vo.name}</eq> </volist> 

Mod属性还用于控制一定记录的换行,例如:

<volist name="list" id="vo" mod="5" > {$vo.name} <eq name="mod" value="4"><br/></eq> </volist> 

为空的时候输出提示:

<volist name="list" id="vo" empty="暂时没有数据" > {$vo.id}|{$vo.name} </volist> 

empty属性不支持直接传入html语法,但可以支持变量输出,例如:

$this->assign('empty','<span class="empty">没有数据</span>'); $this->assign('list',$list); 

然后在模板中使用:

<volist name="list" id="vo" empty="$empty" > {$vo.id}|{$vo.name} </volist> 

输出循环变量

<volist name="list" id="vo" key="k" > {$k}.{$vo.name} </volist> 

如果没有指定key属性的话,默认使用循环变量i,例如:

<volist name="list" id="vo" > {$i}.{$vo.name} </volist> 

如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的,例如:

<volist name="list" id="vo" > {$key}.{$vo.name} </volist> 

模板中可以直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:

<volist name=":fun('arg')" id="vo"> {$vo.name} </volist>

<if condition="($name eq 1) OR ($name gt 100) "> value1
<elseif condition="$name eq 2"/>value2 <else /> value3 </if> 

在condition属性中可以支持eq等判断表达式,同上面的比较标签,但是不支持带有”>”、”<”等符号的用法,因为会混淆模板解析,所以下面的用法是错误的:

<if condition="$id < 5 ">value1 <else /> value2 </if> 

必须改成:

<if condition="$id lt 5 ">value1 <else /> value2 </if> 

除此之外,我们可以在condition属性里面使用php代码,例如:

<if condition="strtoupper($user['name']) neq 'THINKPHP'">ThinkPHP <else /> other Framework </if> 

condition属性可以支持点语法和对象语法,例如: 自动判断user变量是数组还是对象

<if condition="$user.name neq 'ThinkPHP'">ThinkPHP <else /> other Framework </if> 

或者知道user变量是对象

<if condition="$user:name neq 'ThinkPHP'">ThinkPHP <else /> other Framework </if> 

由于if标签的condition属性里面基本上使用的是php语法,尽可能使用判断标签和Switch标签会更加简洁,原则上来说,能够用switch和比较标签解决的尽量不用if标签完成。因为switch和比较标签可以使用变量调节器和系统变量。如果某些特殊的要求下面,IF标签仍然无法满足要求的话,可以使用原生php代码或者PHP标签来直接书写代码。

 
 

猜你喜欢

转载自www.cnblogs.com/d-z-j-boke/p/9844058.html
今日推荐