Smarty 变量使用
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
而且它们有着和区块插件函数相同的行为。
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 变量使用的更多相关文章
- [smarty] 在smarty模板中使用smarty变量初始化 javascript 变量的问题
// 总结:// 1/ 在smarty 模板文件中,使用从php中assign过来的smarty变量,一定需要使用双引号或单引号来括住smarty变量,如:var title="<!- ...
- smarty变量调节器
smarty中变量调解器的作用:在模板中需要对PHP分配过来的变量在输出之前,对变量进行处理 注册变量调解器方式:$smarty->registerPlugin("modifier&q ...
- smarty变量
前台: 注释的两种方式:<{**}>和<!--注释html代码-->比如: <{* <div style="width:100px; height:100 ...
- smarty 变量调节器
变量调节器:<{$a|变量调节器}> 了解更多可以查询smarty手册 主要修改此页面的信息来了解变量调节器:main.php/main.html(0603) 1.利用给定的变量调节器 c ...
- Smarty 变量修饰器
为了更方便的实现 功能与显示分离,通常会用 smarty 将功能代码中的数据 assign 到页面中,在页面中合理使用 smarty 的修饰方法,会使页面显示更美观! 一个数据可同时使用多个修饰函数, ...
- 常用的smarty变量操作
php模板引擎smarty的变量操作符可用于操作变量,自定义函数和字符.语法中使用"|"应用变量操作符,多个参数用":"??指簟?/DIV> capita ...
- SMARTY 变量
变量 模板变量以美元符号$开头,由字母.数组和下划线组成,和 PHP variable相似. 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等. 配置变量 是例外的,它不是以美元符号$开头, ...
- smarty变量调节器与函数
smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...
- 6月5 Smarty变量调节器
变量调节器:<{$a|变量调节器}> 主要修改此页面的信息来了解变量调节器:test0605/main.php和模板文件:main0605.html 1.利用给定的变量调节器 capita ...
随机推荐
- SQL SERVER 系统存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- fstream读写UNICODE文件
今天遇到要处理UNICODE文件的情况,网上找了一圈都是读取出字节,再转的,这个不方便啊!想起了有codecvt这么个东西,顺藤摸瓜,找到了方法. locale utf16(locale(" ...
- 找出最小的k个数
•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中 ...
- 关于初学者上传文件到github的方法
转:http://blog.csdn.net/steven6977/article/details/10567719 说来也惭愧,我是最近开始用github,小白一个,昨天研究了一个下午.终于可以上传 ...
- js高级程序设计(第三版)学习笔记(第一版)
ecma:欧洲计算机制造商协会iso/iec:国际标准化和国际电工委员会 dom级别(10*)文档对象模型1:DOM核心(映射基于xml文档)与dom html(在dom核心基础上)2:对鼠标,事件, ...
- 原生javascript 改写的tab选项卡
<!--css部分--> <style> *{ margin: 0; padding: 0; } ul,li{ list-style: none } .tabbox{ widt ...
- HR系统+人脸识别
近期一直在写一套HR系统,这套HR系统和人脸识别相结合.全然杜绝取代刷卡的情况产生.系统的灵活性比較强,开发简洁高速. 例如以下是一些功能上的截图 考勤模块仅仅是列举当中一个请假申请的功能做为展示 ...
- JSP简单练习-数组应用实例
<%@ page contentType="text/html; charset=gb2312" %> <html> <body> <% ...
- IOS详解TableView——选项抽屉(天猫商品列表)
在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图. 这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同.这里采用的是点击cell对cell进行运动处理以展开“ ...
- sqlite命令
.databases //显示所有数据库 .tables //显示所有表 .schema test //显示创建 test 表的 sql 语句 )备份和还原数据库 .backup E:/db/Stud ...