Smarty:section函數(shù)

2018-10-14 15:58 更新

{section},{sectionelse}

{section}可以循環(huán)遍歷 連續(xù)數(shù)字索引的數(shù)組, 區(qū)別于{foreach} 可以循環(huán)任意關(guān)聯(lián)數(shù)組. 每個(gè){section}標(biāo)簽都必須有一個(gè)匹配的{/section}關(guān)閉標(biāo)簽。

溫馨提示:

{foreach} 可以做到任何{section}做到的功能, 而且更簡(jiǎn)單和有更清晰的語(yǔ)法。一般更推薦使用{foreach}語(yǔ)法.

溫馨提示:

{section}不能用于循環(huán)關(guān)聯(lián)數(shù)組,它僅能循環(huán)數(shù)字索引的、連續(xù)下標(biāo)的 (0,1,2,...)數(shù)組。 要循環(huán)關(guān)聯(lián)數(shù)組,請(qǐng)使用{foreach}。

參數(shù)名稱類型必選參數(shù)默認(rèn)值說(shuō)明
namestringYesn/asection的名稱
loopmixedYesn/a用于循環(huán)的值
startintegerNo0設(shè)置開(kāi)始循環(huán)的下標(biāo)。如果設(shè)置成負(fù)值,則會(huì)從數(shù)組的結(jié)束位置開(kāi)始。 比如說(shuō),如果數(shù)組中有7個(gè)元素,設(shè)置該值為-2,則循環(huán)將從下標(biāo)5開(kāi)始。 設(shè)置了不正確的值(比如說(shuō)在數(shù)組長(zhǎng)度以外的值)那么會(huì)自動(dòng)計(jì)算為最接近的值。
stepintegerNo1循環(huán)的步長(zhǎng)值。比如,step=2將循環(huán)下標(biāo)0,2,4,等。 如果step值設(shè)置成負(fù)數(shù),那么將從最后開(kāi)始計(jì)算步長(zhǎng)。
maxintegerNon/a設(shè)置最大的循環(huán)次數(shù)。
showbooleanNoTRUE是否顯示循環(huán)內(nèi)容

可選標(biāo)記:

名稱說(shuō)明
nocache關(guān)閉{section}緩存
  • name 和 loop是必須的參數(shù)。

  • {section}name可以是任意字符,如數(shù)字、字母或下劃線等,和 PHP 變量一樣的命名規(guī)則。

  • {section}可以嵌套,而且嵌套的{section}名稱必須唯一。

  • loop一般是數(shù)組,決定了{section}的循環(huán)次數(shù)。 同時(shí)你也可以傳遞一個(gè)整數(shù)指定循環(huán)次數(shù)。

  • 當(dāng)在{section}內(nèi)顯示變量時(shí), {section} 的name必須給變量名稱加上[方括號(hào)].

  • 如果loop屬性為空,{sectionelse}將執(zhí)行。

  • {section}同時(shí)還有自己的屬性。 這些屬性都是通過(guò):{$smarty.section.name.property}來(lái)使用,其中namename屬性.

  • {section}的內(nèi)置屬性有: indexindex_previndex_nextiterationfirst,lastrownumloopshowtotal.

Example 7.63. 簡(jiǎn)單的{section}例子

assign()賦值一個(gè)數(shù)組

<?php
$data = array(1000,1001,1002);
$smarty->assign('custid',$data);
?>

模板將輸出該數(shù)組

{* this example will print out all the values of the $custid array *}
{section name=customer loop=$custid}
{section customer $custid} {* short-hand *}
  id: {$custid[customer]}<br />
{/section}
<hr />
{*  print out all the values of the $custid array reversed *}
{section name=foo loop=$custid step=-1}
{section foo $custid step=-1} {* short-hand *}
  {$custid[foo]}<br />
{/section}

輸出:

id: 1000<br />
id: 1001<br />
id: 1002<br />
<hr />
id: 1002<br />
id: 1001<br />
id: 1000<br />

Example 7.64. {section}不使用賦值數(shù)組

{section name=foo start=10 loop=20 step=2}
  {$smarty.section.foo.index}
{/section}
<hr />
{section name=bar loop=21 max=6 step=-2}
  {$smarty.section.bar.index}
{/section}

輸出:

  
10 12 14 16 18
<hr />
20 18 16 14 12 10

Example 7.65. 給{section}設(shè)置名稱

{section}的 name屬性可以是任意字符,請(qǐng)參見(jiàn)PHP 變量定義. 它是用于引用{section}的數(shù)據(jù).

{section name=anything loop=$myArray}
  {$myArray[anything].foo}
  {$name[anything]}
  {$address[anything].bar}
{/section} 

Example 7.66. {section}中使用關(guān)聯(lián)數(shù)組

下面是使用{section}來(lái)輸出關(guān)聯(lián)數(shù)組的例子。 這里是在PHP代碼中賦值$contacts 數(shù)組到Smarty。

<?php
$data = array(
          array('name' => 'John Smith', 'home' => '555-555-5555',
                'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
          array('name' => 'Jack Jones', 'home' => '777-555-5555',
                'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
          array('name' => 'Jane Munson', 'home' => '000-555-5555',
                'cell' => '123456', 'email' => 'jane@myexample.com')
        );
$smarty->assign('contacts',$data);
?>

該模板用于顯示$contacts

{section name=customer loop=$contacts}
<p>
  name: {$contacts[customer].name}<br />
  home: {$contacts[customer].home}<br />
  cell: {$contacts[customer].cell}<br />
  e-mail: {$contacts[customer].email}
</p>
{/section}

輸出:

<p>
  name: John Smith<br />
  home: 555-555-5555<br />
  cell: 666-555-5555<br />
  e-mail: john@myexample.com
</p>
<p>
  name: Jack Jones<br />
  home phone: 777-555-5555<br />
  cell phone: 888-555-5555<br />
  e-mail: jack@myexample.com
</p>
<p>
  name: Jane Munson<br />
  home phone: 000-555-5555<br />
  cell phone: 123456<br />
  e-mail: jane@myexample.com
</p>

Example 7.67. {section}的loop屬性的演示例子

例子假定$custid$name 和 $address三個(gè)數(shù)組中對(duì)應(yīng)的值都有著相同的數(shù)字下標(biāo)。 首先從PHP代碼中賦值到Smarty

<?php

$id = array(1001,1002,1003);
$smarty->assign('custid',$id);

$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);

$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);

?>

loop值僅是指定循環(huán)的次數(shù)。 你可以在{section}中給它設(shè)置任何的變量。 在多個(gè)數(shù)組循環(huán)時(shí)比較有用。 你可以傳遞一個(gè)數(shù)組來(lái)讓其計(jì)算總數(shù)而指定循環(huán)次數(shù),也可以直接指定一個(gè)循環(huán)次數(shù)的整數(shù)。

{section name=customer loop=$custid}
<p>
  id: {$custid[customer]}<br />
  name: {$name[customer]}<br />
  address: {$address[customer]}
</p>
{/section}

輸出:

<p>
  id: 1000<br />
  name: John Smith<br />
  address: 253 Abbey road
</p>
<p>
  id: 1001<br />
  name: Jack Jones<br />
  address: 417 Mulberry ln
</p>
<p>
  id: 1002<br />
  name: Jane Munson<br />
  address: 5605 apple st
</p>

Example 7.68. {section}嵌套

{section}可以嵌套任意的深度。通過(guò)嵌套{section}你可以處理多維數(shù)組。 下面是例子的.php文件。

<?php

$id = array(1001,1002,1003);
$smarty->assign('custid',$id);

$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);

$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);

$types = array(
           array( 'home phone', 'cell phone', 'e-mail'),
           array( 'home phone', 'web'),
           array( 'cell phone')
         );
$smarty->assign('contact_type', $types);

$info = array(
           array('555-555-5555', '666-555-5555', 'john@myexample.com'),
           array( '123-456-4', 'www.example.com'),
           array( '0457878')
        );
$smarty->assign('contact_info', $info);

?>

在這個(gè)模板里, $contact_type[customer]是客戶聯(lián)系信息的數(shù)組

{section name=customer loop=$custid}
<hr>
  id: {$custid[customer]}<br />
  name: {$name[customer]}<br />
  address: {$address[customer]}<br />
  {section name=contact loop=$contact_type[customer]}
    {$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
  {/section}
{/section}

輸出:

<hr>
  id: 1000<br />
  name: John Smith<br />
  address: 253 N 45th<br />
    home phone: 555-555-5555<br />
    cell phone: 666-555-5555<br />
    e-mail: john@myexample.com<br />
<hr>
  id: 1001<br />
  name: Jack Jones<br />
  address: 417 Mulberry ln<br />
    home phone: 123-456-4<br />
    web: www.example.com<br />
<hr>
  id: 1002<br />
  name: Jane Munson<br />
  address: 5605 apple st<br />
    cell phone: 0457878<br />

Example 7.69. {sectionelse}的數(shù)據(jù)庫(kù)例子

數(shù)據(jù)庫(kù)查找的結(jié)果(如 ADODB 或 PEAR) 傳遞到 Smarty

  
<?php
$sql = 'select id, name, home, cell, email from contacts '
      ."where name like '$foo%' ";
$smarty->assign('contacts', $db->getAll($sql));
?>

模板將以表格形式顯示數(shù)據(jù)結(jié)果

<table>
<tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{section name=co loop=$contacts}
  <tr>
    <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    <td>{$contacts[co].name}</td>
    <td>{$contacts[co].home}</td>
    <td>{$contacts[co].cell}</td>
    <td>{$contacts[co].email}</td>
  <tr>
{sectionelse}
  <tr><td colspan="5">No items found</td></tr>
{/section}
</table>

.index

index是當(dāng)前數(shù)組的索引值,從0開(kāi)始,或者從設(shè)定的start值開(kāi)始。它將每次循環(huán)增加1或者增加指定的step值。

說(shuō)明

如果 step 和 start都沒(méi)有被指定, 那么它會(huì)和iteration屬性很像, 只不過(guò)它是從0開(kāi)始,而iteration是從1開(kāi)始.

Example 7.70. {section} index 屬性

說(shuō)明

$custid[customer.index] 和 $custid[customer] 是一樣的.

{section name=customer loop=$custid}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}

輸出:

0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />

.index_prev

index_prev上一次循環(huán)的索引值。 在第一次循環(huán)的時(shí)候,它是-1.

.index_next

index_next是下一次循環(huán)的索引值。 在最后一次循環(huán)時(shí),它會(huì)比當(dāng)前索引加1,或者加上指定的step屬性值。

Example 7.71. indexindex_next 和 index_prev 屬性

<?php
$data = array(1001,1002,1003,1004,1005);
$smarty->assign('rows',$data);
?>

在表格中顯示數(shù)組

{* $rows[row.index] and $rows[row] are identical in meaning *}
<table>
  <tr>
    <th>index</th><th>id</th>
    <th>index_prev</th><th>prev_id</th>
    <th>index_next</th><th>next_id</th>
  </tr>
{section name=row loop=$rows}
  <tr>
    <td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
    <td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
    <td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
  </tr>
{/section}
</table>

輸出:

index  id    index_prev prev_id index_next next_id
0      1001  -1	                1          1002
1      1002  0          1001    2          1003
2      1003  1          1002    3          1004
3      1004  2          1003    4          1005
4      1005  3          1004    5

.iteration

iteration是當(dāng)前的循環(huán)次數(shù),從1開(kāi)始。

溫馨提示:

它和index不同,不會(huì)受到{section} 的屬性 startstep 和 max等影響. 而且和index不同的是,iteration還是從1開(kāi)始計(jì)算的。 rownumiteration的別名,它們是一樣的。

Example 7.72. iteration屬性

<?php
// array of 3000 to 3015
$id = range(3000,3015);
$smarty->assign('arr',$id);
?>

模板將按step=2來(lái)顯示$arr的數(shù)組元素

{section name=cu loop=$arr start=5 step=2}
  iteration={$smarty.section.cu.iteration}
  index={$smarty.section.cu.index}
  id={$custid[cu]}<br />
{/section}

輸出:

iteration=1 index=5 id=3005<br />
iteration=2 index=7 id=3007<br />
iteration=3 index=9 id=3009<br />
iteration=4 index=11 id=3011<br />
iteration=5 index=13 id=3013<br />
iteration=6 index=15 id=3015<br />

這里是另一個(gè)例子,使用iteration屬性來(lái)顯示表格, 并且每五行顯示一次表頭。

<table>
{section name=co loop=$contacts}
  {if $smarty.section.co.iteration is div by 5}
    <tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
  {/if}
  <tr>
    <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    <td>{$contacts[co].name}</td>
    <td>{$contacts[co].home}</td>
    <td>{$contacts[co].cell}</td>
    <td>{$contacts[co].email}</td>
  <tr>
{/section}
</table>

一個(gè)用iteration屬性來(lái)交替顯示文章每三行顏色的例子

  
  <table>
  {section name=co loop=$contacts}
    {if $smarty.section.co.iteration is even by 3}
      <span style="color: #ffffff">{$contacts[co].name}</span>
    {else}
      <span style="color: #dddddd">{$contacts[co].name}</span>
    {/if}
  {/section}
  </table>

溫馨提示:

"is div by"語(yǔ)法是PHP取模運(yùn)算的一個(gè)變種。取模運(yùn)算{if $smarty.section.co.iteration % 5 == 1}也是可用的。

溫馨提示:

你還可以用"is odd by"來(lái)反轉(zhuǎn)交替。

.first

如果當(dāng)前的循環(huán)是第一次,first將被設(shè)成 TRUE 。

.last

如果當(dāng)前的循環(huán)是最后一次,那么last將為 TRUE

Example 7.73. {section} 屬性 first 和 last

例子循環(huán)了 $customers數(shù)組,在循環(huán)最前面輸出頭部區(qū)域,在底端輸出底部區(qū)域的內(nèi)容。 同時(shí)也使用了 total 屬性.

{section name=customer loop=$customers}
  {if $smarty.section.customer.first}
    <table>
    <tr><th>id</th><th>customer</th></tr>
  {/if}

  <tr>
    <td>{$customers[customer].id}}</td>
    <td>{$customers[customer].name}</td>
  </tr>

  {if $smarty.section.customer.last}
    <tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
    </table>
  {/if}
{/section}

.rownum

rownum是當(dāng)前循環(huán)的次數(shù),從1開(kāi)始。它是iteration 的別名。

.loop

loop 是最后一次{section}循環(huán)的下標(biāo)。 它可以在{section}循環(huán)中或者循環(huán)后使用。

Example 7.74. {section} 屬性 loop

{section name=customer loop=$custid}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There are {$smarty.section.customer.loop} customers shown above.

輸出:

0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
There are 3 customers shown above.

.show

show是一個(gè)布爾值參數(shù)。如果設(shè)置為FALSE,section將不會(huì)被顯示。 如果有{sectionelse}顯示,它們將被交替顯示。

Example 7.75. show 屬性

布爾值 $show_customer_info 可以在PHP程序賦值并傳遞到模板中, 可以控制section的顯示與否。

{section name=customer loop=$customers show=$show_customer_info}
  {$smarty.section.customer.rownum} id: {$customers[customer]}<br />
{/section}

{if $smarty.section.customer.show}
  the section was shown.
{else}
  the section was not shown.
{/if}

輸出:

1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />

the section was shown.

.total

total{section}的總數(shù)。 它可以在{section}循環(huán)中或者循環(huán)后使用。

Example 7.76. total例子

{section name=customer loop=$custid step=2}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
   There are {$smarty.section.customer.total} customers shown above.

參見(jiàn){foreach}{for}{while} 和 $smarty.section.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)