您的位置:首页 > 编程语言 > PHP开发

phplib-template模板技术(转寄)

2006-08-25 10:47 302 查看
//由于某些原因,要暂时离开php一段时间,最近在家休养中,顺便写些自己的学习心得与大家共享之
//发在新手答疑区,主要我感觉这里人气比较多,诚心希望能给各位网友带来需要的东西
//另外论坛不支持html代码,表格地方显示才有误。 可以到我的blog里面看“美观”版

自己并没有怎么仔细去看phplib模板的源文件,我这里用到的也就:set_file, set_block, set_var, parse, p, pparse等函数,仅以此文献给想入门phplib template的朋友。

//自己专业技术和写作都不咋地,所以我就用白话文给大家描述一下。以下template.php就指phplib的template.php,模板就指phplib的模版

0、开始

首先下载个template.php,网上很多,http://sourceforge.net/projects/phplib 上也有,其实一般下下来都是inc的后缀名,无所谓(个人习惯将其改为php的)

放到你网站的某个目录下,建议入门的时候给自己将点难度,就把它放到你做测试的目录中,直接require('template.php'); 这样至少可以排除路径出的错。

新建一个test.html文件(随便什么后缀名,但我一般是用dw做网页,还是htm、html好点)和一个test.php

1、最简单的例子——set_file, pparse

test.html里代码:

Hello world

test.php里如下:

PHP 代码:
<?php
//包含头文件
require('template.php');

//新建一个模板类并设置模板调用目录: ./ 表示就为当前目录
$t = new Template('./');

//调用test.html, 并将其命名为mbody
$t->set_file('mbody', 'test.html');

//pparse = parse + p 解析并输出mbody
$t->pparse('mout', 'mbody');
?>



一切正常的话,这时候你应该能看到浏览器输出: Hello world
//举这个最简单的例子仅仅是想让你快速跨进这个门槛,网上不少例子上来就长篇大论,感觉很难消化。一切正常,恭喜你!模板就是如此简单

2、解析变量——set_var

test.html里代码为:

{hi}

//hi就是要被解析的变量

test.php代码如下:

PHP 代码:
<?php
//包含头文件
require('template.php');

//设置模板调用目录: ./ 表示就为当前目录
$t = new Template('./');

//调用test.html, 并将其命名为mbody
$t->set_file('mbody', 'test.html');

//将hi解析为“Hello world”
$t->set_var('hi', 'Hello world');

//pparse = parse + p 解析并输出mbody
$t->pparse('mout', 'mbody');
?>



运行之,浏览器会输出:Hello world

更多例子自己多写些练习下

3、块!——set_block

块操作也是我接触的模板最高的一部分了,往上也没研究过... 不过我感觉,块用好了,99%的问题也能解决了(至少我现在还没碰到一个不能解决的问题)

block一般都是用在重复出现的地方,比如帖子栏目等等,以下以生成一个10行的表格为例。

3.1 块的定义

代码:
<!-- BEGIN blockname --> ... <!-- END blockname -->


//blockname自行定义,"最好"不要重复(说“最好”的意思是可以重复,但此是后话);注:BEGIN END都必须用大写字母

3.2 一个最简单的表格:

HTML 代码:
<table>
<tr>
<td>Hi</td>
</tr>
</table>


因为我们要做个10行的表格,所以重复的block应该是<tr>...</tr>,因此定义如下:

HTML 代码:
<table>
<!-- BEGIN list -->
<tr>
<td>Hi</td>
</tr>
<!-- END list -->
</table>


//我定义的名字为list,个人习惯。

test.php代码如下:

PHP 代码:
<?php
//包含头文件
require('template.php');

//设置模板调用目录: ./ 表示就为当前目录
$t = new Template('./');

//调用test.html, 并将其命名为mbody
$t->set_file('mbody', 'test.html');

//定义一个mbody中的块list,命名为ml, 个人习惯,你定义为sm也没事 呵呵
$t->set_block('mbody', 'list', 'ml');

//解析10次这个块,就生成了10行表格。直观上相当于你把<tr>...</tr>“剪切”并粘贴了10次。剪切的意思是:你不解析的话这个“原始”块也就没了
for ($i = 0; $i < 10; $i++) {
//这里是parse, 只是解析,并不输出(具体为什么后面要加true,我也不清楚,还望高人指点)
$t->parse('ml', 'list', true);
}

//pparse = parse + p 解析并输出mbody
$t->pparse('mout', 'mbody');
?>



运行之,一个10行的表格就出现了,10个hi

3.3 在block中定义变量,直接在里面写你要解析的变量myVar

HTML 代码:
<table>
<!-- BEGIN list -->
<tr>
<td>{myVar}</td>
</tr>
<!-- END list -->
</table>


test.php做如下修改:

PHP 代码:
for ($i = 0; $i < 10; $i++) {
//每次都给该块中的变量赋一次值
$t->set_var('myVar', $i);
$t->parse('ml', 'list', true);
}



运行之,一个10行的表格,里面的内容是从0-9:

0

1

2

3

4

5

6

7

8

9

块中可以有很多{变量},自己多多发挥吧

3.4 block的嵌套

block中可以有任何东西,自然其里面也可以有子block了,其实可以理解set_file('mbody'...) mbody就是一个大“block”。block嵌套可以很基本,我这里举个例子是通过一行一列的表格生成5行3列的表格,这样每行、每列都是一个block,列是行的子block。

3.4.1 定义嵌套block

test.html代码

HTML 代码:
<table>
<!-- BEGIN tr -->
<tr>
<!-- BEGIN td -->
<td>{myVar}</td>
<!-- END td -->
</tr>
<!-- END tr -->
</table>


//这里用tr、td命名block名纯属为了好理解

test.php中定义block

PHP 代码:
//定义mbody中的block: tr, 命名为mtr
$t->set_block('mbody', 'tr', 'mtr');
//定义block中的子block: td, 命名为mtd
$t->set_block('tr', 'td', 'mtd');



完整的test.php代码如下:

PHP 代码:
<?php
//包含头文件
require('template.php');

//设置模板调用目录: ./ 表示就为当前目录
$t = new Template('./');

//调用test.html, 并将其命名为mbody
$t->set_file('mbody', 'test.html');

//定义mbody中的block: tr, 命名为mtr
$t->set_block('mbody', 'tr', 'mtr');
//定义block中的子block: td, 命名为mtd
$t->set_block('tr', 'td', 'mtd');

//0-14 共15个数字分别填在表格中
for ($i = 0; $i < 15; $i++) {
$t->set_var('myVar', $i);

//每次都要生成一列,所以每次解析一次td
$t->parse('mtd', 'td', true);

//当到达3列是就要换行了,解析一次tr
if ($i%3 == 2) { //这个是换行的条件
$t->parse('mtr', 'tr', true);

//以下这个请注意: 将mtd的值置空。
//这里是个人理解,可能不太准确:因为每次解析td都相当于 mtd += td, 即每次都是把生成的td内容加到mtd后面,当对tr解析时就将其子block生成的所有内容解析为自己的。因此当一行完成时改行所有td都在mtd里面,如果不将mtd置空,下一行的td内容仍然在其基础上增加,就会出现(*1)的情况
$t->set_var('mtd', '');
}
}

//pparse = parse + p 解析并输出mbody
$t->pparse('mout', 'mbody');
?>



正常的情况输出为:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

异常情况:没有将mtd置空的情况(*1)

0

1

2

0

1

2

3

4

5

0

1

2

3

4

5

6

7

8

0

1

2

3

4

5

6

7

8

9

10

11

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

//更多内容请各位练习中研究。剧终
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: