发新话题
打印

smarty 在模板中输出从PHP分配的变量

smarty 在模板中输出从PHP分配的变量

Smarty模板中的程序逻辑

Smarty引擎不仅在PHP程序的逻辑层需要使用,在表现层的模板中也会用到Smarty语法。但并不只是单纯地在一对特殊的定界符中声明一个变量,然后再通过模板引擎在运行时由PHP程序逻辑动态赋值。有时也需要在模板中使用某种迭代,遍历由PHP程序动态分配到模板中的数组,或是通过选择结构过滤数据等程序逻辑。这样就会有一些页面设计者抱怨在表现层中集成了某种程度逻辑,因为使用模板引擎的主旨就是为了完全分离表现层和逻辑层,但要想得到十全十美的解决方案不太可能。因为页面设计人员通常并不是编程人员,所以Smarty的开发者只在引擎中集成了一些简单但非常有效的应用程序逻辑,即使是从没有接触过编程的人员,也可以很快学会。

 模板中的注释

每一个Smarty模板文件,都是通过Web前台语言(XHTML、CSS和JavaScript等)结合Smarty引擎的语法共同开发的。除了在模板中多加了一些Smarty语法用来处理程序逻辑以外,用到的其他Web前台开发语言和原来完成一样,注释也没有变化。如果在模板文件中使用HTML或是JavaScript等前台语言的注释,用户可以通过浏览网页源代码的方式查看到这些注释内容。Smarty也在模板中给我们提供了一种注释的语法,包围在定界标记"{*"和"*}"之间的都是注释内容,可以包括一行或多行,并且不会在用户浏览页面源代码时查看到,它只是模板内在的注释。以下是一个合法的Smarty注释:

  1. {* this is a comment *}              //模板注释被*号包围,它不会在模板文件的最后输出中出现 
  2. 模板中变量的声明

    在Smarty中,一切以变量为主,所有的呈现逻辑都让模板自行控制。Smarty有几种不同类型的变量,变量的类型取决于它的前缀是什么符号(或者被什么符号包围),Smarty的变量可以直接被输出或者作为函数属性和修饰符的参数,或者用于内部的条件表达式等。以下声明几个可以在Smarty模板中直接输出的变量:

    1. {$Name}                         {* 常规类型的变量, 需要调用模板内的assign函数分配值 *}  
    2. {$Contacts[row].Phone}              {* 数组类型变量, 也是调用模板内的assign函数分配值 *}  
    3. <body bgcolor="{#bgcolor#}">        {* 从配置文件中读 取变量的值并输出 *} 

    如果在Smarty模板中输出从PHP中分配的变量,需要在前面加上"$"符号并用定界符将它括起来,命名方式和PHP的变量命名方式是一模一样的。并且定界标示符号又有点像是PHP中的<?php及?>(事实上它们的确会被替换成这个)。

  3. 在模板中输出从PHP分配的变量

    在Smarty模板中经常使用的变量有两种:一种是从PHP中分配的变量;另一种是从配置文件中读取的变量。但使用最多的还是从PHP中分配的变量。但要注意,模板中只能输出从PHP中分配的变量,不能在模板中为这些变量重新赋值。在PHP脚本中分配变量给模板,都是通过调用Smarty引擎中的assign()方法实现的,不仅可以向模板中分配PHP标量类型的变量,而且也可以将PHP中复合类型的数组和对象变量分配给模板。

    在前面的示例中已经介绍了,在PHP脚本中调用Smarty模板的assign()方法,向模板中分配字符串类型的变量,这节我们主要在模板中输出从PHP分配的复合类型变量。在PHP的执行脚本中,不管分配什么类型的变量到模板中,都是通过调用Smarty模板的assign()方法完成的,只是在模板中输出的处理方式不同。需要注意的是,在Smarty模板中变量预设是全域的。也就是说你只要分配一次就可以了,如果分配两次以上的话,变量内容会以最后分配的为主。就算我们在主模版中加载了外部的子模版,子模版中同样的变量一样也会被替代,这样我们就不用再针对子模版再做一次解析的动作。

    通常,在模板中通过遍历输出数组中的每个元素,可以通过Smarty中提供的foreach或section语句完成,而这节我们主要介绍在模板中单独输出数组中的某个元素。索引数组和关联数组在模板中输出方式略有不同,其中索引数组在模板中的访问和在PHP脚本中的引用方式一样,而关联数组中的元素在模板中指定的方式是使用句号"."访问的。在模板中输出数组的示例如下所示:

    向模板中分配数组的PHP脚本文件index.php

    1. <?php  
    2.     require "libs/Smarty.class.php";           //包含Smarty类库  
    3.     $smarty = new Smarty();                     //创建Smarty类的对象  
    4.  
    5.     $contact=array(                             //将一个人的联系信息保存在一个关联数组中  
    6.         'fax' => '555-222-9876',  
    7.         'email' => 'gao@lampbrother.net',  
    8.         'phone' => array(  
    9.             'home' => '555-444-3333',  
    10.             'cell' => '555-111-1234' 
    11.             )  
    12.         );  
    13.     $smarty->assign('contact'$contact);           //将关联数组$contact分配到模板中使用  
    14.  
    15.     $contact2=array(                            //将一个人的联系信息保存在一个索引数组中  
    16.         '555-222-9876',  
    17.         'gao@lampbrother.net',  
    18.          array'555-444-3333''555-111-1234')       
    19.         );  
    20.     $smarty->assign('contact2'$contact2);        //将索引数组$contact2分配到模板中使用  
    21.  
    22.     $contact3=array(                           //使用索引和关联数组保存联系信息  
    23.         'fax' => '555-222-9876',  
    24.         array('first'=>'gao@lampbrother.net',' second'=>'feng@lampbrother.net'),  
    25.         'phone' => array('555-444-3333','555-111-1234')  
    26.         );  
    27.     $smarty->assign('contact3'$contact3);        //将混合数组$contact3分配到模板中使用  
    28.     $smarty->display('index.tpl');               //查找模板替换并输出  
    29. ?> 

    输出从PHP分配的数组的模板文件index.tpl

    1. 访问从PHP中分配的关联数组:  
    2.     电子邮件:{$contact.email}  家庭电话:{$contact.phone.home}  
    3. 访问从PHP中分配的索引数组:  
    4.     电子邮件:{$contact2[1]}  家庭电话:{$contact2[2][0]}  
    5. 访问从PHP中分配的索引和关联混合数组:  
    6.     第一个电子邮件:{$contact3[0].first}  家庭电话:{$contact3.phone[0]} 

    在上面的PHP脚本文件index.php中,分别向模板文件index.tpl中分配了三个数组。包含索引数组、关联数组以及两者的混合数组,同时也是混合了一维和二维数的数组。在模板中通过每种数组的不同访问方式,分别输出不同数组中的某个元素,输出结果如下所示:

    1. 访问从PHP中分配的关联数组:   
    2.     电子邮件:gao@lampbrother.net 家庭电话:555-444-3333   
    3. 访问从PHP中分配的索引数组:   
    4.     电子邮件:gao@lampbrother.net 家庭电话:555-444-3333   
    5. 访问从PHP中分配的索引和关联混合数组:   
    6.     第一个电子邮件:gao@lampbrother.net 家庭电话:555-444-3333 

    在PHP脚本中创建的对象类型变量也可以分配给模板,并可以在模板中访问对象中的每个成员。在模板中访问对象和直接在PHP脚本中访问的方式类似,都是通过"->"运算符完成的。在模板文件中输出对象中的成员属性和访问对象中的成员方法,示例如下所示:

    1. 输出从PHP中分配的对象$person中的成员属性:  
    2.     姓名: {$person->name}<br>  
    3.     电话: {$person->phone}<br>  
    4. 访问从PHP中分配的对象$person中的成员属性:  
    5.     调用人的工作方法: {$person->work()}<br>  
    6.     调用人的学习方法: {$person->study()}<br> 

TOP

发新话题