上节介绍过,v1.2.0使用的是正则表达式的方式来解析模板里的标签的,熟悉DT系统的人应该比较了解这种模板引擎。和dedecms的模板引擎比较,这种方式解析速度更快些,dedecms采用的是一种类似编译器...

    上节介绍过,v1.2.0使用的是正则表达式的方式来解析模板里的标签的,熟悉DT系统的人应该比较了解这种模板引擎。和dedecms的模板引擎比较,这种方式解析速度更快些,dedecms采用的是一种类似编译器的词法扫描的方式,最后也调用了正则函数来处理标签函数。所以正则表达式的解析方式可以更加方便于编写模板。本节就v1.2.0的模板引擎做介绍。

    本系统既可以使用旧的v1.0的模板引擎,也可以使用v1.2.0的新的模板引擎,两种解析方式都写在common_fun/tpl_class.php类文件里,旧的解析函数如下:

 function setVar($tagname,$tagvar,$boolphp = false)
 {

      if($boolphp == true)
          $tagvar = '<?php '.$tagvar.' ?>';

      $this->outstring = str_replace("{zengl ". $tagname ."}", $tagvar, $this->outstring); //通过str_replace函数将模板中的{zengl .....}标签替换为$tagvar参数对应的PHP代码

 }

    上面的这种方式实现简单,执行效率高,但是编写模板时,每个标签都必须写一个setVar来替换,有点麻烦。

    新的解析函数如下(这里的注释只是为了方便说明额外添加的,在源文件中并没有):

function template_parse() {
    $str = $this->outstring;

    $str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $str);  //将<!--{....}-->替换为{....}

    $str = preg_replace("/\{template\s+([^\}]+)\}/", "<?php include template(\\1);?>", $str); //将{template(....)}替换为<?php include template(....);?>

    $str = preg_replace("/\{php\s+(.+)\}/", "<?php \\1?>", $str); //将{php .....} 替换为 <?php ...... ?>

    $str = preg_replace("/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str); //将{if ......} 替换为 <?php if(......){ ?>

    $str = preg_replace("/\{else\}/", "<?php } else { ?>", $str); //将{else}标签替换为 <?php } else { ?>

    $str = preg_replace("/\{elseif\s+(.+?)\}/", "<?php } else if(\\1) { ?>", $str); //将{elseif .....}替换为<?php } else if(.....) ?>

    $str = preg_replace("/\{\/if\}/", "<?php } ?>", $str); //将{/if}替换为<?php } ?>

    $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/", "<?php if(is_array(\\1)) { foreach(\\1 as \\2) { ?>", $str); //将{loop .... ....}替换为 <?php if(is_array(....)) { foreach(.....  as  .....) { ?>

    $str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", "<?php if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>", $str); //将{loop .... .... ....}替换为<?php if(is_array(....)) { foreach(.....  as  ..... => ....) { ?>

    $str = preg_replace("/\{\/loop\}/", "<?php } } ?>", $str); //将{/loop} 替换为 <?php } } ?>

    $str = preg_replace("/\{while\s+(.+?)\}/", "<?php while(\\1) { ?>", $str); //将{while ....}替换为<?php while(....) { ?>

    $str = preg_replace("/\{\/while\}/", "<?php } ?>", $str); //将{/while}替换为 <?php } ?>

    $str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str); //将类似{test(a,b)}这样的函数标签替换为<?php echo test(a,b);?>之类的

    $str = preg_replace("/<\?php([^\?]+)\?>/es", "template_addquote('<?php\\1?>')", $str); //对PHP里的数组元素添加必要的引号

    $str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str); //将类似{$test}这样的变量标签替换为<?php echo $test;?>

    $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\->\$\x7f-\xff]+)\}/es", "template_addquote('<?php echo \\1;?>')", $str); //为类成员添加必要的引号

    $str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>", $str); //将类似{MACRO}这样的常量标签替换为<?php echo MACRO;?>

    $str = preg_replace("/\'([A-Za-z]+)\[\'([A-Za-z\.]+)\'\](.?)\'/s", "'\\1[\\2]\\3'", $str); //将类似'abc['abc']'这样的标签替换为'abc[abc]'

    $str = preg_replace("/(\r?\n)\\1+/", "\\1", $str); //将多个连续的\r\n或多个连续的\n进行合并

    $str = str_replace("\t", '', $str); //将tab制表符替换为空字符串

    $this->outstring = $str;

    return $str;
}
 

    从上面的函数可以看出来,新的模板引擎也是将标签替换为PHP代码,只不过书写标签更加灵活,下面是index.tpl首页模板里的部分代码:
 

    从这些代码里可以看到新模板引擎标签的使用方法。

    模板经过模板引擎的解析后,会生成一个PHP的缓存文件,例如tpl/mydefined/index.tpl这个模板经过解析后,将会在tpl/cache中生成一个index_cache.php缓存文件,下次访问index.tpl模板时,如果该模板没有被修改过,系统就会直接加载index_cache.php缓存文件,而不用再次解析,下面是该缓存文件的部分代码:


    通过对比index.tpl和index_cache.php文件,就可以清楚的知道模板标签的解析情况。

    同样是采用MVC的方式进行模板开发,例如tpl/mydefined/class/index_articles_class.php该文件和v1.0一样,在该文件里通过调用tpl类加载模板引擎,然后调用模板引擎的template_parse函数对index.tpl首页模板进行解析,通过cache函数生成index_cache.php缓存文件,最后include来加载该缓存文件,从而输出最终的解析结果:


    可以通过解读其他的模板,来掌握模板标签的使用方法,并试着编写出自己的网站模板。

    OK,休息,休息一下 o(∩_∩)o~~
上下篇

下一篇: zenglcms v1.2.0 水印功能和进度条类

上一篇: zenglcms v1.2.0发布版

相关文章

zenglcms v1.2.0发布版

zenglcms 数据库结构

zenglcms v1.2.0 自定义栏目类型

zenglcms sqlite和mysql数据库操作类

zenglcms v1.0.0的安装

zenglcms CKEditor在线编辑器