What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
在Smarty发行包中,目录/libs/
里面的文件就是Smarty的库文件。
库文件都是.php
文件,开发者不应该编辑它们。
库文件可以多个应用程序共用,而且只在升级新版本的Smarty时进行覆盖。
下面的例子Smarty的库文件被解压:
/usr/local/lib/Smarty-v.e.r/
在 *nix
的环境
以及
c:\webroot\libs\Smarty-v.e.r\
在
windows 环境.
Example 2.1. 载入Smarty库文件
Smarty-v.e.r/ libs/ Smarty.class.php debug.tpl sysplugins/* (everything) plugins/* (everything)
Smarty的SMARTY_DIR
常量,是定义
Smarty库文件libs/
目录的
完整系统路径。
一般来说,如果你的程序可以找到Smarty.class.php
文件,
那么你不需要设置SMARTY_DIR
,
Smarty会自行进行赋值。
然而,如果Smarty.class.php
文件不在你的
include_path内,
或者你不能在程序中使用绝对路径的时候,那么你需要定义SMARTY_DIR
。
SMARTY_DIR
必须以斜杠(/)结尾。.
在PHP中实例化Smarty对象的方法:
<?php // NOTE: Smarty has a capital 'S' require_once('Smarty.class.php'); $smarty = new Smarty(); ?>
运行上面的程序。如果发生错误提示说找不到Smarty.class.php
文件,
那么你需要按下面的其中一种方法来处理:
Example 2.2. 手动指定 SMARTY_DIR 常量
<?php // *nix style (note capital 'S') define('SMARTY_DIR', '/usr/local/lib/Smarty-v.e.r/libs/'); // windows style define('SMARTY_DIR', 'c:/webroot/libs/Smarty-v.e.r/libs/'); // hack version example that works on both *nix and windows // Smarty is assumend to be in 'includes/' dir under current script define('SMARTY_DIR',str_replace("\\","/",getcwd()).'/includes/Smarty-v.e.r/libs/'); require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); ?>
Example 2.3. 用绝对路径引用库文件
<?php // *nix style (note capital 'S') require_once('/usr/local/lib/Smarty-v.e.r/libs/Smarty.class.php'); // windows style require_once('c:/webroot/libs/Smarty-v.e.r/libs/Smarty.class.php'); $smarty = new Smarty(); ?>
Example 2.4. 将库文件路径增加到php.ini
文件
;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; *nix: "/path1:/path2" include_path = ".:/usr/share/php:/usr/local/lib/Smarty-v.e.r/libs/" ; Windows: "\path1;\path2" include_path = ".;c:\php\includes;c:\webroot\libs\Smarty-v.e.r\libs\"
Example 2.5. 通过函数ini_set()
来设置include path
<?php // *nix ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'/usr/local/lib/Smarty-v.e.r/libs/'); // windows ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'c:/webroot/lib/Smarty-v.e.r/libs/'); ?>
现在,库文件已经放好了,可以开始为你的程序配置Smarty了:
Smarty可配置四个目录,默认名称分别是
templates/
,
templates_c/
, configs/
和 cache/
。
这些都分别对应Smarty类的属性定义
$template_dir
,
$compile_dir
,
$config_dir
, 和
$cache_dir
。
强烈建议分别在每个使用Smarty的程序中都单独定义这些目录。
你可以通过testInstall()
来测试Smarty是否有权限读写这些目录。
在下面的安装例子中,我们将为一个留言本程序建立Smarty环境。
我们提供了一个目录命名约定的例子。
你可以为任何的程序建立同样的环境,仅需要修改guestbook/
名称。
Example 2.6. 目录文件结构
/usr/local/lib/Smarty-v.e.r/libs/ Smarty.class.php debug.tpl sysplugins/* plugins/* /web/www.example.com/ guestbook/ templates/ index.tpl templates_c/ configs/ cache/ htdocs/ index.php
明确你的web服务器文档根目录。在下面的例子中,
文档根目录是/web/www.example.com/guestbook/htdocs/
。
Smarty目录仅可以通过Smarty库文件访问,而不能直接被浏览器访问。
这样可以避免一些安全问题,强烈建议(但不强制)把这些目录
放到WEB服务器文档根目录之外。
将会有至少一个文件是放到文档根目录的,这个文件也会被浏览器访问到。
我们将这文件命名为index.php
,
放置到文档根目录/htdocs/
中。
Smarty需要一些对目录的
读写权限
(windows用户请忽略),包括
$compile_dir
和
$cache_dir
目录
(templates_c/
和
cache/
),
所以,要确保web服务器用户有权限读写它们。
通常是用户“nobody” 和组“nobody”.
OS X用户,默认用户是“www”和组“www”.
如果你使用Apache,你可以看看你的httpd.conf
来确定是使用什么用户和组的。
Example 2.7. 设置目录的读写权限
chown nobody:nobody /web/www.example.com/guestbook/templates_c/ chmod 770 /web/www.example.com/guestbook/templates_c/ chown nobody:nobody /web/www.example.com/guestbook/cache/ chmod 770 /web/www.example.com/guestbook/cache/
chmod 770
是比较适当的安全设置,仅允许
用户“nobody”和组“nobody”可以读写访问这些目录。
如果你希望能让所有人都能读取该目录 (大部分是因为你需要方便查看这些目录内的文件),
你可以使用775
。
我们需要创建文件index.tpl
,然后供Smarty显示。
文件需要放到
$template_dir
目录内。
Example 2.8. /web/www.example.com/guestbook/templates/index.tpl
{* Smarty *} Hello {$name}, welcome to Smarty!
{* Smarty *}
是模板的
注释.
虽然不是必须的,但在模板内添加注释这是个很好的习惯。
它可以帮助识别出文件类型,而不需要看后缀。
比如说,代码编辑器可以识别该文件并自动语法高亮。
现在,我们来修改index.php
.
我们将创建Smarty的实例,给模板assign()
赋值变量, 并且display()
显示该模板文件
index.tpl
。
Example 2.9. 修改 /web/www.example.com/docs/guestbook/index.php
<?php require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); $smarty->setTemplateDir('/web/www.example.com/guestbook/templates/'); $smarty->setCompileDir('/web/www.example.com/guestbook/templates_c/'); $smarty->setConfigDir('/web/www.example.com/guestbook/configs/'); $smarty->setCacheDir('/web/www.example.com/guestbook/cache/'); $smarty->assign('name','Ned'); //** un-comment the following line to show the debug console //$smarty->debugging = true; $smarty->display('index.tpl'); ?>
在我们的例子中,我们为Smarty的目录使用了绝对路径。
如果/web/www.example.com/guestbook/
在你PHP的include_path内,
那么,这些设置不是必须的。
然而,设置成绝对路径,是更高效和更不容易出错(来自经验)。
这可以保证Smarty的目录路径被设置成正确的。
现在,用浏览器访问index.php
文件。
你可以看到"Hello Ned, welcome to Smarty!"
你已经完成了Smarty的基础安装!