但是作为一个大型网站,代码和内容混合在一起的方式似乎不是一个好的风格。
我改进了自己的模板类加上了cache即生成静态页面,在指定时间内可以直接从cache文件中输出内容,速度又增加了10倍。

解决方案 »

  1.   

    用phplib的template或者 eval()都比FT快很多
      

  2.   

    把你写的贴出来看看?或者E我: [email protected]
      

  3.   

    在php最好不要用FastTemplate,这是建议,FastTemplate是perl的产物。
      

  4.   

    使用Perl写过网页,然后发现PHP/ASP这种HTML中嵌入脚本的方式更好用,所以转用PHP了,但开发了不少网站后发现,还是HTML与代码分开好。把HTML和代码放在一起完全是初学者的玩具,我想PHP原来叫个人网站工具就是这个原因。
    我现在觉得Perl/ASP/PHP是一样的。PHP的好处是可以作为Server模块运行
      

  5.   

    我的模板类,只供测试,还加错误处理等flashTemplate.php
    <?
    //模板类说明:
    //模板从模板文件中取得
    //每个模板文件由多个模板块block组成,每个块有一个名字,
    //<!--TPL START:模板名-->标志块的开始
    //<!--TPL END:模板名-->标志块的结束
    //整个文件可以看成一个块,名字为_MainBlock,因此其它块不能取此名字
    //整个文件内容用LoadFile方法取出,支持从多个文件中取出模板,因此必须给每个文件取一个文件句柄
    //该句柄必须在以后的每个方法中传入,表示对该模板文件进行处理,不给名字则默认句柄名为模板文件名
    //$foo->LoadFile(array(句柄名=>"模板文件名"))
    //块可以嵌套,但处理时必须从里向外取出,使用方法LoadBlock
    //$foo->LoadBlock(句柄名,块名)
    //之后可以对模板处理,先将实际内容与模板中的待替代变量用Assign方法指定
    //$foo->Assign(句柄名,array(模板变量名=>实际内容),块名)
    //不指定块名则针对对整个文件内容
    //再调用Parse方法进行替代处理
    //$foo->Parse(句柄名,块名)
    //不指定块名则针对对整个文件内容处理
    //处理完成后使用GetResult方法取得结果
    //ParseAppend将本次处理的结果追加到上一次处理的结果上,一般用于表格内行的循环
    //在块的嵌套中,内层处理完成后可使用AssignBlock方法把内层的结果指定到外层模板的待替代变量上
    //PrintResult方法输出结果,在最外层处理完成后。
    class FlashTemplate {
      var $tpgs=array();
      var $tpls=array();
      var $results=array();
      var $tplvars=array();
      function LoadFile($TpgName){
        if(is_array($TpgName)){
          while ( list ( $key , $val ) = each ( $TpgName ) ){
           $this->tpgs["$key"]=implode("",file($val));
          }
        }else
          $this->tpgs["$TpgName"]=implode("",file($TpgName));
      }
      function LoadBlock($TpgName,$tplname=""){
        if($tplname=="_MainBlock")
          die( 'Template block name "_MainBlock" is reserved by FlashTemplate.');
        if($tplname!=""){
           $search="/<!--TPL START:".$tplname."-->(.*?)<!--TPL END:".$tplname."-->/is";
           if(preg_match($search,$this->tpgs["$TpgName"],$matches)){
             $this->tpls["$TpgName"]["$tplname"]= $matches[1];
             $this->tplvars["$TpgName"]["{$tplname}_mrk"]=array();
             $this->tplvars["$TpgName"]["{$tplname}_var"]=array();
             $this->tpgs["$TpgName"]=str_replace(&$matches[0],"{{$tplname}}",&$this->tpgs["$TpgName"]);
           }
         }
      }
      function Assign($TpgName,$mrkvar,$tplname="")
      {
        if(!is_array($mrkvar))
          return;
        if(!$tplname)
          $tplname="_MainBlock";
        while ( list ($key,$val) = each ($mrkvar) ){
          $this->tplvars["$TpgName"]["{$tplname}_mrk"]["$key"]="{{$key}}";
          $this->tplvars["$TpgName"]["{$tplname}_var"]["$key"]="$val";
        }
      }
      function Assign1($TpgName,$mrk,$var,$tplname=""){
        if(!$tplname)
          $tplname="_MainBlock";
        $this->tplvars["$TpgName"]["{$tplname}_mrk"]["$mrk"]="{{$mrk}}";
        $this->tplvars["$TpgName"]["{$tplname}_var"]["$mrk"]="$var";
      }
      function AssignBlock($TpgName,$tplname,$Parenttpl=""){
        if(!$Parenttpl)
          $Parenttpl="_MainBlock";
        $this->tplvars["$TpgName"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}";
        $this->tplvars["$TpgName"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname);
      }
      function AssignFBlock($TpgName,$tplname,$TpgName1,$Parenttpl=""){
        if(!$Parenttpl)
          $Parenttpl="_MainBlock";
        $this->tplvars["$TpgName1"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}";
        $this->tplvars["$TpgName1"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname);
      }
      function GetResult($TpgName,$tplname=""){
        if(!$tplname)
          $tplname="_MainBlock";
        return $this->results["$TpgName"]["$tplname"];
      }
      function ClearResult($TpgName,$tplname=""){
        if(!$tplname)
          $tplname="_MainBlock";
        $this->results["$TpgName"]["$tplname"]="";
      }
      function PrintResult($TpgName,$tplname=""){
        if(!$tplname)
          $tplname="_MainBlock";
          echo $this->results["$TpgName"]["$tplname"];
      }
      function Parse($TpgName,$tplname=""){
        if(!$tplname)
          $this->results["$TpgName"]["_MainBlock"]=str_replace(&$this->tplvars["$TpgName"]["_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]);
        else
          $this->results["$TpgName"]["$tplname"]=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["${tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]);
      }
      function ParseAppend($TpgName,$tplname=""){
        if(!$tplname)
          $this->results["$TpgName"]["_MainBlock"].=str_replace(&$this->tplvars["$TpgName"]["{_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]);
        else
          $this->results["$TpgName"]["$tplname"].=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["{$tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]);
      }
    }
    ?>范例:
    模板格式:test.tpl,有两层嵌套
    <html>
    <head><title> {MyTitle} </title>
    </head>
    <body>
    <!--TPL START:MYPAGE-->
    <b>{A1} {A2}</b><br>
    _____________________________________________________________________<br>
    <!--TPL START:MYCONTENT-->
    {N1} {N2}<br>
    <!--TPL End:MYCONTENT-->
    _____________________________________________________________________<br>
    <!--TPL End:MYPAGE-->
    {MyFooter} 
    </body>
    </html>测试文件:test.php
    <?
    include("FlashTemplate.php");
    $t=new FlashTemplate();
    $t->LoadFile(array(TEST=>"./Test.tpl"));//取出模板内容
    $t->LoadBlock("TEST","MYCONTENT");//取出最内层的块
    $t->LoadBlock("TEST","MYPAGE");//取出外层的块
    for($j=1;$j<=10;$j++){//处理外层模板块
      for($i=1;$i<=10;$i++){//处理内层模板块
        $t->Assign("TEST",array(N1=>($j*100+$i),
                                 N2=>($j*100+$i)*10 )
                    ,"MYCONTENT");
        $t->ParseAppend("TEST","MYCONTENT");
      }
      $t->AssignBlock("TEST","MYCONTENT","MYPAGE");//将内层块处理结果指定给外层的一个模板变量
      $t->Assign("TEST",array(A1=>$j,
                               A2=>$j*10 ),
                  "MYPAGE");
      $t->ParseAppend("TEST","MYPAGE");
      $t->ClearResult("TEST","MYCONTENT");//进行下一次内层循环前清空内层结果
    }
    $t->AssignBlock("TEST","MYPAGE");//将外层结果指定到整个文件块的模板变量
    $t->Assign("TEST",array(MyTitle =>"这是我的标题",
                            MyFooter=>"这是我的脚注"));
    $t->Parse("TEST");//处理整个文件块
    $t->PrintResult("TEST");//输出整个文件块的结果
    ?>