Smarty 变量使用

Smarty的标签都是使用定界符括起来。 默认定界符是{ 和 }, 但定界符可以被改变

比如说在本手册,我们会假定你在使用默认的定界符。 在Smarty看来,任何在定界符之外的内容,都是静态的,或者是不改变的内容。 当Smarty读取到这些标签时,将会试图解析它们,并且在对应的位置输出结果。

注释

模板中的注释是星号开头,然后外面包含着 定界符, 就像这样:

{* 这是一个注释 *}


变量:

模板变量以美元符号$开头,由字母、数组和下划线组成,和 PHP variable相似。 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等。

配置变量 是例外的,它不是以美元符号$开头,而是放到两个井号中间#hashmarks#, 或者通过 $smarty.config来使用

Smarty 变量使用
{$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()}
Smarty 变量使用

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}

Smarty 变量使用

上一篇:td 属性 noWrap 防止折行、撑开(及其它文字换行问题)


下一篇:【转】委托的N种写法,你喜欢哪种?