zoukankan      html  css  js  c++  java
  • 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网站上最佳实践的文章。

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

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

    • 另一个方法是通过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. ?>

  • 相关阅读:
    调试IPV6
    [super class]和[self class]
    Django2 + python3 上传图片
    django2 + python3 显示静态文件中的图片
    机器工厂——贪心
    Handstand 2——AT(先打表)
    Low Elements--AT
    Double Factorial——AT
    Brick Break——AT
    变音量——动态规划
  • 原文地址:https://www.cnblogs.com/youxin/p/3531320.html
Copyright © 2011-2022 走看看