定义嵌套block

来源: http://www.x2blog.cn/maxwin/7311.html
test.html代码

<table>
 <!-- BEGIN tr -->
  <tr>
   <!-- BEGIN td -->
    <td>{myVar}</td>
   <!-- END td -->
  </tr>
 <!-- END tr -->
</table>

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

test.php中定义block

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

完整的test.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