Smarty的标签都是使用定界符括起来。 默认定界符是{
和 }
, 但定界符可以被改变。
比如说在本手册,我们会假定你在使用默认的定界符。 在Smarty看来,任何在定界符之外的内容,都是静态的,或者是不改变的内容。 当Smarty读取到这些标签时,将会试图解析它们,并且在对应的位置输出结果。
这点值得注意,要想在模板中输出信息,不能用
<?php echo '<h1>hello </h1>'; ?>
这样的方式输出,这样会输出:
hello '; ?>
模板中的注释是星号开头,然后外面包含着 定界符, 就像这样:
{* 这是一个注释 *}
变量:
模板变量以美元符号$开头,由字母、数组和下划线组成,和 PHP variable相似。 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等。
配置变量 是例外的,它不是以美元符号$开头,而是放到两个井号中间#hashmarks#, 或者通过 $smarty.config
来使用
{$foo} <-- 显示简单的变量 (非数组/对象) {$foo[4]} <-- 在0开始索引的数组中显示第五个元素 {$foo.bar} <-- 显示"bar"下标指向的数组值,等同于PHP的$foo['bar'] {$foo.$bar} <-- 显示以变量$bar值作为下标指向的数组值,等同于PHP的$foo[$bar] {$foo->bar} <-- 显示对象属性 "bar" {$foo->bar()} <-- 显示对象成员方法"bar"的返回 {#foo#} <-- 显示变量配置文件内的变量"foo" {$smarty.config.foo} <-- 等同于{#foo#} {$foo[bar]} <-- 仅在循环的语法内可用,见{section} {assign var=foo value='baa'}{$foo} <-- 显示"baa", 见{assign} 更多合成变量的方式: {$foo.bar.baz} {$foo.$bar.$baz} {$foo[4].baz} {$foo[4].$baz} {$foo.bar.baz[4]} {$foo->bar($baz,2,$bar)} <-- 传递参数 {"foo"} <-- 静态值 {* 显示服务器的环境变量"SERVER_NAME" ($_SERVER['SERVER_NAME'])*} {$smarty.server.SERVER_NAME} 数学运算和嵌入标签: {$x+$y} // 显示x加y的和 {assign var=foo value=$x+$y} // 和用于赋值 {$foo[$x+3]} // 作为下标使用 {$foo={counter}+3} // 标签内的标签 {$foo="this is message {counter}"} // 在双引号内的标签 定义数组: {assign var=foo value=[1,2,3]} {assign var=foo value=['y'=>'yellow','b'=>'blue']} {assign var=foo value=[1,[9,8],3]} // 可嵌套 缩写方式: {$foo=$bar+2} {$foo = strlen($bar)} // 函数赋值 {$foo = myfunct( ($x+$y)*3 )} // 函数参数 {$foo.bar=1} // 赋值给特定的数组元素 {$foo.bar.baz=1} {$foo[]=1} // 附加到数组 Smarty 点号语法: {$foo.a.b.c} => $foo['a']['b']['c'] {$foo.a.$b.c} => $foo['a'][$b]['c'] // 变量下标 {$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // 表达式下标 {$foo.a.{$b.c}} => $foo['a'][$b['c']] // 嵌套下标 类似PHP的语法,另一种点号的语法: {$foo[1]} // 一般的 {$foo['bar']} {$foo['bar'][1]} {$foo[$x+$x]} // 下标可以是各种表达式 {$foo[$bar[1]]} // 嵌套下标 {$foo[section_name]} // smarty {section} 存取, 非数组存取! 变量构造变量: $foo // 一般的变量 $foo_{$bar} // 变量名包含了其他变量 $foo_{$x+$y} // 变量名包含了表达式 $foo_{$bar}_buh_{$blar} // 更复杂的 {$foo_{$x}} // 如$x = 1,那么将显示$foo_1的值 对象链: {$object->method1($x)->method2($y)} PHP函数直接使用: {time()}
数组:
Note
虽然Smarty可以处理很复杂的表达式和语法,但是最好的方式还是 保持模板语法的简洁,模板层专注于显示。 如果发现你的模板语法过于复杂,那么建议是将这些逻辑代码写到PHP里, 然后在模板中通过插件或者修饰器来调用。
服务器请求的变量,如$_GET
, $_SESSION
也可以通过 $smarty
变量来进行获取。
assign() — 赋值
说明
void assign(mixed var);
void assign(string varname,
mixed var,
bool nocache);
你可以传递键值对,或联合数组进行赋值到模板。
如设置第三个参数nocache
为true,则该变量不进行缓存。 详细参考 变量缓存
。
Note
在你传递对象到模板时,请记住对象在模板中使用的成员变量和方法均只为了显示。通过对象在模板中进行一些更复杂的应用逻辑是很容易的事情,但这样会成为较差的设计,并且难以管理。请参见Smarty网站上关于最佳实践的主题。
Example 14.6. assign()
<?php
// 传递键值对
$smarty->assign('Name', 'Fred');
$smarty->assign('Address', $address);
// 传递联合数组
$smarty->assign(array('city' => 'Lincoln', 'state' => 'Nebraska'));
// 传递数组
$myArray = array('no' => 10, 'label' => 'Peanuts');
$smarty->assign('foo',$myArray);
// 传递一行数据库的返回记录 (如 adodb)
$sql = 'select id, name, email from contacts where contact ='.$id;
$smarty->assign('contact', $db->getRow($sql));
?>
模板中可以直接使用:
{* 和php一样,变量名不区分大小写 *} {$Name} {$Address} {$city} {$state} {$foo.no}, {$foo.label} {$contact.id}, {$contact.name},{$contact.email}
更多数组的使用方法请参见 {foreach}
和 {section}
参见 assignByRef()
, getTemplateVars()
, clearAssign()
, append()
和 {assign}
$t=new Smarty(); $userInfo=array('userId'=>1,'userName'=>"mingsoo",'pwd'=>'123','phone'=>array('home'=>'123','company'=>'456')); $t->assign('userInfo',$userInfo); $t->display('userInfo.html');
访问方式:
{$userInfo.userId} <br/>
{$userInfo.userName} <br/>
{* you can print arrays of arrays as well *}
{$userInfo.phone.home}
You can reference arrays by their index, much like native PHP syntax. 可以通过索引访问,非常向php变量。
{$userInfo['userId']}
{$userInfo['phone']['home']}
对象
从PHP赋值的对象的属性和方法,可以通过->
来使用。
Example 4.5. 使用对象
name: {$person->name}<br /> email: {$person->email}<br />
输出:
name: Zaphod Beeblebrox<br /> email: zaphod@slartibartfast.example.com<br />
对象
Smarty可以在模板内使用PHP的 对象。
Note
当你赋值/注册一个对象到模板使用时,请确保在模板内使用的属性和方法都是仅为了显示。 要通过对象在模板中嵌入应用逻辑是很容易的事情,但是这样会导致较差的设计而且难以管理。 请参见Smarty网站上最佳实践的文章。
这里有两个方法来使用对象:
第一种方法看起来语法结构更好。而且也更安全,因为注册对象需要限定其方法或者变量的使用。 然而, 注册对象不能进行循环,或者赋值到对象数组,等等。 请根据你的需要来选择用哪种方法,但是首先尽可能保证模板语法的简洁。
如果开启了安全机制,私有方法和函数都不能使用(以'_'开头)。 如果有相同名称的方法或属性,那么该方法将会被使用。
你可以通过将方法或属性列在注册函数的第三个数组参数内,来对它们进行限定。
默认情况下,传递参数给对象的方式和传递给 自定义函数的方式一样。 关联数组作为第一个参数,第二个参数是Smarty对象。 如果你需要一次一个地传递参数,就像传统类的参数传递一样, 那么就设置第四个参数为FALSE
。
第五个参数是可选的,仅在format
为TRUE
的时候生效, 而且包含了一个方法的列表,需要按区块的方式使用。 意味着这些方法在模板内有个关闭的标签(如:{foobar->meth2}...{/foobar->meth2}
) 而且它们的参数必须按 区块插件函数
一样: 它们有四个参数:$params
, $content
, $smarty
和 &$repeat
而且它们有着和区块插件函数相同的行为。
<?php // 类定义 class My_Object { function meth1($params, $smarty_obj) { return 'this is my meth1'; } } // 注册对象(引用传递) $smarty->registerObject('foobar',$myobj); // 列出我们需要限定的部分方法和属性 $smarty->registerObject('foobar',$myobj,array('meth1','meth2','prop1')); // 如果你需要用传统的对象参数格式,设置第四个参数为false $smarty->registerObject('foobar',$myobj,null,false); // 还可以用assign_by_ref将对象赋值给模板 $smarty->assign_by_ref('myobj', $myobj); //注意Smarty3中assign_by_ref已经改成了:assignByRef $smarty->display('index.tpl'); ?>
然后在index.tpl
内使用对象:
{* 访问注册的对象 *}
{foobar->meth1 p1='foo' p2=$bar}
{* 同样可以赋值给output *}
{foobar->meth1 p1='foo' p2=$bar assign='output'}
the output was {$output}
{* 访问赋值的对象 *}
{$myobj->meth1('foo',$bar)}
参考:http://www.smarty.net/docs/zh_CN/advanced.features.objects.tpl
如何在smarty模板中执行php代码
Smarty模板主要的目的是分离逻辑层和表现层,所以在模板中不应该包含逻辑部分,逻辑层也不应该含有HTML。要在模板中插入逻辑程序的这种做法“非常”不被推荐,在你的case中。
如果你真正的需要在模板中使用脚本程序,smarty也提供了{php}标签,允许programmer在表现层混入php代码(再次提示:这种不利于逻辑层与表现层的分离,违背了程序与结构的分离)。看一看如何在模板中插入php代码:
phpCode.tpl:
1. {php}
2. echo "There is php code in the template of smarty";
3. for($i=1 ; $i<=3; $i++){
4. echo "but it's better to avoid php code in your case!";
5. }
6. {/php}
phpCode.php
1. 2. include("libs/smarty.class.php");
3. $smarty = new smarty();
4. $smarty->display("phpCode.tpl")
5. ?>