Smarty 是什么?
为什么使用它?
使用案例和工作流
语法比较
模板继承
最佳做法
速成班
目录
模板可能来自各种来源。当您 display()
或 fetch()
模板或从另一个模板包含模板时,您将提供一个资源类型以及相应的路径和模板名称。如果没有明确指定资源,$default_resource_type
(默认:"file")的值将成立。
Smarty 内置了一个文件系统的模板资源。file:
是默认资源。仅当 $default_resource_type
已更改时,才必须指定资源密钥 file:
。
如果文件资源找不到请求的模板,则会调用 $default_template_handler_func
。
从 Smarty 3.1 开始,除非 $use_include_path
已激活,否则文件资源不再遍历 include_path
文件资源从 $template_dir
中指定目录拉取模板源文件。目录列表按其在数组中出现的顺序进行遍历。找到的第一个模板将被处理。
示例 16.1。使用 $template_dir 中的模板
<?php $smarty->display('index.tpl'); $smarty->display('file:index.tpl'); // same as above ?>
来自 Smarty 模板
{include file='index.tpl'} {include file='file:index.tpl'} {* same as above *}
Smarty 3.1 为指定元素从变量$template_dir
引入方括号语法。它可以使采用多组模板的网站能够更好地控制要访问的模板。
方括号语法适用于可以指定file:
资源类型中模板的任何位置。
示例 16.2 指定要使用的 $template_dir
<?php // setup template directories $smarty->setTemplateDir(array( './templates', // element: 0, index: 0 './templates_2', // element: 1, index: 1 '10' => 'templates_10', // element: 2, index: '10' 'foo' => 'templates_foo', // element: 3, index: 'foo' )); /* assume the template structure ./templates/foo.tpl ./templates_2/foo.tpl ./templates_2/bar.tpl ./templates_10/foo.tpl ./templates_10/bar.tpl ./templates_foo/foo.tpl */ // regular access $smarty->display('file:foo.tpl'); // will load ./templates/foo.tpl // using numeric index $smarty->display('file:[1]foo.tpl'); // will load ./templates_2/foo.tpl // using numeric string index $smarty->display('file:[10]foo.tpl'); // will load ./templates_10/foo.tpl // using string index $smarty->display('file:[foo]foo.tpl'); // will load ./templates_foo/foo.tpl // using "unknown" numeric index (using element number) $smarty->display('file:[2]foo.tpl'); // will load ./templates_10/foo.tpl ?>
来自 Smarty 模板
{include file="file:foo.tpl"} {* will load ./templates/foo.tpl *} {include file="file:[1]foo.tpl"} {* will load ./templates_2/foo.tpl *} {include file="file:[foo]foo.tpl"} {* will load ./templates_foo/foo.tpl *}
$template_dir
之外的模板需要file:
模板资源类型,后跟模板的绝对路径(带前置斜杠)。
启用Security
后,只有在您在$secure_dir
中列出这些目录的情况下,才允许访问$template_dir
之外的模板。
示例 16.3 使用任何目录中的模板
<?php $smarty->display('file:/export/templates/index.tpl'); $smarty->display('file:/path/to/my/templates/menu.tpl'); ?>
以及在 Smarty 模板内部
{include file='file:/usr/local/share/templates/navigation.tpl'}
如果您使用的是 Windows 机器,文件路径通常在路径名的开头包含一个驱动器号 (C:)。请务必在路径中使用file:
来避免命名空间冲突并获得所需的结果。
示例 16.4 从 Windows 文件路径使用模板
<?php $smarty->display('file:C:/export/templates/index.tpl'); $smarty->display('file:F:/path/to/my/templates/menu.tpl'); ?>
以及在 Smarty 模板内部
{include file='file:D:/usr/local/share/templates/navigation.tpl'}