从上一章范例中,我们可以清楚地看到我们利用 <{ 及 }> 这两个标示符号将变量包起来。预设的标示符号为 { 及 } ,但为了中文冲码及 Javascript 的关系,因此笔者还是模仿 XOOPS ,将标示符号换掉。变量的命名方式和 PHP 的变量命名方式是一模一样的,前面也有个 $ 字号 (这和一般的模版引擎不同)。标示符号就有点像是 PHP 中的 <?php 及 ?> (事实上它们的确会被替换成这个) ,所以以下的模版变量写法都是可行的:
1. <{$var}>
2. <{ $var }> <!-- 和变量之间有空格 -->
3. <{$var
}> <!-- 启始的标示符号和结束的标示符号不在同一行 -->
在 Smarty 里,变量预设是全域的,也就是说你只要指定一次就好了。指定两次以上的话,变量内容会以最后指定的为主。就算我们在主模版中加载了外部的子模版,子模版中同样的变量一样也会被替代,这样我们就不用再针对子模版再做一次解析的动作。
而在 PHP 程序中,我们用 Smarty 的 assign 来将变量置放到模版中。 assign 的用法官方手册中已经写得很多了,用法就如同上一节的范例所示。不过在重复区块时,我们就必须将变量做一些手脚后,才能将变量 assign 到模版中,这在下一章再提。
修饰你的变量 上面我们提到 Smarty 变量呈现的风貌是由模版自行决定的,所以 Smarty 提供了许多修饰变量的函式。使用的方法如下:
<{变量|修饰函式}> <!-- 当修饰函式没有参数时 -->
<{变量|修饰函式:"参数(非必要,视函式而定)"}> <!-- 当修饰函式有参数时 -->
范例如下:
<{$var|nl2br}> <!-- 将变量中的换行字符换成 <br /> -->
<{$var|string_format:"%02d"}> <!-- 将变量格式化 -->
好,那为什么要让模版自行决定变量呈现的风貌?先看看底下的 HTML ,这是某个购物车结帐的部份画面。
<input name="total" type="hidden" value="21000" />
总金额:21,000 元
一般模版引擎的模版可能会这样写:
<input name="total" type="hidden" value="{total}" />
总金额:{format_total} 元
它们的 PHP 程序中要这样写:
<?php
$total = 21000;
$tpl->assign("total", $total);
$tpl->assign("format_total", number_format($total));
?>
而 Smarty 的模版就可以这样写: (number_format 修饰函式请到Smarty 官方网页下载)
<input name="total" type="hidden" value="<{$total}>" />
总金额:<{$total|number_format:""}> 元
Smarty 的 PHP 程序中只要这样写:
<?php
$total = 21000;
$tpl->assign("total", $total);
?>
所以在 Smarty 中我们只要指定一次变量,剩下的交给模版自行决定即可。这样了解了吗?这就是让模版自行决定变量呈现风貌的好处!
控制模版的内容
重复的区块 在 Smarty 样板中,我们要重复一个区块有两种方式: foreach 及 section 。而在程序中我们则要 assign 一个数组,这个数组中可以包含数组数组。就像下面这个例子:
首先我们来看 PHP 程序是如何写的:
test2.php:
<?php
require "main.php";
$array1 = array(1 => "苹果", 2 => "菠萝", 3 => "香蕉", 4 => "芭乐");
$tpl->assign("array1", $array1);
$array2 = array(
array("index1" => "data1-1", "index2" => "data1-2", "index3" => "data1-3"),
array("index1" => "data2-1", "index2" => "data2-2", "index3" => "data2-3"),
array("index1" => "data3-1", "index2" => "data3-2", "index3" => "data3-3"),
array("index1" => "data4-1", "index2" => "data4-2", "index3" => "data4-3"),
array("index1" => "data5-1", "index2" => "data5-2", "index3" => "data5-3"));
$tpl->assign("array2", $array2);
$tpl->display("test2.htm");
?>
共9页: 上一页 [1] [2] [3] [4] [5] 6 [7] [8] [9] 下一页