smarty3.0中文手册文档API及使用指南

1、安装Smarty3.0



一、什么是smarty?



smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计, 美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。


二、smarty优点:



1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。


2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件, 这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中, 而不再进行模板重新编译(在源程序没有改动的情况下) 


3. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页, 
当设定smarty的cache属性为true时, 在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来, 这相当于调用一个静态的HTML文件。


4. 插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。


5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。


三、不适合使用smarty的地方:



1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。


2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用smarty会丧失php开发迅速的优点。




Smarty 3 API 的语法结构已经重构,使之更一致性和模块化,虽然为了向下兼容,仍然支持Smarty 2的语法,但会抛出一个被弃用的notice,虽然你可以屏蔽该notice,但强烈建议,在使用Smarty 3 时使用3的语法,一方面,Smarty 2的语法很可能在后面的版本中逐渐被取消,另一方面, Smarty2的语法,是对Smarty3的API的封装,所以性能方面也会有损失。
? Smarty3与Smarty的差别之处
1) 基本上,Smarty3的方法采用驼峰式的命名方式,如 fooBarBaz
2) 所有Smarty的属性都有get 和 set 的方法 如$smarty->cache_dir = ‘foo/’ 现在可以这样赋值 $smarty->setCacheDir('foo/'),同样可以通过 $smarty->getCacheDir() 来得到该属性值
3) Smarty 3废除了一些如 ”is*”的方法,因为他们和现在的”get*”方法重复了
4) Smarty 3 只能在PHP5下运行,不支持PHP4.
5) {php} 标签默认是关闭的. 使用$smarty->allow_php_tag=true.开启
6) 被空白包围的分隔符将不被解析,如{ foo }将不再作为smarty标签被解析,你必须使用{foo}

下面是Smarty3 API的纲要:
$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null)
$smarty->display($template, $cache_id = null, $compile_id = null, $parent = null)
$smarty->isCached($template, $cache_id = null, $compile_id = null)
$smarty->createData($parent = null)
$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
$smarty->enableSecurity()
$smarty->disableSecurity()
$smarty->setTemplateDir($template_dir)
$smarty->addTemplateDir($template_dir)
$smarty->templateExists($resource_name)
$smarty->loadPlugin($plugin_name, $check = true)
$smarty->loadFilter($type, $name)
$smarty->setExceptionHandler($handler)
$smarty->addPluginsDir($plugins_dir)
$smarty->getGlobal($varname = null)
$smarty->getRegisteredObject($name)
$smarty->getDebugTemplate()
$smarty->setDebugTemplate($tpl_name)
$smarty->assign($tpl_var, $value = null, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
$smarty->assignGlobal($varname, $value = null, $nocache = false)
$smarty->assignByRef($tpl_var, &$value, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
$smarty->appendByRef($tpl_var, &$value, $merge = false)
$smarty->clearAssign($tpl_var)
$smarty->clearAllAssign()

$smarty->configLoad($config_file, $sections = null)
$smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true)
$smarty->getConfigVariable($variable)
$smarty->getStreamVariable($variable)
$smarty->getConfigVars($varname = null)
$smarty->clearConfig($varname = null)
$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true)

某些API的调用将移到他们自己的对象当中
$smarty->cache->loadResource($type = null)
$smarty->cache->clearAll($exp_time = null, $type = null)
$smarty->cache->clear($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
$smarty->register->block($block_tag, $block_impl, $cacheable = true, $cache_attr = array())
$smarty->register->compilerFunction($compiler_tag, $compiler_impl, $cacheable = true)
$smarty->register->templateFunction($function_tag, $function_impl, $cacheable = true, $cache_attr = array())
$smarty->register->modifier($modifier_name, $modifier_impl)
$smarty->register->templateObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
$smarty->register->outputFilter($function_name)
$smarty->register->postFilter($function_name)
$smarty->register->preFilter($function_name)
$smarty->register->resource($resource_type, $function_names)
$smarty->register->variableFilter($function_name)
$smarty->register->defaultPluginHandler($function_name)
$smarty->register->defaultTemplateHandler($function_name)

$smarty->unregister->block($block_tag)
$smarty->unregister->compilerFunction($compiler_tag)
$smarty->unregister->templateFunction($function_tag)
$smarty->unregister->modifier($modifier)
$smarty->unregister->templateObject($object_name)
$smarty->unregister->outputFilter($function_name)
$smarty->unregister->postFilter($function_name)
$smarty->unregister->preFilter($function_name)
$smarty->unregister->resource($resource_type)
$smarty->unregister->variableFilter($function_name)
$smarty->utility->compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null)
$smarty->utility->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
$smarty->utility->testInstall()

一些属性的get 及 set方法
$caching = $smarty->getCaching(); // get $smarty->caching
$smarty->setCaching(true); // set $smarty->caching
$smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices
$smarty->setCacheId($id); // set $smarty->cache_id
$debugging = $smarty->getDebugging(); // get $smarty->debugging

Smarty3新增了不少功能和新特性,这些新特性,让我们使用Smarty更加方便
1) Smarty3在几乎所有地方都支持表达式,如果安全策略允许,表达式中甚至可以包含PHP函数,对象的方法及属性,如
? {$x+$y}
? {$foo = strlen($bar)}
? {assign var=foo value= $x+$y}
? {$foo = myfunct( ($x+$y)*3 )}
? {$foo[$x+3]}
2) Smarty的标签可以作为其他标签的值,如
? {$foo={counter}+3}
3) Smarty的标签可以在双引号中间使用,如
? {$foo="this is message {counter}"}
4) 你能够在模板内部像在PHP中那样使用数组,并能给数组中的单个元素赋值或给数组追加一个元素,如
? {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']=1}
? {$foo['bar']['blar']=1}
? Example: {$foo[]=1}

5) 模板变量名本身可以是一个表达式
? $foo_{$bar}
? $foo_{$x+$y}
? $foo_{$bar}_buh_{$blar}
? {$foo_{$x}}
6) 实现了对象的方法链,如
? {$object->method1($x)->method2($y)}
7) 增加了{for}标签,替代{section}
? {for $x=0, $y=count($foo); $x<$y; $x++} .... {/for}
? {for $x = $start to $end step $step} ... {/for}
8) 在for循环的内部,你可以使用一面变量
? $x@iteration = number of iteration
? $x@total = total number of iterations
? $x@first = true on first iteration
? $x@last = true on last iteration
9) 像在PHP中那样去使用foreach,如
{foreach $array as $key => $val}
{$key}=>{$val}
{/foreach}
【注意:如果使用数组下标,使用单引号括起来,避免和section的使用方法产生冲突】
10) 增加了while标签
? {while $foo}...{/while}

{while $x lt 10}...{/while}
11) 增加了function标签
12) 增加了{nocache}块函数 及 nocache属性来避免变量或函数被缓存,你也可以使用下面方法避免变量被缓存
? $smarty->assign('foo',$something,true);
13) 你可以直接使用字符串代替smarty模板,如
? $smarty->display('string:This is my template, {$foo}!');
? {include file="string:This is my template, {$foo}!"}
14) 增加模板继承功能

















1.安装smarty

打开smarty的官方网站,www.smarty.net/download.php。下载Smarty 3.0rc4, 目前仍然是处于rc版本(Release.Candidate.就是发行候选版本,与beta版本相比,不再有功能的增加,主要着重于除错!)。 有tar.gz和zip分别适用于linux和windows版本。


下载好后tar –zxvf Smarty 3.0rc4.tar.gz


目录中,demo文件夹为示例文件。Libs为程序文件。


/libs/Smarty.class.php   #主文件


/libs/sysplugins/  #内部plugin


/libs /plugins/   #外部plugin,可自由扩充


/demo/cahce/   #放置缓存文件


/demo/configs /   #放置可以载入的配置文件


/demo/templates/   #放置模板文件


/demo/templates_c/    #放置对模板编译后的文件


最好在需要进行smarty处理的文件的目录中创建与demo中的相同的文件夹(注意文件夹具有web用户写权限), 当然也可以更改文件夹名和路径,默认值为处于被smarty处理的文件的同级目录。Smarty3.0需要php5.0以上。


2、调试Smarty3.0

创建自己的文件,比如index.php。 
在templates目录中创建模板index.tpl(几乎可以是任何文本文件的扩展名, 常用的是tpl,php,html,不建议使用后两者,因为可以从浏览器直接访问而不安全。 可以对apache的httpd.conf进行设置,禁止直接访问.tpl文件。或者将templats目录放在网站文档树之外。)


[Index.php] 


require_once("../../Smarty-3.0rc4/libs/Smarty.class.php");


$smarty = new smarty();


$smarty->assign(‘name’,'韩灵稚’);


$smarty->display(‘templates/index.tpl ‘);


[Index.tpl]的代码:


<html><body>


<span>你好, {$name}</span>


</body></html>


Smarty编译时的处理过程是源php文件->模板文件(可能多次调用)->源php文件。。。 
也就是说不影响原php文件的其他处理和输出。所以smarty模板文件可以是完整的html,也可以是其中一部分。


3、Smarty3.0基础

3.1 smarty处理过程

smarty将php源文件,首先编译成中间文件(也是php),如果启用缓存, 再根据编译文件生成缓存文件(也是php),需要缓存的部分全部是硬编码。 之后的每次访问都会访问编译文件(如果编译文件已经存在), 一次编译多次调用(可以是单文件的多次,也可以是多文件的多次), 如果启用缓存且有缓存文件而且没有过期,则直接访问缓存文件,跳过编译文件。编译文件一经生成,就不会被自动更新,除非模板文件或者配置文件更改。 源php文件修改是不会引发重新编译的。 一旦编译文件重新生成,缓存文件也必然重新生成。 
Smarty允许有两种特殊的编译设置存在:


1、 任何时候都不自动重新编译(上线阶段):只有没有该文件的编译文件时才生成, 模板文件或者配置文件的更改,不会引发重新编译。


$smarty->setCompile_check(false)     
#默认为true,false表示任何时候都不在发生文件变更的情况下生成编译文件,除了无编译文件。


$smarty->getCompile_check()    #获得当前编译检查的设置


 2、任何时候都重新编译(调试阶段):任何时候都重新编译。


$smarty->setForce_compile(true)  #默认为false,true表示每次都重新编译(启用缓存的话,每次都重新缓存)


$smarty->getForce_compile()    #获得当前强制编译的设置


3.2 分界符 

在模板文件中,区分普通html代码和smarty代码靠的是分界符。默认情况下是“{ }“,但是与js和css相冲突。 
可以进行变更。在3.0中模板标签将不支持空格,如{  $abc  }在Smarty2中可以识别的, 
但是3.0里头就不行了,必须这样{$abc},这样是为了能够更好的支持javascript和css。


$smarty->left_delimiter = "<{";   #左分界符,2.0属性,3.0沿用


$smarty->right_delimiter = "}>";   #右分界符,2.0属性,3.0沿用


注意:将默认分界符修改后,在3.0模板中仍然不支持空格,比如<{ $abc }>,无效。


3.3 注释

{* smarty用*包含的文字为注释内容 *}


如果默认分界符修改为“<{}>“, <{* smarty用*包含的文字为注释内容 *}>。注释中的模板变量无效。


3.4 模板包含文件

格式 {include file="要包含的文件名称 "}


Head.tpl


<span>这是顶部内容,欢迎你,{$name}</span><hr />


Index.tpl中加一下代码


{include file="head.tpl"}


输出结果:


这是顶部内容,欢迎你,韩灵稚。


您好,韩灵稚!


除了包含其他配置文件,还可以包含html、php(需要开启smarty支持php模板的选项, 最好使用include_php函数)。包含文件还可以使用传参。


Head.tpl


<span>{$nr},欢迎你,{$name}</span><hr />


Index.tpl


{include file="head.tpl" nr=”这是顶部内容”}


输出结果同上。


3.5 载入配置文件

可以预先规定一系列的变量与值的对应,并放在配置文件中,在使用时载入。 配置文件一般放在configs文件夹中,可以自定义。


My.conf


gv = "my.conf中的全局变量"   #全局配置变量,任何时候调用,都将被载入


#如果$sections,未设置,显示全部变量


[color]   #局部配置变量


fontcolor = "red"   #如果$sections,设置为red,只显示全局变量和[color]中的变量


[size]  #局部配置变量


fontsize = "12px"   #如果$sections,设置为size,只显示全局变量和[size]中的变量


调用配置文件有两种方法,一种是在源文件处,一种是在模板文件处。


源文件处:$smarty->configLoad($config_file, $sections = null)


模板文件处:{config_load file="载入的配置文件" section=”选取的局部变量(可选)”scope=“作用模板范围(可选)“}


如果使用源文件的方法,载入的配置文件变量的作用模板范围自动为global, 而且可以应用到多个模板中(smarty对象调用了多个模板)。


如果使用后者,灵活性更大。单个模板中config_load的scope参数的范围可以是local (本模板,只能本模板使用这些变量), parent(父模板或者文件) 或  global(同一个smarty对象所调用的所有模板,其他模板不需要再载入该配置文件)


在模板文件中使用配置变量


{#配置变量#}或者{$smarty.config.变量名称}


【相关函数】


$smarty->getConfigVariable($variable)    #返回某个模板变量,该变量必须是parent或者是global


$smarty->getConfigVars($varname = null)   #返回模板变量数组,或者单个变量。 
该变量或者变量组必须是parent或者是global


$smarty->clearConfig($varname = null)  #清除所有配置变量或者指定的一个配置变量


$smarty->setConfig_overwrite(false)   #如果设变量为真,则从配置文件中读取出来的变量(如果变量名称相同) 
将会由最后一个值覆盖。反之,变量将会放到一个数组中。 不能用数组索引去访问,可以使用cycle函数。该属性也有getConfig_overwrite函数。


$smarty->setConfig_booleanize(true);   #设置为true的话, 配置文件中的on/true/yes/1 和 off/false/no/0值会自动转化为布尔值, false将变为字符串(如果作为判断条件,永远为真)。 该属性也有getConfig_booleanize函数。


3.6 环境配置

Smary脚本中是可以动态设置编译、模板、缓存、配置路径。


$smarty->template_dir = "./templates";    #设置模板目录,2.0设置方法,3.0沿用但不推荐


$smarty->compile_dir = "./templates_c";   #设置编译目录,2.0设置方法,3.0沿用但不推荐


$smarty->config_dir = ‘./configs/’;        #设置配置目录,2.0设置方法,3.0沿用但不推荐


$smarty->cache_dir = ‘./cache/’;         #设置缓存目录,2.0设置方法,3.0沿用但不推荐


Smary在3.0中对属性进行了封装。可以使用如下方法进行访问获得目录。


$smarty->getCacheDir();   #得到当前缓存目录路径


$smarty->getTemplateDir();   #得到当前模板目录路径的数组


$smarty->getConfigDir(); #得到当前 配置目录路径


$smarty->getCompileDir(); #得到当前编译目录路径


$smarty->getPluginsDir()   #得到当前插件目录路径数组


同样用下面的方法进行目录设置


$smarty->setTemplateDir("../smarty1/templates/");    #设置新的模板目录, 
注意设置后模板目录的数组只有该值一个,不管原来有几个值。


$smarty->setCompileDir("../smarty1/templates_c/");   #设置新的编译目录


$smarty->setConfigDir("../smarty1/configs/");        #设置新的配置目录


$smarty->setCacheDir("../smarty1/cache/");         #设置新的缓存目录


$smarty->addTemplateDir("templates");     #引用的模板文件的路径必须在模板目录数值中, 
否则报错,由于仍然用原来的模板文件,所以添加上原来模板路径,这样模板数组中有两个路径。


$smarty->addPluginsDir(‘myplugins’);   #添加一个新的插件目录,如果用set将取消插件数组,变为单指


【相关函数】


$smarty->utility->compileAllTemplates($extention = ‘.tpl’, $force_compile = false,  $time_limit = 0, $max_errors = null)   #直接编译所有模板目录下所有模板文件,用处不大。


$smarty->utility->clearCompiledTemplate($resource_name = null,  $compile_id = null, $exp_time = null)  


#清除编译目录下的编译文件或者指定条件的编译文件。


$smarty-> setDefault_template_handler_func($fucname)    
#该函数在模板不能从它的源目录下获取时会得到调用,没有太大的意义,可以设置异常处理。


4、Smarty语法基础篇

4.1 变量

模板中的变量主要来源有三种。


1、是由原php文件中分配过来的。


$smarty->assign(‘name’,'韩灵稚’);    #在源php文件中分配


<span>你好, {$name}</span> #在模板文件中使用


2、是由配置文件中分配过来的。


$smarty->configLoad(“configs/my.conf”)  #在源php文件中载入配置文件,也可以在模板中载入


<span style="color:{#fontcolor#}; font-size:{#fontsize#};">这是{#gv#}</span><br />  #在模板文件中使用


3、是在模板文件中创建的。


{assign var="name" value="韩灵稚" nocache=”false”scope=”global”}    
#在模板中定义的变量,如果之前定义了相同的变量,则以最后一次定义为准。


{$name="韩灵稚"}    #给变量直接赋值,如果该变量原来不存在,自动创建,3.0新特性。


{assign var=foo value=[1,2,3]}     #定义普通数组变量


{assign var=foo value=['y'=>'yellow','b'=>'blue']}    #定义关联数组


{assign var=foo value=[1,[9,8],3]}  #定义数组中的数组


{$foo[]=1}    #增加变量数组$foo的一个元素


<span>你好, {$name}</span> #在模板文件中使用


【相关函数】


$smarty->getVariable($variable, $_ptr = null, $search_parents = true,  
$error_enable = true) #获得变量,仅限于获得第一种方式的变量


$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true)    
#获得变量,可以获得第一种和第三种方式的变量(第三种方式变量scope必须为global或者parent), 
如果想获得配置变量参看3.4


4.2 Smarty保留变量

Smarty系统中保留了一些内置变量,可以快速访问相应的变量。但是不能再源php中获得这些变量。


1、请求访问变量(Request variables)


$smarty.get.变量       #显示通过get方式传过来的指定变量的值。


$smarty.post.变量      #显示通过post方式传过来的指定变量的值。


$smarty.cookies.变量 #显示通过cookie中指定变量的值。


$smarty.server.SERVER_NAME   #显示server变量值,phpinfo()中$_SERVER系列变量


$smarty.env.PATH   #显示系统环境变量值,phpinfo()中$_ENV系列变量


$smarty.session.变量 #显示session中指定变量的值


$smarty.request.变量 #显示通过post、get、cookie中指定变量的值。


2、时间访问变量


{$smarty.now} #显示unix系统时间戳,需要变量调节器格式化,参看4.2.4,也可以使使用{time()}


3、常量访问变量


{$smarty.const._MY_CONST_VAL}   #访问php中的常量包括自定义常量和系统常量


4、{$smarty.capture}  


参看4.4.1


5、配置访问变量


{$smarty.config.配置变量}   #访问配置变量,等同于 #配置变量# 方式


6、{$smarty.section}, {$smarty.foreach} 


参看4.4.3和4.4.4


7、{$smarty.template}   #显示模板路径和名称


4.2.1赋值
{$name = 新值} 比如,{$name=”我的名字叫韩灵稚”}   #新值将替代原值,如果原来无该变量, 
则创建变量并赋值。配置变量无法重新赋值。


{$name = 表达式} 比如,{$name = 1+2+$foo['bar']}  #$foo['bar']的值为1, 变量值为4


{$foo['bar']=1}    #给数组的一个元素赋值


{$foo['bar']['blar']=1}   #给多维数组的一个元素赋值


{$foo = array(1,2,3,4,5)}   #利用php函数创建变量$foo,并赋值。


4.2.2访问
最简单的访问方法是 {$var},配置变量访问是{#configvar#}


数组变量的访问可以是{$array[1][1]},也可以支持{$array.1.1}


对象的访问{$object->method1($x)},也支持对象链,{$object->method1($x)->method2($y)}


字符串与变量的混合输出


{"大家好,我是$name<br />"}   #Smarty可以识别嵌入在双引号中的变量, 
只要此变量只包含数字、字母、下划线。


{"大家好,我是`$name[$obj->a]`<br />"}    #中括号[]、句号. 对象相关 -> ,必须将变量用两个`符号括起。


4.2.3变量名变量
与php相同,都支持在变量名称中使用变量,smarty还支持使用表达式。


$foo         #一个普通的变量


$foo_{$bar}   #变量名中包含变量


$foo_{$x+$y}  #变量名中可以支持表达式


$foo_{$bar}_buh_{$blar}   #变量名包含多个变量


4.2.4变量调节器
变量调节器主要是对变量进行格式化。


{$var|capitalize}   #将变量首字大写


{$var|count_characters:false}   #计算变量里的字符数,false为不计算空格。 
若变量为数值则为数字和小数点等其他运算符的总和


{$var| cat:var2} #将var2连接到var,若为数值以字符串处理。


{$var| count_paragraphs} #计算变量里的段落数量,已“\n“区分


{$var| count_sentences} #计算变量中句子的数量,不好使


{$var| count_words} #计算变量中单词的数量 已非字母和数字的字符分割统计


{$var| date_format :"%H:%M:%S" } #格式化变量日起,具体参数看chm文档


{$var| default:"no title" } #当变量为空时,为变量提供一个默认值


{$var| escape:url}     #对变量值进行转码,具体参数看chm文档


{$var| indent:10:"*"}    #对变量指定具体字符进行缩进,若为空格在html中不会显示出来,具体参数看chm文档


{$var| lower}   #将变量小写


{$var| nl2br }   #将变量中的“\n“转换成”<br />“


{$var| regex_replace:"/[\r\t\n]/":" "} #将变量中的符合正则的内容替换成指定内容


{$var| replace:"Garden":"Vineyard"} #将变量中要求的内容替换成指定内容


{$var| spacify:"^^"} #将变量字符与字符之间插入指定内容,包括空格


{$var|string_format:"%d"}   #将变量中的内容格式化,格式化参数同printf


{$var| strip: "*"}  #用一个空格或一个给定字符替换所有重复空格,换行和制表符


{$var| strip_tags} #删除变量中的html标记, 去除<和>标签,包括在<和>之间的任何内容


{$var| truncate:30:"…":true}    #截取变量的到规定的长度,具体参数看chm文档


{$var| upper}    #将变量大写
{$var| wordwrap:30:"\n":true}    #规定指定的长度强制换行,具体参数看chm文档


修改器可以复合组合。


{$articleTitle|lower|spacify|truncate:30:". . ."}


设置默认变量调节器


$smarty->getDefault_modifiers()    #默认为空数组


$smarty->setDefault_modifiers(array(‘spacify:"^^"’,'capitalize’)   #设置变量的默认调节器,必须用array


{name}    #模板变量name自动加入上面两个调节器


同时也可以定义自己的调节器,详情请参考6.7.4和6.8.4


4.2.5变量作用域(未写)

4.4 内建函数

4.4.1 capture

capture函数的作用是捕获模板输出的数据并将其存储到一个变量里,而不是把它们输出到页面. 
任何在 {capture name="foo"}和{/capture}之间的数据将被存储到变量$foo中。 
这样可以根据实际情况,选择性的输出一些内容,输出的语法是$smarty.capture.变量。


{capture name="bottom"}


{include file="bottom.tpl" nr="这是底部的内容"}


{/Capture}


{if true }  #进行条件判断,确定是否输出


{$smarty.capture.bottom}


{/if}


4.4.2 config_load
参看3.4


4.4.3 foreach,foreachelse
foreach 适合于简单数组(元素类型相同)


{foreach name=名称 item=内容 key=键 from=数组}  #2.0中的用法,3.0沿用


正常执行


{foreachelse}


From变量数组没有值时(0个元素)执行。


{/foreach}


例子:


{foreach name=for1 item=num from=$foo}


{$smarty.foreach.for1.index+1}个元素:{$num}<br />


{if is_array($num)}


{foreach name=for2 item=num2 key=key2 from=$num}


{$str|cat:$smarty.foreach.for2.index+1|cat:"个元素:"|cat:$num2|cat:" key是"|cat:$key2|indent:1:"."}<br />


{/foreach}


{/if}


{foreachelse}


{$smarty.foreach.for1.index+1}个元素:没有值!<br />


{/foreach}


foreach的内置变量


$smarty.foreach.foreachname.index   #(循环内部使用)显示当前循环的索引,如果数组为空,返回-1


$smarty.foreach.foreachname. iteration    #(循环内部使用)显示当前的循环次数


$smarty.foreach.foreachname.first #(循环内部使用)如果为第一次循环,返回true


$smarty.foreach.foreachname.last #(循环内部使用)如果为最后一次循环,返回true


$smarty.foreach.foreachname.total #(循环内外部使用)显示循环的总次数


foreach 在3.0中做一定的升级,语法更接近于php,内置变量也更简洁。


{foreach $myarray as $var}…{/foreach}


foreach的内置变量,均可在内外部使用


$var@key           #输出元素的键值,简单为012,关联为具体键值。


$var@iteration      #显示当前的循环次数,外部使用为最后一次


$var@index         #显示当前循环的索引,如果数组为空,返回-1,外部使用为最后一次


$var@total          #显示循环的总次数


$var@first           #如果为第一次循环,返回true


$var@last           #如果为最后一次循环,返回true


4.4.4 section,sectionelse
section适用于复杂的数组操作,不适合关联数组。但是在3.0中并为对他做什么升级和修改, 
而是直接推出了for命令,for更接近于php语法。可以预见,section将在未来版本中淘汰。


{section name=名称 loop=循环数组(次数) start=开始(0) step=步阶(1) max=最大循环次数 show=是否显示(true)}   
#2.0中的用法,3.0沿用


正常执行


{sectionelse}


loop数组没有值时(0个元素)执行。


{/section }


例子:


{section name=sec1 loop=$foo step=1 start=0 show=true}


第{$smarty.section.sec1.index+1}个元素:{$foo[sec1]}  循环次数是


{$smarty.section.sec1.iteration}<br />


{if is_array($foo[sec1])}


{section name=sec2 loop=$foo[sec1] step=1 start=0 show=true}


第{$smarty.section.sec2.index+1}个元素:{$foo[sec1][sec2]}  
循环次数是{$smarty.section.sec2.iteration}<br />


{/section}


{/if}


{sectionelse}


{$smarty.section.sec1.index}个元素:没有值!<br />


{/section}


Section的内置变量与foreach 相同。


4.4.5 include
{include file="包含文件" var=”自定义传入包含文件的变量”assign=” 指定一个变量保存待包含模板的输出”}


如果规定了assign ,则包含文件不会马上输出,模板输出的数据将存储到assign指定的变量里, 
这样可以根据实际情况,再输出包含文件的内容。原理类似于capture。


4.4.6 include_php
{include_php file="包含文件" once=”是否指包含一次(true)”assign=” 指定一个变量保存待包含的输出”}


包含php文件,包含的文件正常编译,并提供输出。如果规定了assign , 
则包含文件不会马上输出,输出的数据将存储到assign指定的变量里, 
这样可以根据实际情况,再输出包含文件的内容。


4.4.7 insert
Insert最大的特点是不缓存。他的参数可能会缓存。但是insert所调用的函数内部不缓存。


{insert name=”函数名称” script=”包含函数的脚本”var….=”函数参数” assign=” 指定一个变量保存调用的输出”}


Insert调用的函数有特别的规定,函数格式必须是“smarty_insert_函数名称($params,&$smarty)”, 
从insert传入的参数,会统一放到数组变量中,参数名为该数组的键值。


例子:


{insert name="maxnum" script="s2.php" x=12 y=13 assign=nn}   #模板文件,script为保存调用函数的脚本


{foreach $nn as $n}


{$n}


{/foreach}


function smarty_insert_maxnum($arr)   #函数脚本文件


{


return $arr['x']>$arr['y']?$arr['x']:$arr['y'];


}


如果规定了assign ,则调用函数的记过不会马上输出,输出的数据将存储到assign指定的变量里, 
这样可以根据实际情况,再输出包含文件的内容。


Insert也可以定义成组件,写入组件库中,详情请参考6.8.5
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值