Smarty 总结整理

给大家整理的一个完整教程,和今天早晨前端遇到的问题解决办法。有兴趣的大家可以看看
今天早上遇到的一个问题
{{include file='inc/header.tpl' title="test `$s.seofield` test" }}
一个变量加一个常量字符串这么写

Smaty的一些特点:
    非常非常的快!
    用于php分析器干这个苦差事是有效的
    不需要多余的模板语法解析,仅仅是编译一次
    仅对修改过的模板文件进行重新编译
    可以编辑自定义函数和自定义变量因此这个模板语言完全可以扩展
    可以自行设置模板定界符,所以你可以使用{{}},{{{{}}}},<!--{{}}-->,等待
    诸如if/elseif/else/endif语句可以被传递到php语法解析器,所以{{if....}}表达式是简单或者是复合的。
    如果允许的话section之间可以无限嵌套
    内建缓存支持
    独立模板文件
    可自定义缓存处理函数
    插件体系结构

注释
    模板注释被*号包围,例如 {{* this is a comment *}}
    smarty注释不会在模板文件的最后输出中出现.
    它只是模板内在的注释.

函数
    每一个smarty标签输出一个变量或者调用某种函数.
    在定界符内函数(用'{{'包住)和其属性(用界符包住)将被处理和输出.例如:
    {{funcname attr1="val" attr2="val"}}.
    {{config_load file="colors.conf"}}
    {{include file="footer.tpl"}}

属性
    大多数函数都带有自己的属性以便于明确说明或者修改他们的行为.
    smarty函数的属性很像HTML中的属性.
    静态数值不需要加引号,但是字符串建议使用引号.
    如果用变量作属性,它们也不能加引号.

    一些属性用到了布尔值(真或假).
    它们不需要加引号,可以是true,on,yes或者false,off,no.
    {{include file="header.tpl"}}
    {{include file=$includeFile}}
    {{include file=#includeFile#}}
    {{html_select_date display_days=yes}}
    <SELECT name=company>
        {{html_options values=$vals selected=$selected output=$output}}
    </SELECT>

双引号里值的嵌入
    Smarty可以识别嵌入在双引号中的变量,只要此变量只包含数字、字母、下划线和中括号[].对于其他的符
    号(句号、对象相关的,等等)此变量必须用两个'`'(此符号和‘ ~ '在同一个键上,一般在ESC键下面一个
    键上)包住。
    {{func var="test $foo test"}}
    {{func var="test $foo_bar test"}}
    {{func var="test $foo[bar] test"}}
    {{func var="test `$foo.bar` test"}}

数学运算
    数学运算可以直接应用到变量
    {{$foo+1}}
    {{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}}
    {{if ($foo+$bar.test%$baz*134232+10+$b+10)}}
    {{assign var="foo" value="`$foo+$bar`"}}

变量
    Smarty有几种不同类型的变量.
    变量的类型取决于它的前缀是什么符号(或者被什么符号包围)
    Smarty的变量可以直接被输出或者作为函数属性和修饰符(modifiers)的参数,或者用于内部的条件表达
    式等等.
    如果要输出一个变量,只要用定界符将它括起来就可以.例如:
    {{$Name}}
    {{$Contacts[row].Phone}}
    <body bgcolor="{{#bgcolor#}}">

从PHP分配的变量
    调用从PHP分配的变量需在前加"$"符号.(译注:同php一样)
    调用模板内的assign函数分配的变量也是这样.(译注:也是用$加变量名来调用)
    $smarty->assign('firstname', 'Doug');
  
从配置文件读取的变量
    配置文件中的变量需要通过用两个"#"或者是smarty的保留变量$smarty.config.来调用
    第二种语法在变量作为属性值并被引号括住的时候非常有用.
    {{include file="#includefile#"}} 这样#includefile#将被当作字符处理,而不表示配置文件变量,
  但可以这样表示 {{include file="`$smarty.config.includefile`"}}不要忘了加``
    bgcolor="{{#tableBgColor#}}

{{$smarty}}保留变量
    {{$smarty}}保留变量可以被用于访问一些特殊的模板变量.
  
变量调节器
    capitalize
    count_characters
    cat
    count_paragraphs
    count_sentences
    count_words
    date_format
    default
    escape
    indent
    lower
    nl2br
    regex_replace
    replace
    spacify
    string_format
    strip
    strip_tags
    truncate
    upper
    wordwrap
    变量调节器用于变量,自定义函数和字符串。请使用‘|’符号和调节器名称应用调节器。变量调节器由赋予的
    参数值决定其行为。参数由‘:’符号分开。
    {{$topic|truncate:40:"..."}}
    {{"now"|date_format:"%Y/%m/%d"}}
    {{mailto|upper address="me@domain.dom"}}
    如果你给数组变量应用单值变量的调节,结果是数组的每个值都被调节。如果你只想要调节器用一个值调节整
    个数组,你必须在调节器名字前加上@符号。例如: {{$articleTitle|@count}}(这将会在 $articleTitle 数
    组里输出元素的数目)

    capitalize
        将变量里的所有单词首字大写。
        {{$articleTitle|capitalize}}
    count_characters[字符计数]
        计算变量里的字符数,它有多个属性
        {{$articleTitle|count_characters}}
        {{$articleTitle|count_characters:true}}
    cat[连接字符串]
        将cat里的值连接到给定的变量后面.它有多个属性
        {{$articleTitle|cat:" yesterday."}}
    count_paragraphs[计算段数]
        计算变量里的段落数量。
        {{$articleTitle|count_paragraphs}}
    count_sentences[计算句数]
        计算变量里句子的数量。
        {{$articleTitle|count_sentences}}
    count_wordswords[计算词数]
        计算变量里的词数。
        {{$articleTitle|count_words}}
    date_format[格式化日期]
        {{$smarty.now|date_format}}
        {{$smarty.now|date_format:"%A, %B %e, %Y"}}
        {{$smarty.now|date_format:"%H:%M:%S"}}
        {{$yesterday|date_format}}
        {{$yesterday|date_format:"%A, %B %e, %Y"}}
        {{$yesterday|date_format:"%H:%M:%S"}}
        输出结果:
        Feb 6, 2001
        Tuesday, February 6, 2001
        14:33:00
        Feb 5, 2001
        Monday, February 5, 2001
        14:33:00
    default[默认值]
        为空变量设置一个默认值。有多个属性
        当变量为空或者未分配的时候,将由给定的默认值替代输出。
        {{$myTitle|default:"no title"}}
    escape[编码]
        用于html转码,url转码,在没有转码的变量上转换单引号,十六进制转码,十六进制美化,或者javascript转码。默认是html转码。
        {{$articleTitle|escape}}
        {{$articleTitle|escape:"html"}}
        {{$articleTitle|escape:"htmlall"}}
        {{$articleTitle|escape:"url"}}
        {{$articleTitle|escape:"quotes"}}
        <a href="mailto:{{$EmailAddress|escape:"hex"}}">{{$EmailAddress|escape:"hexentity"}}</a>
    indent[缩进]
        在每行缩进字符串,默认是4个字符。有多个属性
        作为可选参数,你可以指定缩进字符数。
        作为第二个可选参数,你可以指定缩进用什么字符代替。
        特别提示:使用缩进时如果是在HTML中,则需要使用& n b s p;(空格)来代替缩进,否则没有效果。
        {{$articleTitle|indent}}
        {{$articleTitle|indent:10}}
        {{$articleTitle|indent:1:"\t"}}  
    lower小写
        将变量字符串小写
        {{$articleTitle|lower}}
    nl2br换行符替换成<br />
        所有的换行符将被替换成 <br />.功能同PHP中的nl2br()函数一样.
        {{$articleTitle|nl2br}}
    regex_replace正则替换
        寻找和替换正则表达式 .
        欲使用其语法,请参考Php手册中的preg_replace()函数.
        {{$articleTitle|regex_replace:"/[\r\t\n]/":" "}}
    replace替换
        简单的搜索和替换字符串
        {{$articleTitle|replace:"Garden":"Vineyard"}}
        {{$articleTitle|replace:" ":" "}}
    spacify插空
        插空(不知道这个词是什么意思,顾名思义了^^)是一种在字符串的每个字符之间插入空格或者其他的字符(串).
        {{$articleTitle|spacify}}
        {{$articleTitle|spacify:"^^"}}
    string_format字符串格式化
        是一种格式化字符串的方法.例如格式化为十进制数等等.使用sprintf语法格式化
        {{$number|string_format:"%.2f"}}
        {{$number|string_format:"%d"}}
    strip去除(多余空格)
        用一个空格或一个给定字符替换所有重复空格,换行和制表符.
        注意:如果想要去除模板文本中的区块,请使用 strip函数
        {{$articleTitle|strip}}
        {{$articleTitle|strip:"&nbsp;"}}
    strip_tags去除html标签
        去除<和>标签,包括在<和>之间的任何内容.
        {{$articleTitle|strip_tags}}
    truncate截取
        从字符串开始处截取某长度的字符.默认是80个.
        你也可以指定第二个参数作为追加在截取字符串后面的文本字串.该追加字串被计算在截取长度中。
        默认情况下,smarty会截取到一个词的末尾。
        如果你想要精确的截取多少个字符,把第三个参数改为"true"
        {{$articleTitle|truncate}}
        {{$articleTitle|truncate:30}}
        {{$articleTitle|truncate:30:""}}
        {{$articleTitle|truncate:30:"---"}}
        {{$articleTitle|truncate:30:"":true}}
        {{$articleTitle|truncate:30:"...":true}}
    upper大写
        将变量改为大写
        {{$articleTitle|upper}}
    wordwrap行宽约束
        可以指定段落的宽度(也就是多少个字符一行,超过这个字符数换行).默认80.
        第二个参数可选,可以指定在约束点使用什么字符(默认是换行符\n).
        默认情况下smarty将截取到词尾,如果想精确到设定长度的字符,请将第三个参数设为ture
        {{$articleTitle|wordwrap:20}}
        {{$articleTitle|wordwrap:30:"<br>\n"}}
        {{$articleTitle|wordwrap:30:"\n":true}}

组合修改器
    对于同一个变量,你可以使用多个修改器。它们将从左到右按照设定好的顺序被依次组合使用。使用时必须要用"|"字符
    作为它们之间的分隔符。
    {{$articleTitle|upper|spacify}}
    {{$articleTitle|lower|spacify|truncate}}
    {{$articleTitle|lower|truncate:30|spacify}}
    {{$articleTitle|lower|spacify|truncate:30:". . ."}}

内建函数
    Smarty自带一些内建函数.
    内建函数是模板语言的一部分.
    用户不能创建名称和内建函数一样的自定义函数,也不能修改内建函数.
  
    capture
        capture函数的作用是捕获模板输出的数据并将其存储到一个变量里,而不是把它们输出到页面.
        任何在 {{capture name="foo"}}和{{/capture}}之间的数据将被存储到变量$foo中,该变量由name属性指定.
        在模板中通过 $smarty.capture.foo 访问该变量.
        如果没有指定 name 属性,函数默认将使用 "default" 作为参数.
        {{capture}}必须成对出现,即以{{/capture}}作为结尾,该函数不能嵌套使用.
        {{capture name=banner}}
            {{include file="get_banner.tpl"}}
        {{/capture}}
        {{if $smarty.capture.banner ne ""}}
            <tr>
                <td>
                {{$smarty.capture.banner}}
                </td>
            </tr>
        {{/if}}

    config_load
        该函数用于从配置文件中加载变量.
        {{config_load file="colors.conf"}}
        配置文件有可能包含多个部分,此时可以使用附加属性 section 指定从哪一部分中取得变量.
        {{config_load file="colors.conf" section="Customer"}}
  
    foreach,foreachelse
        foreach 是除 section 之外处理循环的另一种方案(根据不同需要选择不同的方案).
        foreach 用于处理简单数组(数组中的元素的类型一致),它的格式比section 简单许多,缺点是只能处理简单数组.
        foreach 必须和 /foreach 成对使用,且必须指定 from 和 item 属性.
        name 属性可以任意指定(字母、数字和下划线的组合).
        foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一.
        from 属性(通常是数组)决定循环的次数.
        foreachelse 语句在from 变量没有值的时候被执行.
        {{foreach from=$custid item=curr_id}}
            id: {{$curr_id}}<br>
        {{/foreach}}
        {{foreach name=outer item=contact from=$contacts}}
            {{foreach key=key item=item from=$contact}}
                {{$key}}: {{$item}}<br>
            {{/foreach}}
        {{/foreach}}
        foreach 循环有自己的变量名,使用该变量名可以访问该循环. 使用方法为{{$smarty.foreach.foreachname.varname}},其中 foreachname 即在 foreach 中指定的name 属性.
  
    include
        Include 标签用于在当前模板中包含其它模板. 当前模板中的变量在被包含的模板中可用. 必须指定 file 属性,该属性指明模板资源的位置.
        如果设置了assign 属性,该属性对应的变量名用于保存待包含模板的输出,这样待包含模板的输出就不会直接显示了。
        {{include file="footer.tpl"}}
        可以在属性中传递参数给待包含模板. 传递给待包含模板的参数只在待包含模板中可见. 如果传递的参数在
        待包含模板中有同名变量,那么该变量被传递的参数替代.
        {{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"}}
        {{include file="footer.tpl" logo="http://my.domain.com/logo.gif"}}
        使用外部模板资源的 include 函数演示
        {{include file="/usr/local/include/templates/header.tpl"}}
        {{include file="file:/usr/local/include/templates/header.tpl"}}
        {{include file="file:C:/www/pub/templates/header.tpl"}}
        {{include file="db:header.tpl"}}
  
    include_php
        inluce_php 函数用于在模板中包含 php 脚本. 如果设置了安全模式,被包含的脚本必须位于
        $trusted_dir 路径下. include_php 函数必须设置 file 属性,该属性指明被包含 php 文件的路径,可以
        是 $trusted_dir 的相对路径,也可以是绝对路径.
        即使是在模板中多次地调用 php 文件,默认情况下它们只被包含一次. 你可以设置once 属性从而指明每
        次调用都重新包含该文件. 如果将once 属性设置为 false,每次调用该文件都将被重新包含.
        如果设置了 assign 属性,该属性对应的变量名用于保存待包含 php 的输出,这样待包含 php 文件的输出就不会直接显示了。
        {{include_php file="/path/to/load_nav.php"}}

    insert
        Insert 函数类似欲 inluce 函数,不同之处是 insert 所包含的内容不会被缓存,每次调用该模板都会重新执行该函数.
        {{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}}
        在此例中,我们使用了 getBanner 作为 name 属性,同时传递了 #banner_location_id# 和
        #site_id# 两个参数. 接下来 Smarty 在你的 php 程序中搜索名为 insert_getBanner() 的函数,
        #banner_location_id# 和 #site_id# 的值被组合成一个数组作为函数的第一个参数传递给该函数. 为了
        避免函数命名混乱,所有的 insert 函数都必须以 insert_ 开头. 你的 insert_getBanner() 函数根据传递
        的参数执行并返回执行的结果. 这些结果就显示在模板中调用该函数的位置. 在此例中 Smarty 调用该函数
        类似insert_getBanner(array("lid"=>"12345","sid"=>67890"));并将返回的结果显示在调用的位置.
        如果设置了 assign 属性,该属性对应的变量名用于保存待包含函数的输出,这样待包含函数的输出就不会
        直接显示了.注意:赋给模板变量的输出信息在缓存的时候同样无效.
        如果指定了 script 属性,在调用函数并执行前将先包含(只包含一次)script指定的 php 脚本. 这是为了防
        止被调用的函数不存在,先调用包含该函数的 php 脚本将避免该情况.

    if,elseif,else
        Smarty 中的 if 语句和 php 中的 if 语句一样灵活易用,并增加了几个特性以适宜模板引擎. if 必须于 /if
        成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条件修饰词:eq、ne、neq、gt、lt、lte、le、
        gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、
        ==、!=、>、<、<=、>=. 使用这些修饰词时必须和变量或常量用空格格开.
        {{if $name eq "Fred"}}
            Welcome Sir.
        {{elseif $name eq "Wilma"}}
            Welcome Ma'am.
        {{else}}
            Welcome, whatever you are.
        {{/if}}

        {{if count($var) gt 0}}
            ...
        {{/if}}
        {{if $var is even}}
            ...
        {{/if}}
        {{if $var is odd}}
            ...
        {{/if}}

    ldelim,rdelim
        ldelim 和 rdelim 用于输出分隔符,也就是大括号 "{{" 和 "}}". 模板引擎总是尝试解释大括号内的内容,因此如果需要输出大括号,请使用此方法.
        {{ldelim}}funcname{{rdelim}} is how functions look in Smarty!

    literal
        Literal 标签区域内的数据将被当作文本处理,此时模板将忽略其内部的所有字符信息. 该特性用于显示有可
        能包含大括号等字符信息的 javascript 脚本. 当这些信息处于 {{literal}}{{/literal}} 标签中时,模板引擎将
        不分析它们,而直接显示.
        {{literal}}
            <script language=javascript>
                <!--
                function isblank(field) {{
                    if (field.value == '')
                    {{ return false; }}
                    else
                    {{
                        document.loginform.submit();
                        return true;
                    }}
                }}
                // -->
            </script>
        {{/literal}}

    php
        php 标签允许在模板中直接嵌入 php 脚本. 是否处理这些语句取决于$php_handling的设置. 该语句通常
        不需要使用,当然如果你非常了解此特性或认为必须要用,也可以使用.
        {{php}}
            include("/path/to/display_weather.php");
        {{/php}}

    section,sectionelse
        模板的 section 用于遍历数组中的数据. section 标签必须成对出现. 必须设置name 和 loop 属性. 名称可以是包含字
        母、数字和下划线的任意组合. 可以嵌套但必须保证嵌套的 name 唯一. 变量 loop (通常是数组)决定循环执行的次数. 当需
        要在 section 循环内输出变量时,必须在变量后加上中括号包含着的 name 变量. sectionelse 当 loop 变量无值时被执行.
        {{section name=customer loop=$custid}}
            id: {{$custid[customer]}}<br>
        {{/section}}
        {{section name=customer loop=$custid}}
            id: {{$custid[customer]}}<br>
            name: {{$name[customer]}}<br>
            address: {{$address[customer]}}<br>
            <p>
        {{/section}}
        {{section name=customer loop=$custid}}
            id: {{$custid[customer]}}<br>
            name: {{$name[customer]}}<br>
            address: {{$address[customer]}}<br>
                {{section name=contact loop=$contact_type[customer]}}
                    {{$contact_type[customer][contact]}}: {{$contact_info[customer][contact]}}<br>
                {{/section}}
            <p>
        {{/section}}
        遍历多维数组演示
        {{section name=customer loop=$contacts}}
            name: {{$contacts[customer].name}}<br>
        {{/section}}
        sectionelse 演示
        {{section name=customer loop=$custid}}
            id: {{$custid[customer]}}<br>
        {{sectionelse}}
            there are no values in $custid.
        {{/section}}
  
    strip
        Web 开发者多次遇到空格和回车影响HTML输出的情形(浏览器的"特性"),为了得到特定的结果,因此你不得不在模板里运行所有
        的标签. 通常在难以理解或难以处理的模板中遇到此问题.
        Smarty 在显示前将除区任何位于 {{strip}}{{/strip}} 标记中数据的首尾空格和回车. 这样可以保证模板容易理解且不用担心多余
        的空格导致问题.

posted on 2012-06-01 01:00  小宝哥哥  阅读(424)  评论(0编辑  收藏  举报

导航

Tasup