ECMall模板解析語法與機制

在ECMall模板中,用”{“開頭,以”}”結尾就構成一個標籤單元,”{“緊接着的單詞就是標籤名。在標籤單元中單詞前含"$"(美元符)的爲變量名。
資源引用
res標籤
功能:返回當前模板當前風格目錄的url路徑
實例:{res file=css/ecmall.css}這個標籤在模板編譯後將變成http://商城域名/themes/default/styles/default,注意末尾沒有”/”,返回結果會隨後臺設置的主題變化
lib標籤
功能:返回javascript庫的url路徑
實例:{lib file=ecmall.js}這個標籤在模板編譯後將變成http://商城域名/includes/libraries/javascript,注意末尾沒有”/”,返回結果不會隨後臺設置的主題變化
url標籤
功能:url解析器,可根據後臺僞靜態狀態返回相應url等。
說明:如果一個鏈接的目標頁面需要僞靜態功能,請使用該url標籤,只有當後臺開啓僞靜態並在.htaccess文件爲目標頁面設置了僞靜態規則時url標籤才能解析爲靜態url地址。
實例:{url app=goods&id=$goods_id}解析後如果僞靜態成功則返回”goods/19”
include標籤:include 標籤用於在當前模板中包含其它模板。當前模板中的變量在被包含的模板中可用。必須指定 file 屬性,該屬性指明模板資源的位置。實例:

{include file="header.html"}
{* body of template goes here *}
{include file="footer.html"}

模板變量
1. 模板保留變量
模板預置的一些系統變量,包括
$smarty.now 當前時刻對應的格林尼治時間戳,可以用{$smarty.now|date}顯示當前日期時間,關於date變量調節器請看下文講解。
$smarty.get $smarty.post $smarty.cookie $smarty.env $smarty.server $smarty.request $smarty.session同php的$_GET、$_POST、$_COOKIE、$_ENV、$_SEVER、$_REQUEST、$_SESSION變量。非程序人員如果需要了解請參考php相關手冊瞭解。
2. 自定義變量
從php賦值變量。例如在調用該模板的app程序文件中進行賦值

//在app/default.app.php文件的index方法中$this->display前添加賦值語句
$this->assign('name', 'Tom'); //普通變量
$this->assign('user', array(
    'name' => 'Tom',
    'age'    => '28'
)); //數組變量
$this->display('index.html');

在themes/mall/default/index.html中顯示變量

Hello,{$name},your age are {$user.age}!

在模板中賦值變量。assign標籤,例在themes/mall/default/index.html中賦值變量

{assign var="name" value="Tom"}
Hello,{$firstname}!

3.模板上使用語言項
說明:爲了滿足多語言需求,ECMall採用了語言包機制,除掛件外,在模板、js文件中均使用語言項代替直接顯示語言文字。
語言文件:語言文件位於商城根目錄下的languages目錄下,爲當前語言建了一個目錄,如果您用的是sc-gbk版本,則會有sc-gbk目錄,進去之後就能看到屬於前臺控制器的全部語言文件了。除common.lang.php屬於所有app外,每一個語言文件都只屬於一個app(ECMall中稱爲控制器)。語言文件屬於某個控制器而不屬於某個模板,同一個模板如果被不同控制器調用將使用不同語言文件進行語言解析。
在默認控制器對應的語言文件default.lang.php添加語言項”test”:

<?php
return array(
    'hot_search' => '熱門搜索',
    ... ...
    'best_recommended' => '精品推薦',
    'test' => '測試語言項'
);
?>

在index.html模板中顯示語言項”test”

{$lang.test}

模板中還支持數組形式語言項,在默認控制器對應的語言文件default.lang.php添加語言項”test_array”

<?php
return array(
    'hot_search' => '熱門搜索',
    ... ...
    'best_recommended' => '精品推薦',
    'test_array' => array(
        'key1' => '測試數組語言項',
        'key2' => '太好了'
    ),
);
?>

在index.html模板中顯示語言項”test”

{$lang.test_array.key1}
  1. 變量調節器
    • escape
      功能:提供各種編碼功能。
      參數:可選參數html、url、quotes、input、editor,缺省爲html html:分別替換變量中的如下字符& < > “爲其html實體代碼,用於按原樣輸出html源代碼。
      url:如果該變量用於儲存url地址,需要進行url編碼
      quotes:在單雙引號字符前添加反斜槓
      input:給輸入框賦值時使用
      editor:當顯示通過文本編輯器錄入的內容,需要用此參數
      例如php賦值:
$this->assign('goods_name', "L'oreal/歐萊雅"  .  '"'   . 
"清潤全日保溼乳霜"  .  '"'   . "50ml<br /><script>");
$this->display('index.tpl');

模板

{$goods_name}
{$goods_name|escape}
{$goods_name|escape:"html"}
{$goods_name|escape:"url"}
{$goods_name|escape:"quotes"}
{$goods_name|escape:"input"}
{$goods_name|escape:"editor"}

輸出結果爲

L'oreal/歐萊雅"清潤全日保溼乳霜"50ml<br /><script>
L'oreal/歐萊雅"清潤全日保溼乳霜"50ml<br /><script>
L'oreal/歐萊雅"清潤全日保溼乳霜"50ml<br /><script>
L\'oreal/歐萊雅\"清潤全日保溼乳霜\"50ml<br /><script>
L'oreal/歐萊雅\"清潤全日保溼乳霜\"50ml<br /><script>
L'oreal/歐萊雅"清潤全日保溼乳霜"50ml<br /><script>
  • nl2br
    功能:將換行符替換成
{$var|nl2br}
  • default
    功能:爲變量設置一個默認值,當變量爲空或者未分配的時候,將由默認值替代輸出
{$var|default:"no title"}
  • truncate
    功能:字符串截取。從字符串開始處截取某長度的字符。默認會在末尾追加省略號。
{$content|truncate:20}
  • strip_tags
    功能:去除<和>標籤,包括在<和>之間的任何內容。
{assign var="content" value="<b>文章內容</b>"}
{$content|strip_tags}
  • price
    功能:格式化價格。
{assign var="goods_price" value="123456"}
{$goods_price|price}

輸出結果爲:¥123,456.00

  • date
    功能:格式化本地時間和日期。
    格式:{$var|date:format}
    說明:變量varphpgmtime() smarty.now得到的都是格林尼治標準時間,參數format可爲simple、complete或自定義日期格式,缺省爲simple。
{$smarty.now|date}
{$smarty.now|date:complete}
{$smarty.now|date:Y-m-d H:i}

輸出結果爲:

2010-12-01
2010-12-01 22:49:46
2010-12-01 22:49
  • modifier
    功能:調用php自定義函數。
    格式:{$var|modifier:user_func}
    流程控制標籤
    1. 條件判斷(if,elseif,else)
      模板中的 if 語句和 php 中的 if 語句一樣靈活易用,並增加了幾個特性以適宜模板引擎. if 必須於 /if 成對出現. 可以使用 else 和 elseif 子句. 可以使用以下條件修飾詞:eq、ne/neq、gt、lt、lte/le、gte/ge、mod、not、==、!=、>、<、<=、>=、%、!使用這些修飾詞時必須和變量或常量用空格格開.
      多個條件之間用 and、or、&&、|| 連接,實現簡單的邏輯運算
{if $name eq "Fred"}
        Welcome Sir.
{elseif $name eq "Wilma"}
        Welcome Ma'am.
{else}
        Welcome, whatever you are.
{/if}

{* 一個"或"邏輯的例子 *}
{if $name eq "Fred" or $name eq "Wilma"}
        ...
{/if}

{* 與上例等效 *}
{if $name == "Fred" || $name == "Wilma"}
        ...
{/if}

{* 下面的語法無效,條件修飾符必須由空格跟其他元素分開 *}
{if $name=="Fred" || $name=="Wilma"}
        ...
{/if}

{* 允許使用括號 *}
{if ( $amount < 0 or $amount > 1000 ) and 
$volume >= #minVolAmt#}
        ...
{/if}
  1. 數組遍歷(foreach,foreachelse)
    foreach 用於處理簡單數組(數組中的元素的類型一致)。foreach 必須和 /foreach 成對使用,且必須指定 from 和 item 屬性。foreach 可以嵌套,但必須保證嵌套中的 foreach 名稱唯一。foreachelse 語句在 from 變量沒有值的時候被執行。
    from 屬性:指定被循環的數組,數組長度決定了循環的次數。item屬性:單個循環項目的變量名,在循環內部使用。name 屬性爲可選屬性,可以任意指定(字母、數字和下劃線的組合)。
    name 屬性如果指定,foreach循環體內會自動生成如下變量
    $smarty.foreach.foreach_name.index表示本次循環索引,從0開始遞增的整數
    $smarty.foreach.foreach_name.iteration表示本次的循環次數,從1開始遞增的整數
    $smarty.foreach.foreach_name.first表示是否是第一次循環
    $smarty.foreach.foreach_name.last表示是否是最後一次循環
    $smarty.foreach.foreach_name.show表示是否有數據
    $smarty.foreach.foreach_name.total表示循環總次數,也可在循環體外使用
{* 該例將輸出數組 $custid 中的所有元素的值 *}
{foreach from=$custid item=curr_id}
        id: {$curr_id}<br />
{/foreach} 

輸出結果爲:

id: 1000<br />
id: 1001<br />
id: 1002<br />
/* 在對應的控制器中賦值 */
$this->assign("contacts", array(
    array("phone" => "1", "fax" => "2", "cell" => "3"),
    array("phone" => "555-4444", "fax" => "555-3333", 
    "cell" => "760-1234")
));

模板代碼:

{* 鍵就是數組的下標,請參看關於數組的解釋 *}
{foreach name=outer item=contact from=$contacts}
{foreach key=key item=item from=$contact}
{$key}: {$item}<br />
{/foreach}
{/foreach}
輸出結果爲:
phone: 1<br />
fax: 2<br />
cell: 3<br />
phone: 555-4444<br />
fax: 555-3333<br />
cell: 760-1234<br />
{* 最後一行不顯示<br />標籤 *}

{foreach name=outer item=contact from=$contacts name=my_name}
{foreach key=key item=item from=$contact}
{$key}: {$item}{if !smarty.foreach.my_name.last}<br />{/if}
{/foreach}
{/foreach}

顯示標籤
* cycle
cycle 用於輪轉使用一組值。該特性使得在表格中交替輸出顏色或輪轉使用數組中的值變得很容易。
格式:

{cycle values="val1,val2,val3..."}
{foreach from=$data_list item=data}
<tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}">
<td>{$data}</td>
</tr>
{/foreach}

輸出結果爲:

<tr bgcolor="#eeeeee">
<td>1</td>
</tr>
<tr bgcolor="#d0d0d0">
<td>2</td>
</tr>
<tr bgcolor="#eeeeee">
<td>3</td>
</tr>
  • html_options
    自定義函數 html_options 根據給定的數據創建選項組. 該函數可以指定哪些元素被選定. 要麼必須指定 values 和 ouput 屬性,要麼指定 options 替代。
$this->assign('cust_ids', array(1000,1001,1002,1003));
$this->assign('cust_names', array('Joe Schmoe','Jack Smith',
'Jane Johnson','Carlie Brown'));
$this->assign('customer_id', 1001);

模板代碼:

<select>
        {html_options values=$cust_ids selected=$customer_id output=$cust_names}
</select>
$this->assign('cust_options', array(
    1001 => 'Joe Schmoe',
    1002 => 'Jack Smith',
    1003 => 'Jane Johnson',
    1004 => 'Charlie Brown'));
$this->assign('customer_id', 1001);

模板代碼:

<select>
        {html_options options=$cust_options selected=$customer_id}
</select>

實例1和實例2輸出結果均爲:

<select>
        <option value="1000">Joe Schmoe</option>
        <option value="1001" selected>Jack Smith</option>
        <option value="1002">Jane Johnson</option>
        <option value="1003">Carlie Brown</option>
</select>
  • html_radios
    自定義函數 html_radios 根據給定的數據創建單選按鈕組。該函數可以指定哪個元素被選定。要麼必須指定 values 和 ouput 屬性,要麼指定 options 替代。與html_options不同的是html_radios有一個checked屬性。
  • html_checkbox
    自定義函數 html_checkboxes 根據給定的數據創建複選按鈕組。該函數可以指定哪些元素被選定。 要麼必須指定 values 和 ouput 屬性,要麼指定 options 替代.。與html_options不同的是html_checkbox有一個checked屬性。
  • sprintf
    說明: 對變量進行格式化。
    格式{sprintf lang=my_lang var1=my_var1 var2=my_var2 ...}
    在語言文件添加語言項:
return array(
    ... ...
    'query_info' => '頁面執行 %0.3f 秒, 查詢 %d 次,在線 %d 人'
);

模板中顯示:

{sprintf lang=query_info var1=query_time var2=query_count var3=query_user_count}

輸出結果爲:
頁面執行 0.160 秒, 查詢 3 次,在線 10 人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章