Smarty模板中的程序逻辑
Smarty引擎不仅在PHP程序的逻辑层需要使用,在表现层的模板中也会用到Smarty语法。但并不只是单纯地在一对特殊的定界符中声明一个变量,然后再通过模板引擎在运行时由PHP程序逻辑动态赋值。有时也需要在模板中使用某种迭代,遍历由PHP程序动态分配到模板中的数组,或是通过选择结构过滤数据等程序逻辑。这样就会有一些页面设计者抱怨在表现层中集成了某种程度逻辑,因为使用模板引擎的主旨就是为了完全分离表现层和逻辑层,但要想得到十全十美的解决方案不太可能。因为页面设计人员通常并不是编程人员,所以Smarty的开发者只在引擎中集成了一些简单但非常有效的应用程序逻辑,即使是从没有接触过编程的人员,也可以很快学会。
模板中的注释
每一个Smarty模板文件,都是通过Web前台语言(XHTML、CSS和JavaScript等)结合Smarty引擎的语法共同开发的。除了在模板中多加了一些Smarty语法用来处理程序逻辑以外,用到的其他Web前台开发语言和原来完成一样,注释也没有变化。如果在模板文件中使用HTML或是JavaScript等前台语言的注释,用户可以通过浏览网页源代码的方式查看到这些注释内容。Smarty也在模板中给我们提供了一种注释的语法,包围在定界标记"{*"和"*}"之间的都是注释内容,可以包括一行或多行,并且不会在用户浏览页面源代码时查看到,它只是模板内在的注释。以下是一个合法的Smarty注释:
- {* this is a comment *}
- 模板中变量的声明
在Smarty中,一切以变量为主,所有的呈现逻辑都让模板自行控制。Smarty有几种不同类型的变量,变量的类型取决于它的前缀是什么符号(或者被什么符号包围),Smarty的变量可以直接被输出或者作为函数属性和修饰符的参数,或者用于内部的条件表达式等。以下声明几个可以在Smarty模板中直接输出的变量:
- {$Name} {* 常规类型的变量,
需要调用模板内的assign函数分配值 *}
- {$Contacts[row].Phone} {* 数组类型变量,
也是调用模板内的assign函数分配值 *}
- <body bgcolor="{#bgcolor#}"> {* 从配置文件中读
取变量的值并输出 *}
如果在Smarty模板中输出从PHP中分配的变量,需要在前面加上"$"符号并用定界符将它括起来,命名方式和PHP的变量命名方式是一模一样的。并且定界标示符号又有点像是PHP中的<?php及?>(事实上它们的确会被替换成这个)。
在模板中输出从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
- <?php
- require "libs/Smarty.class.php";
- $smarty = new Smarty();
-
- $contact=array(
- 'fax' => '555-222-9876',
- 'email' => 'gao@lampbrother.net',
- 'phone' => array(
- 'home' => '555-444-3333',
- 'cell' => '555-111-1234'
- )
- );
- $smarty->assign('contact', $contact);
-
- $contact2=array(
- '555-222-9876',
- 'gao@lampbrother.net',
- array( '555-444-3333', '555-111-1234')
- );
- $smarty->assign('contact2', $contact2);
-
- $contact3=array(
- 'fax' => '555-222-9876',
- array('first'=>'gao@lampbrother.net','
second'=>'feng@lampbrother.net'),
- 'phone' => array('555-444-3333','555-111-1234')
- );
- $smarty->assign('contact3', $contact3);
- $smarty->display('index.tpl');
- ?>
输出从PHP分配的数组的模板文件index.tpl
- 访问从PHP中分配的关联数组:
- 电子邮件:{$contact.email} 家庭电话:{$contact.phone.home}
- 访问从PHP中分配的索引数组:
- 电子邮件:{$contact2[1]} 家庭电话:{$contact2[2][0]}
- 访问从PHP中分配的索引和关联混合数组:
- 第一个电子邮件:{$contact3[0].first} 家庭电话:{$contact3.phone[0]}
在上面的PHP脚本文件index.php中,分别向模板文件index.tpl中分配了三个数组。包含索引数组、关联数组以及两者的混合数组,同时也是混合了一维和二维数的数组。在模板中通过每种数组的不同访问方式,分别输出不同数组中的某个元素,输出结果如下所示:
- 访问从PHP中分配的关联数组:
- 电子邮件:gao@lampbrother.net 家庭电话:555-444-3333
- 访问从PHP中分配的索引数组:
- 电子邮件:gao@lampbrother.net 家庭电话:555-444-3333
- 访问从PHP中分配的索引和关联混合数组:
- 第一个电子邮件:gao@lampbrother.net 家庭电话:555-444-3333
在PHP脚本中创建的对象类型变量也可以分配给模板,并可以在模板中访问对象中的每个成员。在模板中访问对象和直接在PHP脚本中访问的方式类似,都是通过"->"运算符完成的。在模板文件中输出对象中的成员属性和访问对象中的成员方法,示例如下所示:
- 输出从PHP中分配的对象$person中的成员属性:
- 姓名: {$person->name}<br>
- 电话: {$person->phone}<br>
- 访问从PHP中分配的对象$person中的成员属性:
- 调用人的工作方法: {$person->work()}<br>
- 调用人的学习方法: {$person->study()}<br>