发新话题
打印

HongCMS使用XTpl模板引擎,模板语法详细说明

本主题由 weenfier 于 2013-4-23 19:24 设置高亮

HongCMS使用XTpl模板引擎,模板语法详细说明

HongCMS使用XTpl模板引擎                                                                                                                                                                                                                                  特点:
小巧强大, 速度快, 效率高(仅一个类文件, 含注释5K)
简单易学, 没有像书一样的开发文档
支持原生PHP代码, 模板代码书写规范易记
系统要求PHP5.0或以上版本

XTpl可以独立使用,下载地址:http://www.weentech.com/bbs/thread-3565-1-1.html


一、使用
1. 加载XTpl类文件
    include(XTpl.class.php);   //包含XTpl模板引擎核心类文件, 如果使用__autoload魔术函数, 这一步都可省略, 参照index.php文件

2. 实例化
    普通方法: $tpl = new XTpl;

    扩展方法: class index extends XTpl{ ... }   //也就是你的系统中的类从XTpl类中扩展而来, 这样符合MVC开发模式, 示例index.php就是这样做的

3. 初始化
    普通实例化时的初始化:
    $tpl->tpl_compile_dir = ROOT . 'cache/default/';         //定义模板缓存路径: cache缓存目录, default为当前模板
    $tpl->tpl_template_dir = ROOT . 'templates/default/';  //定义当前模板路径: templates为模板目录, default为当前模板

    $tpl->tpl_safe_mode = false;    //XTpl类中,此项默认为false, 如果为true, 那么模板文件中写入的PHP代码将被注释而不会运行

    $tpl->tpl_check = true;    //XTpl类中,此项默认为true, 这个需要特别说明一下:
    此项设置默认为true, 意思是加载模板时将检查此文件是否已经更新, 如果更新了就重新生成缓存, 如果未更新就直接读缓存, 这种情况适合网站开发初期
    因为检查文件是否更新了, 比较消耗系统资源, 所以可以在系统开发完成后关闭此功能, 也就是设置为false
    当设置为false时, 模板如果更新了, 此时需要清空缓存才能显示修改后的结果, 后面再说明tpl_remove_cache()清空缓存函数


    扩展实例化时的初始化:
    $this->tpl_compile_dir = ROOT . 'cache/default/';
    $this->tpl_template_dir = ROOT . 'templates/default/';
    .....

4. 分配变量到模板文件(以下均以扩展实例化XTpl为例)

    //一个数组
    $arr = array(
        'key1'=>'value1',
        'key2' => 'value2'            
    );

    $this->assign('test',  'a test var.'); //分配单个变量, 模板中这样调用: {$test}
    $this->assign($arr);  //同时分配多个变量, 模板中这样调用:{$key1}或{$key2}
    $this->assign('arr', $arr); //分配数组, 模板中这样调用: {$arr['key1']} {$arr.key1} 或 使用for或foreach循环来显示

    $someone = new someone(); //一个对象

    $this->assign('obj', $someone); //分配对象, 模板中这样调用对象成员变量或函数: {$obj->myname}或{$obj->showname('aaaa')}

5. 加载模板文件
    $this->display('index.tpl'); //加载模板文件, 支持下级目录, 如: $this->display('dirname/xxxx.tpl'); dirname表示当前模板目录下的二级目录

6. 清空缓存
    上面说了, 当tpl_check设置为false时, 如果修改了模板文件, 那么需要清空缓存才能显示修改后效果
    XTpl.class.php文件中也为你做好了一上独立的清空缓存函数tpl_remove_cache(), 它不依赖于XTpl类, 但XTpl类中使用了它(改函数名称时注意)

    如果已经实例化了模板对象, 清空当前模板的缓存很容易:
    $tpl->clear_compiled_tpl();  或  $this->clear_compiled_tpl();

    有些网站系统后台管理往往不使用模板引擎, 那么可以将XTpl.class.php中的tpl_remove_cache()函数复制到系统的函数库中, 这样运行:
    tpl_remove_cache(ROOT . 'cache/default/'); //将当前模板路径作为参数

    建议不要这样做: tpl_remove_cache(ROOT . 'cache/'); 否则将整个cache目录删除了


二、模板语法(模板文件编码规范)

1. 注释的写法两种:
        
    标准(推荐):    <!--注释的写法1-->

    或:              {*注释的写法2*}

    注意: 如果在模板中插入了PHP代码, 那么PHP代码中不能按上述两种方式写注释, 而应该按PHP规则写注释


2. 包含模板文件的写法:
    写法1:  {include "a.tpl"}或{include 'a.tpl'}{require     a.tpl}     //无引号, 单引号或双引号都行, 也可以混用
    写法2:  {include('a.tpl')}或{include ( 'a.tpl' ) } //使用括号

    写法3:  {require     'blog/a_b_c.tpl'}   //注意, 当前模板目录下仅允许1级下级目录

    注意:
   
    i). 在任何模板文件中包含其它文件, 其路径都是相对于当前模板目录, 这一点不同于PHP, 需要注意
    比如: 在blog/a_b_c.tpl文件中, 想包含blog/xxx.tpl文件, 不能写成{include  "xxx.tpl"}, 而要写成: {include  "blog/xxx.tpl"}

    ii). include和require没有任何差别, 前面加@也无效. 这两种包含文件的方式完全是为了满足某些同学的习惯

    iii). 如果不使用括号, include或require后面至少有一个空格.

    Smarty, DZ等这样写{include file="a.tpl"}, 而XTpl的写法更简单, 同时更像PHP语法, 看完其它语法, 同学们将更有体会!!

    模板中是否可以包含PHP文件呢? 当然可以, 但要使用PHP代码的方式, 如: <?php include('xxx.php'); ?> 那么此句中包含的文件是相对于当前运行的PHP文件


3. CSS或JS写法不受影响,但是两个花括号需要独立成行, 否则{}之间的代码当PHP模板代码解析了, 并且会出错!!!  晕菜.......
    <script type="text/javascript">
    function aaa(){
        alert('aaa');
    }
    </script>

    <style type="text/css">
    body {
        font:12px;
        ......
    }
    </style>

    实在是不想分行, 有时确实需要在一行上编写js代码,那么可以在{后面加一个空格,如: function aaa(){  alert('haha')}, CSS同理。

    如果不想分行又不能有空格该怎么办呢?  比如要输出:{今天的天气不错},那你只好把{}转换成ASCII码了。

4. 显示变量(模板中输出变量的内容)

    简单显示: {$test}  注意{}内部不能有任何空格或其它的PHP运行符, 同时必须以$开头, 否则就变成赋值运算了

    显示数组: {$arr["key1"]} 或 {$arr['key2']} 或 {$arr.key1} 或 {$arr.key2}

    显示对象成员变量(->前后不能有空格): {$obj->myname}

    显示对象成员函数运行返回值(->前后不能有空格): {$obj->showname('aaaa')}

    显示系统常量: {echo ROOT}  注意不能写成这样: {ROOT}

    显示运算后的结果: {echo intval($key + 1.2)} 注意不能写成这样: {intval($key + 1.2)}


    能否{echo $test}或{print $test}这样显示变量呢?  当然可以, 只要你不怕累着, 呵呵.


5. 变量赋值及运算

    简单赋值: {$key=3}

    运算赋值: {$key = 3+6}

    运算赋值: {$key = $key+6}

    调用系统函数运算并赋值: {$key=intval($key+0.6)}

    字符串运算: {$key=$key.'aaa' . 'bbb'}

    赋值中使用对象成员变量或函数(->前后可以有空格): {$key=$obj -> myname .$obj -> showname('aaaa')}

    调用系统常量运算: {$key = ROOT . 'abc/'}


    XTpl模板中的赋值和运算, 几乎写PHP代码一样, 实在是太强了. 这样类似Smarty中的函数和修改器就完全没必要了
    比较Smarty中cat修改器这样写: {$test|cat:'123'|cat: "456"}
    XTpl中这样写:                      {echo $test.'123'.'456'}

    对比一下, 是不是更短更简单了, 再也不用记cat这样的修改器名称和用法了

    再比如: 由于模板中的URL有时需要根据系统是否开启伪静态来切换, 这时系统中可以做一个URL($url)之类的函数:
    function URL($url){
        if('开启伪静态'){
            return xxxx . $url;
        }else{
            return yyyy . $url;
        }
    }

    那么在模板中可以这样写URL:  {echo URL('blog/index')}
    如果上面的URL函数中是echo输出(不建议), 那么可以直接这样写: {URL('blog/index')}
   

6. if elseif else语法同PHP, 只是需要/if结束:
    {$var  = 3} //赋值

    {if $var=='1' || $var=='9'}
        {$var}
    {elseif($var=='2' AND $var != '9') OR $var==3}
        {$var}
    {else}
        {$var}
    {/if}

   
7. for和foreach循环语法同php, 只是需要/for或/foreach结束:

    {for($i=1;$i<=8;$i++)}  
        {$i}  
    {/for}

    <!--不要括号也可以, 但for后面需要有空格, foreach同理-->
    {for $i=1; $i<=8; $i++}      
        {$i}  
    {/for}

    {foreach($arr as $k=>$v)}  
        {$k}: {$v}
    {/foreach}

    <!--二维或多维数组-->
    {foreach($arr as $key=>$value)}  
        {$value.id}  或 {$value['id']}     
        {$value.item.item2}  或 {$value['item']['item2']}
    {/foreach}


8. 直接使用PHP代码, 意味着你可以做PHP中的任何事:

    <?php
        //注意: php代码中的注释只能按PHP规则写
        echo 'this is php codes';

        $this->dothing();
    ?>
   

9. 在模板文件中, 是否可以在模板代码中调用php代码中定义的变量呢?可以, 但是复杂一点点.
   也就是说你可以使用PHP代码处理变量,然后用特定格式赋值,再在模板代码中调用. 比如处理环境变量等
   

    <?php
        //php代码语法可以按php规则书写,包括注释

        $this->_tpl_vars['var_test'] = $_SERVER['HTTP_HOST'];

    ?>

    模板代码中调用php变量: {$var_test}
   

10. 在模板文件中, PHP代码是否可以调用模板代码中的变量呢?可以, 但是复杂一点点.

    {$aaa = array('a', 'b')}      <!--前面是模板代码-->

    <?php
        echo '<pre>';
        var_dump($this->_tpl_vars['aaa']);   //这里是PHP代码
        echo '</pre>';
    ?>


第9条和第10条说的就是PHP代码和模板代码之间交互, 注意这个东东$this->_tpl_vars的写法就OK了.
无论你是用普通方法, 还是扩展方法实例化XTpl模板类, 都是这样写: $this->_tpl_vars, 这里的$this指的是模板对象


...
weenCompany项目组

闻泰网络-开启你的创意生活!

TOP

发新话题
最近访问的版块