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网站上最佳实践的文章。

这里有两个方法来使用对象:

  • 第一个方法是注册对象到模板中, 然后按自定义函数相似的方法来使用。

  • 另一个方法是通过assign()将对象赋值给模板, 这种方法对象用起来比较像其他的赋值变量。

第一种方法看起来语法结构更好。而且也更安全,因为注册对象需要限定其方法或者变量的使用。 然而, 注册对象不能进行循环,或者赋值到对象数组,等等。 请根据你的需要来选择用哪种方法,但是首先尽可能保证模板语法的简洁。

如果开启了安全机制,私有方法和函数都不能使用(以'_'开头)。 如果有相同名称的方法或属性,那么该方法将会被使用。

你可以通过将方法或属性列在注册函数的第三个数组参数内,来对它们进行限定。

默认情况下,传递参数给对象的方式和传递给 自定义函数的方式一样。 关联数组作为第一个参数,第二个参数是Smarty对象。 如果你需要一次一个地传递参数,就像传统类的参数传递一样, 那么就设置第四个参数为FALSE

第五个参数是可选的,仅在formatTRUE的时候生效, 而且包含了一个方法的列表,需要按区块的方式使用。 意味着这些方法在模板内有个关闭的标签(如:{foobar->meth2}...{/foobar->meth2}) 而且它们的参数必须按 区块插件函数一样: 它们有四个参数:$params$content$smarty 和 &$repeat 而且它们有着和区块插件函数相同的行为。

Example 17.9. 注册或赋值一个对象

<?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. ?>

Smarty 变量使用的更多相关文章

  1. [smarty] 在smarty模板中使用smarty变量初始化 javascript 变量的问题

    // 总结:// 1/ 在smarty 模板文件中,使用从php中assign过来的smarty变量,一定需要使用双引号或单引号来括住smarty变量,如:var title="<!- ...

  2. smarty变量调节器

    smarty中变量调解器的作用:在模板中需要对PHP分配过来的变量在输出之前,对变量进行处理 注册变量调解器方式:$smarty->registerPlugin("modifier&q ...

  3. smarty变量

    前台: 注释的两种方式:<{**}>和<!--注释html代码-->比如: <{* <div style="width:100px; height:100 ...

  4. smarty 变量调节器

    变量调节器:<{$a|变量调节器}> 了解更多可以查询smarty手册 主要修改此页面的信息来了解变量调节器:main.php/main.html(0603) 1.利用给定的变量调节器 c ...

  5. Smarty 变量修饰器

    为了更方便的实现 功能与显示分离,通常会用 smarty 将功能代码中的数据 assign 到页面中,在页面中合理使用 smarty 的修饰方法,会使页面显示更美观! 一个数据可同时使用多个修饰函数, ...

  6. 常用的smarty变量操作

    php模板引擎smarty的变量操作符可用于操作变量,自定义函数和字符.语法中使用"|"应用变量操作符,多个参数用":"??指簟?/DIV> capita ...

  7. SMARTY 变量

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

  8. smarty变量调节器与函数

    smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...

  9. 6月5 Smarty变量调节器

    变量调节器:<{$a|变量调节器}> 主要修改此页面的信息来了解变量调节器:test0605/main.php和模板文件:main0605.html 1.利用给定的变量调节器 capita ...

随机推荐

  1. html5 手机APP计算高度问题

    安卓手机型号比较多,会出现bottom:0 找不到底部的问题,所以需要计算手机可视区域高度,这样便于使用百分比适配 (function(window,undefined){ /** * js_heig ...

  2. kendo ui中grid页面参数问题

    kendo ui 中grid 算是最长用的控件之一,当使用分页效果时,我们要传递分页参数与自己定义的参数如: var dataSource = new kendo.data.DataSource({ ...

  3. Oracle—RMAN备份(三)

    一.增量备份的相关概念 1. 在前面说明了RMAN的完整备份,完整备份是备份所用使用过的块,不备份没有使用的过的块:增量备份只备份自上次备份以来更改过的块. 2.即使RMAN的默认操作是在增量备份时扫 ...

  4. 如何实现带照片缩略图的Listview

    ackage com.demo; import java.util.ArrayList; import android.app.Activity; import android.content.Con ...

  5. JavaScript 函数基础

    1. JavaScript 函数基础 1. 定义方法 2. 函数的调用方法 3. 函数方法 apply : 将函数作为数组的方法来调用 将参数以数组形式传递给该方法 call   : 将函数作为对象的 ...

  6. ASE中的主要数据库

    Adaptive Server包括多种类型数据库: 必需数据库. “附加功能”数据库 .例子数据库 .应用数据库 1.必需数据库 master 数据库包含系统表,这些系统表中存储的数据被用来管理,有 ...

  7. 安装VMware Sphere ESXi 5.5

    安装VMware Sphere ESXi 5.5 1.准备 待安装ESXi 5.5的机器需要大于2GB以上内存,并且支持64位和虚拟化. 下载:VMware-VMvisor-Installer-5.5 ...

  8. .NET基础拾遗(4)委托和事件2

    事件 事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的. 引发事件的对象称为事件发送方.捕获事件并对其作出响应的对象叫做事件 ...

  9. Entity Framework - Func引起的数据库全表查询

    原文:http://www.cnblogs.com/dudu/archive/2012/04/01/enitity_framework_func.html 使用 Entity Framework 最要 ...

  10. visifire 图表双坐标轴 silverlight

    public void CreateChart(Grid oGrid, ObservableCollection<ListItem> lBaseOilBar)        {       ...