分享
 
 
 

PHPLIB Template入门系列 - 4 模板嵌套

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量.

以前你或许用require,include(require_once,include_once)引进一个公用的页面头部,确实方便而有效,现在我们用Template模板类也可以实现了,并且可以很方便的把一个页面随意插入另一个模板的任意地方.如果你想也把要插进的页面做成含有变量的模板的话,那么你会发现模板类会把这个工作处理的很好.

在template目录下新建三个文件third.html,header.html,footer.html.内容分为如下

third.html

<!-- 这是页面头部 -->

{header}

<BODY>

下面是一个列表

<UL>

<!-- BEGIN list -->

<li>{username} 的成绩是 {score}

<!-- END list -->

</UL>

<!-- 这是页面脚部 -->

{footer}

</BODY>

</HTML>

header.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> {title} </TITLE>

</HEAD>

footer.html

<P>author &copy; iwind

你也看到了,我们前几节的例子中都是用

$tpl->set_file("main", "模板文件名");

来加载模板文件的。只所以命名为"main",是因为我们想给它一个意义:主模板。这里的third.html就可以称之为“主模板”,而欲嵌入主模板third.html的{header}变量所在位置的模板文件header.html,则可以称为"子模板".同样footer.html也是一个"子模板",我们想把它放到主模板里的{footer}位置.一个主模板内可以随意嵌入不限内容,尺寸大小,格式等的任何多个子模板.

下面我们开始我们的PHP程序.

先是创建一个类的实例对象

//包含进模板类 template.inc

require "inc/template.inc";

//创建一个实例

$tpl = new Template("template");

//读进三个模板文件的内容,分别给变量"main", "my_header", "my_footer"

$tpl->set_file("main", "third.html");

$tpl->set_file("my_header", "header.html");

$tpl->set_file("my_footer", "footer.html");

//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer

$tpl->parse("header", "my_header");

$tpl->parse("footer", "my_footer");

//然后完成主模板内变量的替换,并输出主模板分析后的内容

$tpl->parse("mains", "main");

//输出

$tpl->p("mains");

于是,我们便可以通过查看源文件确信header.html,footer.html两个子模板文件的内容已经被加进主模板里了.

<!-- 这是页面头部 -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> </TITLE>

</HEAD>

<BODY>

下面是一个列表

<UL>

<!-- BEGIN list -->

<li> 的成绩是

<!-- END list -->

</UL>

<!-- 这是页面脚部 -->

<P>author &copy; iwind

</BODY>

</HTML>

你会发现,所有的变量都没了,包括我们未赋值的{title},{username},{score}.这是因为我们在创建对象时,第二个参数未设置,而自动采用了"remove"

$tpl = new Template("template");

$tpl = new Template("template", "remove");

的效果是一样的.

如果我们想给这些变量也赋值,那么方法和单个模板里变量的分析方法是一样的.

//读模板内容进变量

$tpl->set_file("main", "third.html");

$tpl->set_file("my_header", "header.html");

$tpl->set_file("my_footer", "footer.html");

//设置子模板header.html里的变量title的值

$tpl->set_var("title", "这个是网页标题");

//以下分析主模板里的块的内容

//设置块

$tpl->set_block("main", "list", "lists");

$array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);

foreach ($array as $username=>$score)

{

$tpl->set_var("username", $username);

$tpl->set_var("score", $score);

$tpl->parse("lists", "list", true);

}

所有程序为

<?php

//包含进模板类 template.inc

require "inc/template.inc";

//创建一个实例

$tpl = new Template("template");

//将整个文件读进来

$tpl->set_file("main", "third.html");

$tpl->set_file("my_header", "header.html");

$tpl->set_file("my_footer", "footer.html");

//设置header.html里的变量title的值

$tpl->set_var("title", "这个是网页标题");

//设置块

$tpl->set_block("main", "list", "lists");

$array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);

foreach ($array as $username=>$score)

{

$tpl->set_var("username", $username);

$tpl->set_var("score", $score);

$tpl->parse("lists", "list", true);

}

//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer

$tpl->parse("header", "my_header");

$tpl->parse("footer", "my_footer");

//完成主模板内变量的替换

$tpl->parse("mains", "main");

//输出

$tpl->p("mains");

?>

输出的结果为

<!-- 这是页面头部 -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> 这个是网页标题 </TITLE>

</HEAD>

<BODY>

下面是一个列表

<UL>

<li>张三 的成绩是 82

<li>李四 的成绩是 90

<li>王二 的成绩是 60

<li>麻子 的成绩是 77

</UL>

<!-- 这是页面脚部 -->

<P>author &copy; iwind

</BODY>

</HTML>

一切都是我们所期望的.

在这个程序里,我们用

$tpl->set_block("main", "list", "lists");

加载一个块.其实它的第一个参数为该块所在父变量,如果这个块在header.html里,那么恐怕要这样写了

$tpl->set_block("my_header", "list", "lists");

但分析方法还是一样的.

从以往和这节中的例子,我们可以看出来,定义一个模板变量{var}值的方法是用

$tpl->set_var("var_name", "var_value");

但把一个变量的值给另一个变量就需要用parse.

$tpl->parse("target_name", "from_name", true);

或者

$tpl->parse("target_name", "from_name", false);

使用parse就先执行from_name大变量的模板变量的替换,然后再把所得结果赋给target_name.

一个变量{varname}无论在模板的何处(块里面,子模板里),定义的方法都是一样的.

子模板里还可以嵌入新的子模板,称之为"多重嵌套",分析的方法都是一样的,只是一般用不到.块也可以多重嵌套,而且非常有用,使得模板可以设计的可以很清晰,这就是我们下一节的内容了.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有