模板,PHPLIB处理方式(二)

字体大小: 中小 标准 ->行高大小: 标准
嵌套的模板 parse()函数的一个灵巧的特性是它创建的MyOutput句柄是一个真正的模板变量,就象some_color 是一 
个模板变量。所以如果你有另一个模板,它有一个{MyOutput}标签,当你分析第二个模板时,所有的 
{MyOutput}标记将被替换为MyOutput中的分析后的文本。这个特性允许你将一个模板文件嵌入到另一个模板 
中。所以,我们可能有另一个名为wholePage.ihtml的模板,内容如下: 



对不起,你没赢。但是如果你赢了,我们将对你说: 
{MyOutput} 

  并且在wholePage.ihtml被分析后,最后的结果将是: 

对不起,你没赢。但是如果你赢了,我们将对你说: 
祝贺!你赢了一辆新蓝色Honda Prelude! 

  下面是分析两个模板的PHP代码: 

―――― PHP代码 ――――

    <?php 

    $t = new Template("/home/mydir/mytemplates/"); 

    // 这三行同第一个例子一样 
    $t->set_file("MyFileHandle","MyTemplate.ihtml"); 
    $t->set_var("some_color",$my_color); 
    $t->parse("MyOutput","MyFileHandle"); 

    // 注意我们没有调用p() 
    // 这里,仍然没有输出任何东西 

    // 现在分析第二个模板 
    $t->set_file("WholeHandle","wholePage.ihtml"); 

    // wholePage.ihtml 有 "{MyOutput}" 在里面 
    $t->parse("MyFinalOutput","WholeHandle"); 

    // 所有的 {MyOutput} 被替换了 
    $t->p("MyFinalOutput"); 
    // 输出 MyFinalOutput 的值 

    ?> 
    
――――――――――――

  最后调用了parse()和p()的两行语句可以合并成一个简写函数pparse(): 


―――― PHP代码 ――――

    <?php 
    pparse("MyFinalOutput","SecondHandle"); 
    ?> 
   
――――――――――――

  另一个PHPLIB模板的特性是set_file()和set_var()函数也能一次接收多组值,通过传递一个句柄/数组 
对数组。这是一个例子: 

―――― PHP代码 ――――

    <?php 
    $t->set_file(array( "pageOneHandle" => "pageone.ihtml", 
    "pageTwoHandle" => "pagetwo.ihtml")); 
    $t->set_var(array( "last_name" => "Gates", 
    "first_name" => "Bill", 
    "net_worth" => $reallybignumber)); 
    ?> 
    
――――――――――――

添加模板文本 
  你可以给parse()和pparse()传递第三个参数,如果你想给模板变量追加数据而不是替换它。可以简单 
的使用true作为第三个参数调用parse()和pparse(),如: 

―――― PHP代码 ――――

    <?php 
    $t->parse("MyOutput","MyFileHandle", true); 
    ?> 
   
――――――――――――

  如果MyOutput已经包含了数据,MyFileHandle将被分析并且被追加到MyOutput已经存在的数据上。这个 
技术非常有用,如果你已经有了一个模板,你想要同一段文本被重复多次,例如列出一个数据库查询结果中 
的多行。你也可能是显示数组中的变量,如下面的例子: 



―――― PHP代码 ――――

    <?php 
     $t = new Template("/home/mydir/mytemplates/"); 
     $t->set_file(array("mainpage" => "mainpage.ihtml", "each_element" => "each_element.ihtml")); 
      reset($myArray); 
     while (list($elementName, $elementValue) = each($myArray)) 
     { 
         // 设置 'value' 和 'name' 为每一个元素的值和名字 
         $t->set_var("name",$elementName); $t->set_var("value",$elementValue); 
        // 追加each_element的拷贝 
         $t->parse("array_elements","each_element",true); 
     } 
     $t->pparse("output","mainpage"); 
     ?> 
     
――――――――――――

  这个例子使用了两个模板,mainpage.ihtml和each_element.ihtml。mainpage.ihtml模板可能是这样: 

<HTML> 
Here is the array: 
<TABLE> 
{array_elements} 
</TABLE> 
</HTML> 
  上面的{array_elements}标签将被each_element.ihtml的拷贝所替换,它将根据数组($myArray)进行重 
复。each_element.ihtml模板看上去可能是: 

<TR> 
<TD>{name}: {value}</TD> 
</TR> 

  处理结果是一个包含$myArray元素的格式化很好的表格。但是如果将两个模板合并成一个模板不是更好 
吗?实际上,它们可以使用模板块来合并使用。模板块允许从一个模板中取出一块文本,所以你可以重复很 
多次,或者在它上面做任何你想做的事情。但是我将在另一篇文章讲述这个特性。

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/1140.html