Smarty学习手册该如何使我的PHP脚本从设计中独立出来?这无疑地是在PHP邮件列表上所提问的最多的问题之一。虽然PHP被标榜为HTML嵌入式语言,在写过许多php和html混合式的工程之后,我产生了一个分离表单和内容的想法。而且,在许多公司里规划设计者的角色和程序设计者是分开的。于是,这样的一个模板解决方案产生了........例如在我们公司,一个应用程序的开发流程如下:在提交计划文档之后,界面设计者[美工]制作了网站的外观模型,然后把它交给后台程序员。程序员使用PHP实现商业逻辑,同时使用外观模型做成基本架构。然后工程被返回到html页面设计者继续完善。就这样工程可能在后台程序员和页面设计者之间来来回回好几次。由于后台程序员不喜欢干预任何有关html标签,同时也不需要美工们和php鬼混在一起;美工设计者只需要配置文件,动态区块和其他的界面部分,不必要去接触那些错综复杂的php代码。因此,这时候有一个很好的模板支持就显得很重要了。纵观现今存在的许多php模板解决方案,大多数都只是提供了用模板取代变量和将动态区块的功能有限的格式化的基本方法。但是我们的需求比这个要高的多。我们完全不想要php程序员去设计html页面,可是这又是不可避免的。例如:如果美工想要在动态区块之间交替不同的背景颜色,他就可能得和程序员预先说好。同样,美工们也应该有自己对于页面设计的配置文件,这同样可以通过变量把他们拉到模板里边去。继续。早在1999年后期,我们就已经开始为模板引擎写说明文档。在完成这个文档之后,我们开始用c写一个模板引擎,并有希望被包含到php里去。在撞上了许多的技术难题的同时,“什么是模板应该做的,什么不该做”这个问题,也被热烈的讨论着。从这些经验,我们决定应该用Php将模板引擎写成一个类,让任何觉得合适的人使用它。所以我们写了一个引擎,从此就有了smarty.(注:这个类以前从来没有公开发表过)。这个类几乎达到了我们所有的要求:常规变量替换,支持包括其他模板,使用配置文件集成设置,嵌入Php代码,限制'if'语句的作用,还有更多的可以多层嵌套的健壮的动态区块。它用常规表达式做到这一切,于是代码变得相当,我们可以说:令人费解的。在每次调用的时候,都要去解析那些语法和常规表达式,于是在大型应用的时候,它显然慢了下来。在程序员的眼光看来,最大的问题还是使用php脚本建立和处理模板和动态区块的所有必要工作。我们应该如何使他变得更简单?我们可以想象smarty应该有怎样的最后表现。我们知道php代码如果没有了模板解析的开销将有多快,我们也知道从一般的美工看来php语言是多么的恐怖,然而这一切可以被一种更简单的模板语法掩饰掉。我们应该怎样把这两种方法的长处结合起来?于是,Smarty诞生了......第一章什么是Smaty?Smarty是一个php模板引擎。更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法。可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下,他们不可能是同一个人。例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现。在Smarty的程序里,这些被忽略了。模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表格,背景色,字体大小,样式表,等等)。有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变)。这个改变不影响模板设计者,内容仍将准确的输出到模板。同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑。因此,程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑。现在简短的说一下什么是smarty不做的。smarty不尝试将逻辑完全和模板分开。如果逻辑程序严格的用于页面表现,那么它在模板里不会出现问题。有个建议:让应用程序逻辑远离模板,页面表现逻辑远离应用程序逻辑。这将在以后使内容更容易管理,程序更容易升级。Smarty的特点之一是模板编译。意思是Smarty读取模板文件然后用他们创建php脚本。这些脚本创建以后将被执行。因此并没有花费模板文件的语法解析,同时每个模板可以享受到诸如Zend加速器()或者PHP加速器()。这样的php编译器高速缓存解决方案。Smaty的一些特点:1、非常非常的快!2、用php分析器干这个苦差事是有效的3、不需要多余的模板语法解析,仅仅是编译一次4、仅对修改过的模板文件进行重新编译5、可以编辑'自定义函数'和自定义'变量',因此这种模板语言完全可以扩展6、可以自行设置模板定界符,所以你可以使用{},{{}},!--{}--,等等7、诸如if/elseif/else/endif语句可以被传递到php语法解析器,所以{if...}表达式是简单的或者是复合的,随你喜欢啦8、如果允许的话,section之间可以无限嵌套9、引擎是可以定制的.可以内嵌php代码到你的模板文件中,虽然这可能并不需要(不推荐)10、内建缓存支持11、独立模板文件12、可自定义缓存处理函数13、插件体系结构第二章安装第一节Requirements要求Smarty要求web服务器运行php4.0.6和以上版本.第二节BasicInstallation基本安装安装Smarty发行版在/libs/目录里的库文件(就是解压了).这些php文件你可不能乱画哦.这些文件被所有应用程序共享,也只能在你升级到新版的smarty的时候得到更新。例2-1.Smarty库文件Smarty.class.phpSmarty_Compiler.class.phpConfig_File.class.phpdebug.tpl/core/*.php(allofthem)/plugins/*.php(allofthem)Smarty使用一个叫做'SMARTY_DIR'的php常量作为它的系统库目录。基本上,如果你的应用程序可以找到Smarty.class.php文件,你不需要设置SMARTY_DIR,Smarty将会自己运作。但是,如果Smarty.class.php没有在你的include_path(php.ini里的一项设置)里,或者没有在你的应用程序里设置它的绝对路径的时候,你就必须手动配置SMARTY_DIR了(大多数程序都如此)SMARTY_DIR必须包含结尾斜杠。这里是你在你的php脚本里创建一个smarty的应用实例的例子:例2-2.创建Smarty实例require('Smarty.class.php');$smarty=newSmarty;试着运行一下以上脚本,如果你发现未找到Smarty.class.php文件的错误时,你应该这样做:例2-3.加入库文件目录的绝对路径require('/usr/local/lib/php/Smarty/Smarty.class.php');$smarty=newSmarty;例2-4.在include_path加入库文件目录//Edityourphp.inifile,addtheSmartylibrary//directorytotheinclude_pathandrestartwebserver.//Thenthefollowingshouldwork:require('Smarty.class.php');$smarty=newSmarty;例2-5.手工设置SMARTY_DIR常量define('SMARTY_DIR','/usr/local/lib/php/Smarty/');require(SMARTY_DIR.'Smarty.class.php');$smarty=newSmarty;现在库文件已经搞定,该是设置为你的应用程序配置其他有关Smarty的目录的时候了。Smarty要求4个目录,默认下命名为:tempalates,templates_c,configsandcache。每个都是可以自定义的,可以修改Smarty类属性:$template_dir,$compile_dir,$config_dir,and$cache_dirrespectively。强烈推荐你为每个用到smarty的应用程序设置单一的目录!确定你已经知道了你的web服务器文件根目录。在我们的例子里,文件根目录是:/web/的4个目录只可以被那些库文件访问,不可以被网络上的浏览器访问的目录。因此为避免任何安全问题,要求将那4个目录和网页文件目录(就是浏览器看的)分开来。在你的文档目录下至少得有一个文件,这个文件可以被浏览器访问.我们叫它index.php好了.把它放到/guestbook/目录下.技术提示:建立web服务器很方便,这个文件可以被web服务器自动识别。如果你访问,你不需要在URL上输入index.php,index.php脚本就可以被执行。在Apache服务器中,可以通过在DirectoryIndex的后面添加index.php文件(用反斜杠分开每个入口)来完成设置。例2-6.例子的文件结构/usr/local/lib/php/Smarty/Smarty.class.php/usr/local/lib/php/Smarty/Smarty_Compiler.class.php/usr/local/lib/php/Smarty/Config_File.class.php/usr/local/lib/php/Smarty/debug.tpl/usr/local/lib/php/Smarty/core/*.php/usr/local/lib/php/Smarty/plugins/*.php/web/的$compile_dir和$cache_dir必须可写。通常是usernobody和groupnobody。如果是OSX用户,默认为userweb和groupweb。如果你在使用Apache,你可以看看httpd.conf文件(通常在/usr/local/apache/conf/目录下)哪些user和group正在被使用。例2-7文件权限设置chownnobody:nobody/web/:nobody/web/技术提示:chmod770相当安全了,它只让usernobody和groupnobody读/写访问。如果你要对任何人开放读取访问权限(大多是为了你自己查看文件),你可以使用775。我们需要创建index.tpl文件让smarty载入.这个文件放在$template_dir目录里。例2-8编辑/web/{*Smarty*}Hello,{$name}!技术提示:{*Sm