Smarty 是什么?
为什么使用它?
用例和工作流程
语法比较
模板继承
最佳实践
突击教程
如果你正在寻找 5 英镑押金赌场红利,那么我们建议访问 www.5bingosites.com
模板基础知识:向 Smarty 分配内容,然后显示模板文件。
index.phpinclude('Smarty.class.php'); // create object $smarty = new Smarty; // assign some content. This would typically come from // a database or other source, but we'll use static // values for the purpose of this example. $smarty->assign('name', 'george smith'); $smarty->assign('address', '45th & Harris'); // display it $smarty->display('index.tpl'); |
然后模板文件包含表现形式的输出,其间插入 {标签},Smarty 用动态内容替换这些标签。
index.tpl<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: {$name} Address: {$address} </pre> </body> </html> |
输出<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: george smith Address: 45th & Harris </pre> </body> </html> |
如你所见,Smarty 彻底地将你的展示(HTML/CSS)与应用(PHP)代码分离了。然而,它仍然包含一些自身的逻辑。关于 Smarty 的设计原则,模板中的逻辑应该仅用于展示。例如,遍历表格行颜色或从另一个模板包含一个模板会被视为展示逻辑。通过这种方式,应用程序代码只需要提供内容,模板可以负责展示。其想法是将模板设计人员的角色(前端开发人员)和应用程序编程人员的角色(后端开发人员)区分开来。你应该能够彻底重新设计展示(内容)而无需改变应用程序代码。你也应该能够重新构建应用程序代码并使用相同的模板,只需将内容分配到相同的变量。这种设计极为有利于维护和稳定性。
有时需要对分配的内容进行更改以用于展示。这可以通过变量修饰符实现。这些用于改变模板中已分配变量的输出。在我们的示例中,我们想要以大写字母显示 George 的名字,并且希望正确转义地址中的符号(&)。我们还展示如何以自定义格式显示当前日期。
index.tpl<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: {$name|capitalize} Addr: {$address|escape} Date: {$smarty.now|date_format:"%b %e, %Y"} </pre> </body> </html> |
输出<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: George Smith Addr: 45th & Harris Date: Jul 16, 2010 </pre> </body> </html> |
通过使用修饰符,我们刚刚将已分配内容的格式控制权交给模板。其想法是将未修改的内容分配给模板,将展示逻辑保留在应用程序代码之外。
你可以在一个变量上链接任意数量的修饰符,这使得此功能极具灵活性。Smarty 附带了许多其他 修饰符,或者你也可以使用易于使用的 插件 架构自己制作修饰符。将你的新修饰符放入插件目录,然后在模板中提到它!
您还可以使用或创建模板函数。模板函数在模板中执行任务。例如,您可以通过{include}函数包含其他模板,可以通过{html_options}函数生成一组选择选项,或者可以通过{cycle}函数循环一组值。假设您有很多具有相同页眉和页脚信息的模板。您可以将它们作为单独的模板进行管理并包含它们。
header.tpl<html>
<head>
<title>{$title|default:"no title"}</title>
</head>
<body>
|
footer.tpl</body> </html> | |
index.tpl{include file="header.tpl" title="Info"} User Information:<p> Name: {$name|capitalize}<br> Address: {$address|escape}<br> {include file="footer.tpl"} |
输出
|
{include}函数的一项功能是局部作用域变量。请注意,$title 是一个模板变量,它没有直接分配给模板,而是通过将其作为属性传递给{include}函数来分配的。这样,$title变量只在页眉模板的范围内可用,并且可以在每次包含header.tpl文件时动态更改。此外,请注意我们对$title使用了default修饰符,所以如果$title为空,那么文本 “no title” 将显示而不是不显示任何内容。
管理模板层次结构的另一种方法是模板继承。一个模板可以继承另一个模板,并更改该模板内的特定内容块。例如
<html> <head> <title>{block name=title}Default Title{/block}</title> </head> <body> {block name=body}Default Body{/block} </body> </html>
{extends file="parent.tpl"} {block name=title}My Title{/block} {block name=body}My Body{/block}
<html> <head> <title>My Title</title> </head> <body> My Body </body> </html>
有一些很好的函数可以自动执行诸如html下拉框之类的任务。html_options便是其中之一。您将数据数组分配给模板,然后此函数将执行所有工作来生成 HTML 输出。
index.phpinclude('Smarty.class.php'); // create object $smarty = new Smarty; // assign options arrays $smarty->assign('id', array(1,2,3,4,5)); $smarty->assign('names', array('bob','jim','joe','jerry','fred')); // display it $smarty->display('index.tpl'); |
index.tpl<select name=user>
{html_options values=$id output=$names selected="5"}
</select>
|
输出<select name=user>
<option label="bob" value="1">bob</option>
<option label="jim" value="2">jim</option>
<option label="joe" value="3">joe</option>
<option label="jerry" value="4">jerry</option>
<option label="fred" value="5" selected="selected">fred</option>
</select>
|
您可以使用foreach函数快速循环处理数据数组。下面是一个示例,而且我们还通过{cycle}函数交替显示行颜色,并使用{strip}函数去除额外的空格。
index.phpinclude('Smarty.class.php'); // create object $smarty = new Smarty; // assign an array of data $smarty->assign('names', array('bob','jim','joe','jerry','fred')); // assign an associative array of data $smarty->assign('users', array( array('name' => 'bob', 'phone' => '555-3425'), array('name' => 'jim', 'phone' => '555-4364'), array('name' => 'joe', 'phone' => '555-3422'), array('name' => 'jerry', 'phone' => '555-4973'), array('name' => 'fred', 'phone' => '555-3235') )); // display it $smarty->display('index.tpl'); |
index.tpl<table> {foreach $names as $name} {strip} <tr bgcolor="{cycle values="#eeeeee,#dddddd"}"> <td>{$name}</td> </tr> {/strip} {/foreach} </table> <table> {foreach $users as $user} {strip} <tr bgcolor="{cycle values="#aaaaaa,#bbbbbb"}"> <td>{$user.name}</td> <td>{$user.phone}</td> </tr> {/strip} {/foreach} </table> |
输出<table> <tr bgcolor="#eeeeee"><td>bob</td></tr> <tr bgcolor="#dddddd"><td>jim</td></tr> <tr bgcolor="#eeeeee"><td>joe</td></tr> <tr bgcolor="#dddddd"><td>jerry</td></tr> <tr bgcolor="#eeeeee"><td>fred</td></tr> </table> <table> <tr bgcolor="#aaaaaa"><td>bob</td><td>555-3425</td></tr> <tr bgcolor="#bbbbbb"><td>jim</td><td>555-4364</td></tr> <tr bgcolor="#aaaaaa"><td>joe</td><td>555-3422</td></tr> <tr bgcolor="#bbbbbb"><td>jerry</td><td>555-4973</td></tr> <tr bgcolor="#aaaaaa"><td>fred</td><td>555-3235</td></tr> </table> |
Smarty还具有内置缓存功能,有助于加快页面渲染速度。模板输出的副本存储在文本文件中,然后在后续请求调用时显示该副本,而不是每次动态呈现页面。这可以大大加快页面渲染速度,尤其是在创建页面时涉及大量处理时,例如数据库调用和变量分配。您还可以通过将某些部分标记为 nocache 而不使其动态。
index.phpinclude('Smarty.class.php'); // create object $smarty = new Smarty; $smarty->setCaching(true); // see if the page is already cached if(!$smarty->isCached('index.tpl')) { // not cached, so you might do some database queries here, // then assign the returned content. We just use static // values for this example. $smarty->assign('name', 'george smith'); $smarty->assign('address', '45th & Harris'); } // display it $smarty->display('index.tpl'); |
通过向display() 函数传递唯一缓存 ID,还可以拥有单个页面的多个缓存版本。有关详细信息,请参阅文档。
还有很多其他内置和自定义函数附带Smarty,或者您可以自己制作,再次使用易于使用的插件架构。
关于Smarty的还有很多东西需要了解,现在就去文档中看看吧!