免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HonestQiao
打印 上一主题 下一主题

[模板 下载地址更新] SmartTemplate(适用于企业级PHP开发的模板引擎) [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
71 [报告]
发表于 2005-12-13 13:43 |只看该作者
原帖由 ptsmy 于 2005-12-13 09:52 发表
版主,在你的推荐下我试用了一下smarttemplate觉得正是自己一直寻找的东西,比smarty小巧。但是我仔细看一下好像smarttemplate的cache有问题不能用,我在模板代码中也没有发现实现cache功能的代码,还请版主指点



1. 这个是编译的中间文件目录,其中文件是PHP文件
$_CONFIG['smarttemplate_compiled']        = SMARTTEMPLATE_ROOT . 'smarttemplate_compiled/';
2. 这个是缓存的中间文件目录,其中文件是是HTML文件
$_CONFIG['smarttemplate_cache']                = SMARTTEMPLATE_ROOT . 'smarttemplate_cache/';
3. 缓存保存的时间
$_CONFIG['cache_lifetime']                        = 30*60*60*24;        //缓存一个月

注意:目录必须可被php读写。
然后在页面之中,$page->use_cache(),即可为当前的程序生成和使用缓存了。
一般情况时,在什么条件下,缓存会更新?可以是以下情况之一或者组合
1. POST表单提交了数据
2. WEB服务器或者客户浏览器强制更新
3. 缓存文件生存的时间达到了cache_filename
4. URI改变

可见,cache的使用是非常简单的。

$page->use_cache()也可以使用$page->use_cache($key)
$key可以是一个任意类型的php的变量/常量。
$key默认为空,你可以传递一个任意的参数进来作为缓存参数。

为什么使用$key?
很显而易见的使用,文章系统,showArticle.php?id=文章编号。
那么最简单的情况下,你可以使用$key=文章编号,来作为key,这样子可以缓存每一篇不同的文章。

[ 本帖最后由 HonestQiao 于 2005-12-13 17:51 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
72 [报告]
发表于 2005-12-13 14:06 |只看该作者
原帖由 dualface 于 2005-12-13 13:07 发表
Smart Template 到底有用没用?

我认为基本上没什么实用价值,原因如下:

第一:功能太简单。既无法提供 Smarty 那样的扩展能力,又缺乏更新版本支持和各种插件;

反方意见:我根本用不上那么多功能啊, ...


你的意见很好,不过我仅仅针对你的这三个意见本身做一些探讨:

Smart Template 到底有用没用?

我认为基本上没什么实用价值,原因如下:

第一:功能太简单。既无法提供 Smarty 那样的扩展能力,又缺乏更新版本支持和各种插件;

反方意见:我根本用不上那么多功能啊,我干嘛要用 Smarty 这个庞然大物?
我说:那你不如直接用 php 做模板得了,还要什么模板引擎啊,多此一举!
反方意见:可我要允许用户自行修改模板,这个时候嵌入 PHP 代码很危险哦!
我说:如果你的系统是允许普通用户修改模板,那么这个时候应该使用模板系统,
不过不是用 Smart Template,而是 Smarty!

首先,Smarty 提供了丰富得多的功能。
其次,你可以开发各种插件,把原本需要好几行的模板代码简化成一个标签,
例如我开发的一套 Smarty 插件,允许使用下面形式的标签:
<% CMSEntryBody title="我的第一次" %>
就会输出标题为“我的第一次”这篇文章的内容。这样用户不但在模板里面就能
输出内容,还能控制输出什么。

这些用 Smart Template 是做不到的哦!


探讨:
关于首先,这一点Smarty作为一个庞然大物,倘若没有如此优势,势必是一定的
关于其次,SmartTemplate的插件其实相当的简单和容以开发。
关于例子,SmartTemplate本身就有load_config,把你这样子类似配置的部分,直接使用一个配置文件了。

第二:根本不存在什么更容易学习的神话;
反方意见:不都说了 {TITLE} <!-- IF --> 看上去比
<?php echo $title ?> <?php if ?> 更简单吗?

我说:幻觉而已!对程序员来说,模板自身的语法反倒增加了学习成本。
而对于美工来说,有必要学么?

如果要美工掌握如何嵌入循环、判断这些,和让他搞懂 <?php if else ?> 完全没区别。
可实际工作中,有几个美工能嵌代码啊?还不就是做图、切图、做成页面,
然后由程序员来嵌代码。

有人要说了:你可以教啊,教会了美工,他自己就能嵌代码了!你就解放了!
我要说:解放个屁啊!

嵌代码总要预览一下效果吧?你还得帮他在工作机上安装配置 php、mysql 这些。
如果你改了数据结构,还要记得同步到他的机器上。
最后,他不看程序能知道页面里面该嵌什么变量?
所以他还得不停的问你这个嵌什么、那个嵌什么。

如果他能看懂程序,那他还是美工么?

所以说,让美工嵌代码只是一种幻想而已!


探讨:
对于程序员而言,使用任何一个模板系统,语法他都要学,这个并不是SmartTemplate的错或者缺点,但是你拿来专门说。
对于美工而言,{TITLE}这样子的方式(甚至{文章标题}),他可以很容易的看到实际的效果,而<??>的方式,势必要差一些。
所谓让美工嵌代码,那当然是幻想。但是程序和美工是可以很好的协作分工的。

第三:Smart Template 的有些特征难以使用
像 Smart Template 的 cache 功能就特别难用,在面向对象的体系中如果不修改
Smart Template 自身,几乎无法将 Smart Tempalte 集成到系统中来。


探讨:cache其实很简单。


其他还有些细节问题也设计得不好,越用越不爽。

我以前觉得 Smart Template 小巧玲珑,挺方便的。后来做点复杂的东西才知道根本
不是那么回事。不但要改 Smart Template 自身,还要补充很多扩展功能,累啊!

所以我现在要么用 php 作模板,要么用 smarty。


探讨:
你可以说说,Smarty之中,那些非常非常复杂富有特色的部分。
也需我们可以吸取Smarty有特色而且实用的部分。

论坛徽章:
0
73 [报告]
发表于 2005-12-13 14:17 |只看该作者
模板->编译->缓存?
有点奇怪的感觉
如果直接采用输出php变量,取消assign那一步如何?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
74 [报告]
发表于 2005-12-13 14:23 |只看该作者
原帖由 ysixin 于 2005-12-13 14:17 发表
模板->编译->缓存?
有点奇怪的感觉
如果直接采用输出php变量,取消assign那一步如何?



为什么这么做?
如果你确实要这么做,那么你完全不需要类似的模板系统的。

论坛徽章:
0
75 [报告]
发表于 2005-12-13 14:31 |只看该作者
HonestQiao 谢谢你的回复,但是我的模板还是不能cache,我仔细查看了三个模板文件,我看了一下编译的代码,他是通过write把模板解析成PHP文件,但是我找遍了三个文件,没有发现他用write(我推断他写成HTML文件应该也是用的write)写成HTML文件(缓存后的HTML文件)

这是他的 une_cache函数,中间有个判断缓存文件的IF语句
if (($_SERVER['HTTP_CACHE_CONTROL'] != 'no-cache')  &&  ($_SERVER['HTTP_PRAGMA'] != 'no-cache')  &&  @is_file($this->cache_filename))

这个$this->cache_filename文件是在哪儿生成的呢?这一块不原明白,请版主解答~


                                {


  1.         function use_cache ( $key = '' )
  2.                 {
  3.                        
  4.                        
  5.                         if (empty($_POST))
  6.                         {
  7.                                 $this->cache_filename  =  $this->cache_dir . 'cache_' . md5($_SERVER['REQUEST_URI'] . serialize($key)) . '.ser';
  8.                        

  9.                                 if (($_SERVER['HTTP_CACHE_CONTROL'] != 'no-cache')  &&  ($_SERVER['HTTP_PRAGMA'] != 'no-cache')  &&  @is_file($this->cache_filename))
  10.                                 {
  11.                                
  12.                                         if ((time() - filemtime($this->cache_filename)) < $this->cache_lifetime)
  13.                                         {
  14.                                                 readfile($this->cache_filename);
  15.                                                 exit;
  16.                                         }
  17.                                 }
  18.                                 ob_start( array( &$this, 'cache_callback' ) );
  19.                         }
  20.                 }
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
76 [报告]
发表于 2005-12-13 14:57 |只看该作者
不知道你是真的不知道,还是假的不知道,因为你都知道去看类的源代码而且找到了函数所在:

  1. $this->cache_filename  =  $this->cache_dir . 'cache_' . md5($_SERVER['REQUEST_URI'] . serialize($key)) . '.ser';
复制代码

这不是很明确给出了$this->cache_filename的生成方式么?
$this->cache_dir来自于$_CONFIG['smarttemplate_cache']的设置,你这个设置不正确,是无法缓存的哦。

ob_start( array( &$this, 'cache_callback' ) );这个不就是调用cache_callback()来生成缓存么?

论坛徽章:
0
77 [报告]
发表于 2005-12-13 15:44 |只看该作者
HonestQiao 不好意思,看到下面的代码了。但是我重新测试了一下,在tmp里面之有Alternating_Colors_html.php文件,也就是说编译文件,但是没有有缓存文件,这个目录下面只有这一个文件,是哪儿的问题呢?



  1. <?php

  2.     require_once "class.smarttemplate.php";

  3.         $_CONFIG['smarttemplate_compiled']   ='./tmp/';
  4.         $_CONFIG['smarttemplate_cache']      =  './tmp/';
  5.         $_CONFIG['cache_lifetime']           = 30*60*60*24;        //缓存一个月

  6.     $page = new SmartTemplate("Alternating_Colors.html");

  7.         $page->use_cache();

  8.     $users = array(
  9.                array( 'NAME' => 'John Doe',   'GROUP' => 'ADMIN' ),
  10.                array( 'NAME' => 'Jack Doe',   'GROUP' => 'SUPPORT' ),
  11.                array( 'NAME' => 'James Doe',  'GROUP' => 'GUEST' ),
  12.                array( 'NAME' => 'Jane Doe',   'GROUP' => 'GUEST' ),
  13.              );
  14.     $page->assign( 'users',  $users );
  15.     $page->output();

  16. ?>

复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
78 [报告]
发表于 2005-12-13 17:53 |只看该作者
奇怪,我就是把目录的权限设置为777,那么我就可以使用了。

你可以这么测试:
function use_cache($key)
{
   ...
}

你在每一个判断的地方,用die("test");来测试,看看你到底到了什么地方。

论坛徽章:
0
79 [报告]
发表于 2005-12-13 19:12 |只看该作者
这是我的测试结果,我想问题是不是出在这儿了,ob_start( array( &$this, 'cache_callback' ) );
这个好像没有起作用,另外我不太清楚ob_start( )带参数的用法,不知道是哪儿的问题
另外我的测试平台是PHP Version 4.3.11  + XP SP2,PHP是默认安装



  1. function use_cache ( $key = '' )
  2. {
  3.         //die("test"); //有输出"test"       
  4.         if (empty($_POST))
  5.         {
  6.                 //die("test"); //有输出"test"       
  7.                 $this->cache_filename  =  $this->cache_dir . 'cache_' . md5($_SERVER['REQUEST_URI'] . serialize($key)) . '.ser';

  8.                 if (($_SERVER['HTTP_CACHE_CONTROL'] != 'no-cache')  &&  ($_SERVER['HTTP_PRAGMA'] != 'no-cache')  &&  @is_file($this->cache_filename))
  9.                 {
  10.                         //die("test"); //没有输出       
  11.                         if ((time() - filemtime($this->cache_filename)) < $this->cache_lifetime)
  12.                         {
  13.                                 readfile($this->cache_filename);
  14.                                 //die("test"); //没有输出       
  15.                                 exit;
  16.                         }
  17.                 }
  18.                 //die("test"); //有输出"test"       
  19.                 ob_start( array( &$this, 'cache_callback' ) );
  20.                 //die("test"); //有输出"test"       

  21.         }
  22. }

复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
80 [报告]
发表于 2005-12-13 22:22 |只看该作者
你是什么WEB服务器?
IIS还是Apache?

在IIS上面,我遇到过类似的ob_start没有起作用的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP