发新话题
打印

XTpl模板引擎使用说明文档, 很短很详细

XTpl模板引擎使用说明文档, 很短很详细

复制内容到剪贴板
代码:

/****************************************
XTpl Template Engine for PHP
Developer:  http://www.weentech.com
Version: 2.1
Requirement: PHP 5.0 or Above
****************************************/

XTpl  致力于最小, 最快, 最强大的PHP模板引擎(参考Smarty, SlightPHP, ECShop, DZ等开发)
特点:
小巧强大, 速度快, 效率高(仅一个类文件, 含注释5K)
简单易学, 没有像书一样的开发文档
支持原生PHP代码, 模板代码书写规范易记
系统要求PHP5.0或以上版本(简单改造可支持PHP4)

目录说明:
cache/           示例中的模板缓存目录, Linux类服务器需要设置为可写
templates/     示例中的模板目录
templates/default           示例中的默认模板default, 一个网站或系统可能有N个模板
                                     此目录下的文件为模板文件, 文件后缀可以任意或无
templates/default/blog    示例中的默认模板default下的blog频道模板, 当然blog目录完全可以不要. !!!!注意: 某个模板目录仅支持一级下级目录
                                     此目录下的文件为模板文件, 文件后缀可以任意或无
XTpl/XTpl.class.php         XTpl模板引擎核心类文件
index.php                       示例程序

一、使用
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, 这个需要特别说明一下:
XTpl默认为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(当前模板目录下仅允许1级下级目录):  {require  'blog/a_b_c.tpl'}
注意:

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. js写法不受影响,但是两个花括号不能在一行上, 否则{}之间的代码当PHP模板代码解析了, 晕.......
<script type="text/javascript">
function aaa(){
  alert('aaa');
}
</script>

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

包含文件有点小改进。

可以这样用了: {incude('xxxx.tpl')}
weenCompany项目组

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

TOP

简单强大 。。。顶

TOP

这个我不懂,进来支持一下。
大气度网 www.DaQiDu.net  净化情绪,提升能量.

TOP

发新话题