PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP基础 >> 基础文章 >> 

Smarty入门教程

Smarty入门教程

来源:互联网  作者:网络转载  发布时间:2008-08-22
刚开始接触模版引擎的 PHP 设计师,听到 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");
  ?>
  
  而模版的写法如下:
  
  templates/test2.htm:
  
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=big5">
  <title>测试重复区块</title>
  </head>
  <body>
  <pre>
  利用 foreach 来呈现 array1
  <{foreach item=item1 from=$array1}>
  <{$item1}>
  <{/foreach}>
  利用 section 来呈现 array1
  <{section name=sec1 loop=$array1}>
  <{$array1[sec1]}>


  <{/section}>
  利用 foreach 来呈现 array2
  <{foreach item=index2 from=$array2}>
  <{foreach key=key2 item=item2 from=$index2}>
  <{$key2}>: <{$item2}>
  <{/foreach}>
  <{/foreach}>
  利用 section 来呈现 array1
  <{section name=sec2 loop=$array2}>
  index1: <{$array2[sec2].index1}>
  index2: <{$array2[sec2].index2}>
  index3: <{$array2[sec2].index3}>
  <{/section}>
  </pre>
  </body>
  </html>
  
  执行上例后,我们发现不管是 foreach 或 section 两个执行结果是一样的。那么两者到底有何不同呢?
  
  第一个差别很明显,就是foreach 要以巢状处理的方式来呈现我们所 assign 的两层数组变量,而 section 则以「主数组[循环名称].子数组索引」即可将整个数组呈现出来。由此可知, Smarty 在模版中的 foreach 和 PHP 中的 foreach 是一样的;而 section 则是 Smarty 为了处理如上列的数组变量所发展出来的叙述。当然 section 的功能还不只如此,除了下一节所谈到的巢状资料呈现外,官方手册中也提供了好几个 section 的应用范例。

  
  不过要注意的是,丢给 section 的数组索引必须是从 0 开始的正整数,即 0, 1, 2, 3, ...。如果您的数组索引不是从 0 开始的正整数,那么就得改用 foreach 来呈现您的资料。您可以参考官方讨论区中的此篇讨论,其中探讨了 section 和 foreach 的用法。
  
  巢状资料的呈现
  
  模版引擎里最令人伤脑筋的大概就是巢状资料的呈现吧,许多著名的模版引擎都会特意强调这点,不过这对 Smarty 来说却是小儿科。
  
  最常见到的巢状资料,就算论譠程序中的讨论主题区吧。假设要呈现的结果如下:
  
  公告区
  
  站务公告
  
  文学专区
  
  好书介绍
  
  奇文共赏
  
  计算机专区
  
  硬件外围
  
  软件讨论
  
  程序中我们先以静态资料为例:
  
  test3.php:
  
  <?php
  require "main.php";
  $forum = array(
  array("category_id" => 1, "category_name" => "公告区",
  "topic" => array(
  array("topic_id" => 1, "topic_name" => "站务公告")
  )
  ),
  array("category_id" => 2, "category_name" => "文学专区",
  "topic" => array(
  array("topic_id" => 2, "topic_name" => "好书介绍"),
  array("topic_id" => 3, "topic_name" => "奇文共赏")
  )
  ),
  array("category_id" => 3, "category_name" => "计算机专区",
  "topic" => array(
  array("topic_id" => 4, "topic_name" => "硬件外围"),
  array("topic_id" => 5, "topic_name" => "软件讨论")
  )
  )
  );
  $tpl->assign("forum", $forum);
  $tpl->display("test3.htm");
  ?>
  
  模版的写法如下:
  
  templates/test3.htm:
  
  <html>
  <head>
  <title>巢状循环测试</title>
  </head>
  <body>
  <table width="200" border="0" align="center" cellpadding="3" cellspacing="0">
  <{section name=sec1 loop=$forum}>
  <tr>
  <td colspan="2"><{$forum[sec1].category_name}></td>
  </tr>
  <{section name=sec2 loop=$forum[sec1].topic}>
  <tr>
  <td width="25"> </td>
  <td width="164"><{$forum[sec1].topic[sec2].topic_name}></td>
  </tr>
  <{/section}>
  <{/section}>
  </table>
  </body>
  </html>
  
  执行的结果就像笔者举的例子一样。
  
  因此呢,在程序中我们只要想办法把所要重复值一层一层的塞到数组中,再利用 <{第一层数组[循环1].第二层数组[循环2].第三层数组[循环3]. ... .数组索引}> 这样的方式来显示每一个巢状循环中的值。至于用什么方法呢?下一节使用数据库时我们再提。

Tags: smarty   教程   入门   smarty   变量   程序   array  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号