/****************************************
XTpl Template Engine for PHP
Developer: http://www.weentech.com
Version: 2.0
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"}
写法2: {include 'a.tpl'}
写法3: {require a.tpl}
写法4(当前模板目录下仅允许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语法, 看完其它语法, 同学们将更有体会!!
3. js写法不受影响,但是两个花括号不能在一行上, 否则{}之间的代码当PHP模板代码解析了, 晕.......
<script type="text/javascript">
function aaa(){
alert('aaa');
}
</script>
4. 显示变量(模板中输出变量的内容)
简单显示: {$test} 注意{}内部不能有任何空格或其它的PHP运行符, 同时必须以$开头, 否则就变成赋值运算了
显示数组: {$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'}
{$var}
{elseif($var)}
{$var}
{/if}
7. for和foreach循环语法同php, 只是需要/for或/foreach结束:
{for($i=1;$i<=8;$i++)}
{$i}
{/for}
{foreach($arr as $k=>$v)}
{$k}: {$v}
{/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指的是模板对象