标签 Smarty 下的文章

小吞AA制记账系统

小吞AA制记账系统

小吞AA制记账系统 是去年10月份写的个人财务管理系统,采用php+mysql,smarty模板引擎。那个时候和同学合租,因为买菜之类的需要AA,就需要报账,所以需求出来了,就写了一个。可以添加、删除、修改,有公费、私费类别,公费可以结算,私费可以算自己的小帐。可以按比例结算,比如4:6的比例来结算。

安装:下载源码

http://tunps.com/lab/php/aa.zip

比如下载到目录d:\www\aa\,用PMA新建数据库,比如名字是expense,然后导入d:\www\aa\expense.sql,修改d:\www\aa\data\config.php 设置你的mysql数据库的用户名、密码、数据库名信息 就可以使用了。

默认的测试数据里面帐号用户名/密码有:admin/admin cc/cc sj/sj lgy/lgy hk/hk ,密码是 md5("用户名") ,你可以自行修改user表来管理用户。

仿ECShop,让Smarty也支持模板路径替换机制

好的,为了把事情讲清楚,我们通过有图有真相的方法,把我的问题描述一下。首先我们来看看这个项目的文件树:

仿ECShop,让Smarty也支持模板路径替换机制

smarty目录是smarty程序,themes是模板目录,themes下面的每一个子目录代表一种模板。默认是default模板。模板下面的dwt是模板文件,lib里面lbi是模板库文件,images目录存放图片。和ECShop十分的类似,因为我准备仿它。
每个dwt对应一个php页面,比如index.php对应index.dwt。好了。比如说index.dwt里面有句HTML代码:

<img src="images/user.gif" alt="user" />

也许你会认为这个图片可以显示出来,但是我们打开localhost/index.php,发现图片并未显示,图片的路径变成了localhost/images/user.gif,而真正的路径应该是localhost/themes/default/images/user.gif。

这只是图片的例子,如果js或者css都需要替换,就需要给smarty写个插件或者是扩展smarty的代码。小弟不才,只能在原来smarty的继续上修改代码,方法是:打开Smarty_Compiler.class.php,跳转到_compile_file函数的这句:

$compiled_content = $template_header . $compiled_content;

的下面添加以下代码,都是用正则表达式(preg_replace)来替换字符串,具体含义有注释:

$tmp_dir   = 'themes/' . $GLOBALS['_CFG']['template'] . '/'; // 模板所在路径

/* 修正css路径 */
$compiled_content = preg_replace('/(<link \shref=["|\'])(?:\.\/|\.\.\/)?(css\/)?([a-z0-9A-Z_]+\.css["|\']\srel=["|\']stylesheet["|\']\stype=["|\']text\/css["|\'])/i','\1' . $tmp_dir . '\2\3', $compiled_content);

/* 修正js目录下js的路径 */
$compiled_content = preg_replace('/(<script\s(?:type|language)=["|\']text\/javascript["|\']\ssrc=["|\'])(?:\.\/|\.\.\/)?(js\/[a-z0-9A-Z_\-\.]+\.(?:js|vbs)["|\']>< \/script>)/', '\1' . $tmp_dir . '\2', $compiled_content);

$pattern = array(
'/<!--[^>|\n]*?({.+?})[^< |{|\n]*?-->/', // 替换smarty注释
'/<!--[^<|>|{|\n]*?-->/', // 替换不换行的html注释
'/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替换相对链接
'/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(images\/.*?["|\'])/is', // 在images前加上 $tmp_dir
'/((?:background|background-image):\s*?url\()(?:\.\/|\.\.\/)?(images\/)/is', // 在images前加上 $tmp_dir
'/([\'|"])\.\.\//is', // 以../开头的路径全部修正为空
);
$replace = array(
'\1',
'',
'\1\2\3',
'\1' . $tmp_dir . '\2',
'\1' . $tmp_dir . '\2',
'\1'
);
$compiled_content= preg_replace($pattern, $replace, $compiled_content);

$GLOBALS['_CFG']['template']是一个全局变量,用于存放当前模板的目录名,你可以放在配置文件中,也可以放入数据库,然后打开页面的时候读取就行了。也并不一定是所有的资源都需要替换,视你的项目情况而定,其实这几行代码都是从ECShop的cls_template.php copy过来的。在dwt里面插入js、css的时候需要注意,rel、type、src等属性的在script和link中的顺序固定按照以上代码的顺序。否则无法替换。

配置smarty开发环境

首先到 http://www.smarty.net 上下载最新的smarty模板引擎,解压Smarty-2.6.26.zip,改名Smarty-2.6.26目录为smarty。 拷贝smarty目录到你希望的目录 D:\xampp\xampp\smarty。 在php.ini的include_path加入smarty库目录,如下: include_path = ".;D:\xampp\xampp\php\PEAR;D:\xampp\xampp\smarty\libs" 在你的php项目目录新建两个子目录放配置文件和模板:config 和templates D:\xampp\xampp\htdocs\config D:\xampp\xampp\htdocs\templates smarty项目目录新建两个目录cache和templates_c存放缓存和编译过的模板: D:\xampp\xampp\smarty\cache D:\xampp\xampp\smarty\templates_c 在需要调用smarty库的php文件中写入代码:

//this is D:\xampp\xampp\htdocs\index.php
//load smarty library
require('Smarty.class.php');

$smarty=new Smarty();
$smarty->template_dir='d:/xampp/xampp/htdocs/templates'; //指定模板存放目录
$smarty->config_dir='d:/xampp/xampp/htdocs/config';//指定配置文件目录
$smarty->cache_dir='d:/xampp/xampp/smarty/cache';//指定缓存目录
$smarty->compile_dir='d:/xampp/xampp/smarty/templates_c';//指定编译后的模板目录
$smarty->assign('name','fish boy!');
$smarty->display('index.tpl');

再新建一个D:\xampp\xampp\htdocs\templates\index.tpl文件

<html>
<head><title>hello,{$name}!</title>
<script language="javascript" type="text/javascript">
alert('{$name}');
</script>
</head>
<body>
hello,{$name}!
</body>
</html>

打开http://localhost/index.php 应该会弹出fish boy!警告,然后内容为hello,fish boy!!的页面。 我们可以改进一下,不可能每次需要smarty写这么多配置代码吧。 新建文件 D:\xampp\xampp\htdocs\smarty_connect.php

//load smarty library
require('Smarty.class.php');
class smarty_connect extends Smarty
{ function smarty_connect()
{//每次构造自动调用本函数
$this->template_dir='d:/xampp/xampp/htdocs/templates';
$this->config_dir='d:/xampp/xampp/htdocs/config';
$this->cache_dir='d:/xampp/xampp/smarty/cache';
$this->compile_dir='d:/xampp/xampp/smarty/templates_c';
}
}

D:\xampp\xampp\htdocs\index.php改为:

require('smarty_connect.php');
$smt=new smarty_connect;
$smt->assign('name','fish boy!');
$smt->display('index.tpl');

index.tpl文件不变,打开localhost/index.php,出现了同样的输出。