# 開發模板

想要書寫一個主題,首先在template錄創建一個 theme_tpl 目錄作為我們自定義的模板目錄,接著創建一個 html文件夾 用來存放所有的html文件

└─ template
   └─ `theme_tpl`
       ├─ css
       ├─ js
       └─ html
1
2
3
4
5

TIP

詳細可參考 模板結構 來構建你的模板結構,這裏知識點主要是開發技巧,不做詳細的構建步驟介紹,開發任何網站模板是要具備一定 html cssjavascript 等前端基礎哦

必備js

自帶的 home.js已經做好了很多必備的功能,開發者直接引入既可以使用裏面 MAC 對象封裝的函數,例如:歷史記錄、頂踩收藏、訪問量統計,評論等等功能,俗稱蘋果cms模板必備三段。

<script src="{$maccms.path}static/js/jquery.js"></script>
<script>var maccms={"path":"__ROOT__","mid":"{$maccms['mid']}","url":"{$maccms['site_url']}","wapurl":"{$maccms['site_wapurl']}","mob_status":"{$maccms['mob_status']}"};
</script>
<script src="{$maccms.path}static/js/home.js"></script>
1
2
3
4

# 使用標簽

蘋果CMSv10標簽完全支持tp5的語法,在HTML中使用{}包裹起來的php變量,如 {$maccms['site_name']}數組的形式支持用.來代替如:{$maccms.site_name}。列表標簽有起始標簽結束標簽組成。如 {maccms:vod type="all" num="10"}{/maccms:vod},內部變量都是數據庫字段組成,以 $vo.開頭如:{$vo.vod_name}{$vo.vod_id} 等等。

# 使用函數

我們往往需要對模板輸出變量使用函數,可以使用:

{$data.name|md5} 
1
  • 編譯後的結果是:
<?php echo (md5($data['name'])); ?>
1
  • 如果函數有多個參數需要調用,則使用:
{$create_time|date="y-m-d",###}
1

表示date函數傳入兩個參數,每個參數用逗號分割,這裏第一個參數是y-m-d,第二個參數是前面要輸出的create_time變量,因為該變量是第二個參數,因此需要用###標識變量位置,編譯後的結果是:

<?php echo (date("y-m-d",$create_time)); ?>

1
2

如果前面輸出的變量在後面定義的函數的第一個參數,則可以直接使用:

{$data.name|substr=0,3}
1

表示輸出

<?php echo (substr($data['name'],0,3)); ?>
1

雖然也可以使用:

{$data.name|substr=###,0,3}
1

但完全沒用這個必要。 還可以支持多個函數過濾,多個函數之間用|分割即可,例如:

{$name|md5|strtoupper|substr=0,3}
1

編譯後的結果是:

<?php echo (substr(strtoupper(md5($name)),0,3)); ?>
1

函數會按照從左到右的順序依次調用。 如果你覺得這樣寫起來比較麻煩,也可以直接這樣寫:

{:substr(strtoupper(md5($name)),0,3)}
1

TIP

變量輸出使用的函數可以支持內置的PHP函數或者用戶自定義函數,甚至是靜態方法。

# 常用處理函數

  • 允許使用多個函數,都使用|分隔開

  • 所有圖片地址,不管是遠程的本地的都建議使用 mac_url_img 來處理。

  • {:mac_data_count(0,'all','vod')} 獲取視頻總數量

  • {:mac_data_count(0,'today','vod')}獲取今日更新視頻總數量

  • {:mac_data_count(0,'all','art')}獲取文章總數量

  • {:mac_data_count(0,'today','art')} 獲取今日更新文章總數量

  • {:mac_data_count(1,'all')}獲取某個分類下的數據總量,支持視頻和文章,傳入分類ID

  • {:mac_data_count(1,'today')} 獲取某個分類下的今日更新數據總量,支持視頻和文章,傳入分類ID

  • 另外還支持topic,website,actor,role模塊的獲取數據數量

  • {:mac_url('map/index')} 獲取站內鏈接,參數代表 模塊/頁面

  • {$obj.vod_content|mac_url_content_img} 如果使用了第三方附件存儲,附件和圖片默認url是mac:開頭的,此方法將替換為- http

  • {$vo.vod_pic|mac_url_img} 自動轉換圖片地址

  • {$vo.vod_content|mac_substring=100}返回截取字符串100個字

  • {$vo.vod_content|mac_filter_html}返回沒有html代碼的內容

  • {$vo.actor|mac_url_create='actor','vod','search','&nbsp;'} 把,號相連的一串字符生成N個搜索鏈接,後2個參數可以不填寫默認是生成vod模塊搜索鏈接。 例子是創建演員搜索鏈接。支持演員、導演、tag、擴展分類等字段。最後一個參數是生成鏈接的分隔符。

  • {$vo.vod_time|mac_day}自動返回日期

  • {$vo.vod_time|mac_friend_date}友好時間提醒 幾秒前,幾分前,幾小時前,幾天前。。。

  • {$vo.vod_year|mac_default='未知'}如果字符串為空,則返回默認字符串

  • {$user.user_login_ip|mac_long2ip}返回格式化ip地址

  • {$user.user_id|mac_get_user_portrait}獲取用戶頭像地址

# 常用JS處理函數

一般用元素的class自動綁定處理事件

  • 會員-收藏視頻內容
<a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}">我要收藏</a>
1
  • 會員-收藏文章內容頁
<a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.art_id}">我要收藏</a>
1
  • 會員-收藏專題內容頁
<a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.topic_id}">我要收藏</a>
1

以下內容一般放到body結尾之前,不用於顯示,只用戶記錄信息。

  • 會員-文章瀏覽記錄
<span style="display:none" class="mac_ulog_set" alt="設置文章內容頁瀏覽記錄" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.art_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span>
1
  • 會員-專題瀏覽記錄
<span style="display:none" class="mac_ulog_set" alt="設置專題內容頁瀏覽記錄" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.topic_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span>
1
  • 會員-視頻瀏覽記錄
<span style="display:none" class="mac_ulog_set" alt="設置內容頁瀏覽記錄" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span>
1
  • 會員-視頻播放記錄
<span style="display:none" class="mac_ulog_set" alt="設置視頻播放記錄" data-type="4" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span>
1
  • 會員-視頻下載記錄
<span style="display:none" class="mac_ulog_set" alt="設置視頻播放記錄" data-type="5" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span>
1
  • 視頻、文章、專題 頂和踩 通用
<a class="digg_link" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}" data-mid="{$maccms.mid}" data-type="up" href="javascript:;"><em class="digg_num">{$obj.vod_up}{$obj.art_up}{$obj.topic_up}</em>
</a>
<a class="digg_link" data-id="{$vod_id}{$art_id}{$topic_id}" data-mid="{$maccms.mid}" data-type="down" href="javascript:;"><em class="digg_num">{$obj.vod_down}{$obj.art_down}{$obj.topic_down}</em>
</a>
1
2
3
4
5
6

# 視頻、文章、專題點擊量顯示 通用

總點擊量:

<span class="mac_hits hits" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}" data-type="hits"></span>
1
  • 日點擊量:
<span class="mac_hits hits_day" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}" data-type="hits_day"></span>
1
  • 周點擊量:
<span class="mac_hits hits_week" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}"  data-type="hits_week"></span>
1
  • 月點擊量:
<span class="mac_hits hits_month" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}" data-type="hits_month"></span>
1
  • 前臺瀏覽歷史記錄調用
<a href="javascript:;" class="mac_history">歷史記錄</a>
1

# 在視頻、文章、專題詳情頁面寫入瀏覽歷史記錄

<span style="display:none" class="mac_history_set" alt="設置視頻歷史記錄" data-name="[{$obj.type.type_name}]{$obj.vod_name}" data-pic="{$obj.vod_pic|mac_url_img}"></span>
<span style="display:none" class="mac_history_set" alt="設置文章歷史記錄" data-name="[{$obj.type.type_name}]{$obj.art_name}" data-pic="{$obj.art_pic|mac_url_img}"></span>
<span style="display:none" class="mac_history_set" alt="設置專題歷史記錄" data-name="{$obj.topic_name}" data-pic="{$obj.topic_pic|mac_url_img}"></span>
1
2
3
  • 訪問頁面觸發定時任務,建議放到首頁底部; 由於入口文件名可變,默認是api.php,如需修改請自定義 data-file="xxx.php"
<span style="display: none;" class="mac_timming" data-file="" ></span>
1
  • 網址導航來路記錄統計;建議放到首頁底部。來路域名必須和網址導航裏的跳轉url裏的一致。
<span style="display: none;" class="mac_referer" data-file="" ></span>
1
  • 自動獲取短網址連接
<input type="text" name="shorten" class="mac_shorten" />
1
  • 短網址自定義用法,js來獲取
<script>
    MAC.Shorten.Get("http://www.baidu.com/",function(r){
        alert(r.data.url_short);
    });
</script>
1
2
3
4
5
  • 獲取用戶記錄日誌,比如1瀏覽、2收藏、3想看、4點播、5下載
  • MAC.Ulog.Get4個參數type類型0代表全部,page頁碼,limit每頁條數,call回調函數
<script>
    MAC.Ulog.Get(0,1,999,function(r){
        if(r.code == 1){
            $.each(r['list'],function(index,row){
                console.log(row['data']['id'] + '--' + row['data']['name'] + '--' + row['data']['pic'] + '--' + row['data']['link'] + '--' + row['data']['type']['type_name'] + '--' + row['data']['type']['link'] + '--'  );
            });
        }else{
			console.log('獲取失敗');
        }
	});
</script>
1
2
3
4
5
6
7
8
9
10
11

# 使用默認值

我們可以給變量輸出提供默認值,例如:

{$obj.user_nickname|default="這個人沒有昵稱"}
1

對系統變量依然可以支持默認值輸出,例如:

{$obj.vod_actor|default="演員為空"}
1

默認值和函數可以同時使用,例如:

{$Think.get.name|getName|default="名稱為空"}
1

# 使用運算符

我們可以對模板輸出使用運算符,包括對“+”“-” “*” “/”和“%”的支持。 例如:

運算符 使用示例
+ {$a+$b}
- {$a-$b}
* {$a*$b}
/ {$a/$b}
% {$a%$b}
++ {$a++} 或 {++$a}
-- {$a--} 或 {--$a}
綜合判斷 {$a+$b*10+$c}

在使用運算符的時候,不再支持常規函數用法,例如:

{$user.score+10} //正確的
{$user['score']+10} //正確的
{$user['score']*$user['level']} //正確的
{$user['score']|myFun*10} //錯誤的
{$user['score']+myFun($user['level'])} //正確的
1
2
3
4
5

# 三元運算

模板可以支持三元運算符,例如:

{$status? '正常' : '錯誤'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
1
2
3

5.0版本還支持如下的寫法:

{$varname.aa ?? 'xxx'}
1

表示如果有設置$varname則輸出$varname,否則輸出'xxx'。 解析後的代碼為:

<?php echo isset($varname['aa']) ? $varname['aa'] : '默認值'; ?>
1
{$varname?='xxx'} 
1

表示$varname為真時才輸出xxx。 解析後的代碼為:

<?php if(!empty($name)) echo 'xxx'; ?>
1
{$varname ?: 'no'}
1

表示如果$varname為真則輸出$varname,否則輸出no。解析後的代碼為:

<?php echo $varname ? $varname : 'no'; ?>
1
{$a==$b ? 'yes' : 'no'}
1

前面的表達式為真輸出yes,否則輸出no, 條件可以是==、===、!=、!==、>=、<=

# 模板繼承

模板繼承是一項更加靈活的模板布局方式,模板繼承不同於模板布局,甚至來說,應該在模板布局的上層。模板繼承其實並不難理解,就好比類的繼承一樣,模板也可以定義一個基礎模板(或者是布局),並且其中定義相關的區塊block,然後繼承extend該基礎模板的子模板中就可以對基礎模板中定義的區塊進行重載。

因此,模板繼承的優勢其實是設計基礎模板中的區塊`block)和子模板中替換這些區塊。

每個區塊由{block} {/block}標簽組成。 下面就是基礎模板中的一個典型的區塊設計(用於設計網站標題):

{block name="title"}<title>網站標題</title>{/block}
1

block標簽必須指定name屬性來標識當前區塊的名稱,這個標識在當前模板中應該是唯一的,block標簽中可以包含任何模板內容,包括其他標簽和變量,例如:

{block name="title"}<title>{$web_title}</title>{/block}
1

你甚至還可以在區塊中加載外部文件:

{block name="include"}{include file="Public:header" /}{/block}
1

一個模板中可以定義任意多個名稱標識不重復的區塊,例如下面定義了一個base.html基礎模板:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>{block name="title"}標題{/block}</title>
   </head>
   <body>
      {block name="menu"}菜單{/block}
      {block name="left"}左邊分欄{/block}
      {block name="main"}主內容{/block}
      {block name="right"}右邊分欄{/block}
      {block name="footer"}底部{/block}
   </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13

然後我們在子模板(其實是當前操作的入口模板)中使用繼承:

{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
 {$vo.content}
{/volist}
{/block}
{block name="right"}
 最新資訊:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
 @ThinkPHP 版權所有
{/block}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

上例中,我們可以看到在子模板中使用了extend標簽來繼承了base模板。 在子模板中,可以對基礎模板中的區塊進行重載定義,如果沒有重新定義的話,則表示沿用基礎模板中的區塊定義,如果定義了一個空的區塊,則表示刪除基礎模板中的該區塊內容。 上面的例子,我們就把left區塊的內容刪除了,其他的區塊都進行了重載。而

{block name="footer"}
{__block__}@大圖模板datll.com 版權所有
{/block}
1
2
3

這一區塊中有{_block_}這個標簽,當區塊中有這個標記時,就不只是直接重載這個區塊,它表示引用所繼承模板對應區塊的內容到這個位置,最終這個區塊是合並後的內容。所以這裏footer區塊最後的內容是: 底部@大圖模板 版權所有 extend標簽的用法和include標簽一樣,你也可以加載其他模板:

{extend name="Public:base" /}
1

或者使用絕對文件路徑加載

{extend name="./Template/Public/base.html" /}
1

在當前子模板中,只能定義區塊而不能定義其他的模板內容,否則將會直接忽略,並且只能定義基礎模板中已經定義的區塊。 例如,如果采用下面的定義:

{block name="title"}<title>{$title}</title>{/block}
<a href="/" >首頁</a>
<a href="/art/index" >資訊</a>
<a href="/actor/" >明星</a>
1
2
3
4

導航部分將是無效的,不會顯示在模板中。 模板可以多級繼承,比如B繼承了A,而C又繼承了B,最終C中的區塊會覆蓋B和A中的同名區塊,但C和B中的區塊必須是A中已定義過的。 子模板中的區塊定義順序是隨意的,模板繼承的用法關鍵在於基礎模板如何布局和設計規劃了,如果結合原來的布局功能,則會更加靈活。

# 比較標簽

比較標簽用於簡單的變量比較,復雜的判斷條件可以用if標簽替換,比較標簽是一組標簽的集合,基本上用法都一致,如下:

標簽 含義
eq或者 equal 等於
neq 或者notequal 不等於
gt 大於
egt 大於等於
lt 小於
elt 小於等於
heq 恒等於
nheq 不恒等於

他們的用法基本是一致的,區別在於判斷的條件不同,並且所有的比較標簽都可以和else標簽一起使用。 例如,要求name變量的值等於value就輸出,可以使用:

{eq name="name" value="value"}value{/eq}
1

或者

{equal name="name" value="value"}value{/equal}
1

也可以支持和else標簽混合使用:

{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
1
2
3
4
5

當 name變量的值大於5就輸出

{gt name="vod_name" value="5"}value{/gt}
1

當name變量的值不小於5就輸出

{egt name="name" value="5"}value{/egt}
1

比較標簽中的變量可以支持對象的屬性或者數組,甚至可以是系統變量,例如: 當vo對象的屬性(或者數組,或者自動判斷)等於5就輸出

{eq name="vo.vod_name" value="5"}
{$vo.vod_name}
{/eq}
1
2
3

vo對象的屬性等於5就輸出

{eq name="vo:vod_name" value="5"}
{$vo.vod_name}
{/eq}
1
2
3

$vo['vod_name']等於5就輸出

{eq name="vo['vod_name']" value="5"}
{$vo.name}
{/eq}
1
2
3

而且還可以支持對變量使用函數 當vo對象的屬性值的字符串長度等於5就輸出

{eq name="vo:name|strlen" value="5"}{$vo.name}{/eq}
1

變量名可以支持Thinkphp5.0系統變量的方式,例如:

{eq name="Think.get.name" value="value"}相等{else/}不相等{/eq}
1

通常比較標簽的值是一個字符串或者數字,如果需要使用變量,只需要在前面添加$標誌: 當vo對象的屬性等於$a就輸出

{eq name="vo:vod_name" value="$a"}{$vo.vod_name}{/eq}
1

所有的比較標簽可以統一使用compare標簽(其實所有的比較標簽都是compare標簽的別名),例如: 當name變量的值等於5就輸出

{compare name="name" value="5" type="eq"}value{/compare}
1

等效於

{eq name="name" value="5" }value{/eq}
1

其中type屬性的值就是上面列出的比較標簽名稱

# 條件判斷

# SWITCH標簽

用法:

{switch name="變量" }
    {case value="值1" break="0或1"}輸出內容1{/case}
    {case value="值2"}輸出內容2{/case}
    {default /}默認情況
{/switch}
1
2
3
4
5

使用方法如下:

{switch name="User.level"}
    {case value="1"}value1{/case}
    {case value="2"}value2{/case}
    {default /}default
{/switch}
1
2
3
4
5

其中name屬性可以使用函數以及系統變量,例如:

{switch name="Think.get.userId|abs"}
    {case value="1"}admin{/case}
    {default /}default
{/switch}
1
2
3
4

對於case的value屬性可以支持多個條件的判斷,使用”|”進行分割,例如:

{switch name="Think.get.type"}
    {case value="gif|png|jpg"}圖像格式{/case}
    {default /}其他格式
{/switch}

1
2
3
4
5

表示如果$_GET["type"]gifpng或者jpg的話,就判斷為圖像格式。

Case標簽還有一個break屬性,表示是否需要break,默認是會自動添加break,如果不要break,可以使用:

{switch name="Think.get.userId|abs"}
    {case value="1" break="0"}admin{/case}
    {case value="2"}admin{/case}
    {default /}default
{/switch}
1
2
3
4
5

也可以對case的value屬性使用變量,例如:

{switch name="User.userId"}
    {case value="$adminId"}admin{/case}
    {case value="$memberId"}member{/case}
    {default /}default
{/switch}
1
2
3
4
5

TIP

使用變量方式的情況下,不再支持多個條件的同時判斷。

簡潔的用法

{switch $User.userId}
    {case $adminId}admin{/case}
    {case $memberId}member{/case}
{/switch}
1
2
3
4

# IF標簽

用法示例:

{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
1
2
3
4

除此之外,我們可以在condition屬性裏面使用php代碼,例如:

{if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP
{else /} other Framework
{/if}
1
2
3

condition屬性可以支持點語法和對象語法,例如: 自動判斷user變量是數組還是對象

{if condition="$user.name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
1
2
3

或者知道user變量是對象

{if condition="$user:name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
1
2
3

由於if標簽的condition屬性裏面基本上使用的是php語法,盡可能使用判斷標簽和Switch標簽會更加簡潔,原則上來說,能夠用switch和比較標簽解決的盡量不用if標簽完成。因為switch和比較標簽可以使用變量調節器和系統變量。如果某些特殊的要求下面,IF標簽仍然無法滿足要求的話,可以使用原生php代碼或者PHP標簽來直接書寫代碼。 簡潔的用法

{if condition="表達式"}
{if (表達式)}
{if 表達式}
1
2
3

這三種寫法結果是一樣的

# 範圍判斷

範圍判斷標簽包括in notin between notbetween四個標簽,都用於判斷變量是否中某個範圍。

# IN和NOTIN

用法: 假設我們中控製器中給id賦值為1:

$id =    1;
$this->assign('id',$id);
1
2

我們可以使用in標簽來判斷模板變量是否在某個範圍內,例如:

{in name="id" value="1,2,3"}
id在範圍內
{/in}
1
2
3

最後會輸出:id在範圍內。

如果判斷不在某個範圍內,可以使用notin標簽:

{notin name="id" value="1,2,3"}
id不在範圍內
{/notin}
1
2
3

最後會輸出:id不在範圍內。 可以把上面兩個標簽合並成為:

{in name="id" value="1,2,3"}
id在範圍內
{else/}
id不在範圍內
{/in}
1
2
3
4
5

name屬性還可以支持直接判斷系統變量,例如:

{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在範圍內
{/in}
1
2
3

TIP

更多的系統變量用法可以參考系統變量部分。

value屬性也可以使用變量,例如:

{in name="id" value="$range"}
id在範圍內
{/in}
1
2
3

$range變量可以是數組,也可以是以逗號分隔的字符串。 value屬性還可以使用系統變量,例如:

{in name="id" value="$Think.post.ids"}
id在範圍內
{/in}
1
2
3

# BETWEEN 和 NOTBETWEEN

可以使用between標簽來判斷變量是否在某個區間範圍內,可以使用:

{between name="id" value="1,10"}
輸出內容1
{/between}
1
2
3

同樣,也可以使用notbetween標簽來判斷變量不在某個範圍內:

{notbetween name="id" value="1,10"}
輸出內容2
{/notbetween}
1
2
3

也可以使用else標簽把兩個用法合並,例如:

{between name="id" value="1,10"}
輸出內容1
{else/}
輸出內容2
{/between}
1
2
3
4
5

當使用between標簽的時候,value只需要一個區間範圍,也就是只支持兩個值,後面的值無效,例如

{between name="id" value="1,3,10"}
輸出內容1
{/between}
1
2
3

實際判斷的範圍區間是1~3,而不是1~10,也可以支持字符串判斷,例如:

{between name="id" value="A,Z"}
輸出內容1
{/between}
1
2
3

name屬性可以直接使用系統變量,例如:

{between name="Think.post.id" value="1,5"}
輸出內容1
{/between}
1
2
3

value屬性也可以使用變量,例如:

{between name="id" value="$range"}
輸出內容1
{/between}
1
2
3

變量的值可以是字符串或者數組,還可以支持系統變量。

{between name="id" value="$Think.get.range"}
輸出內容1
{/between}
1
2
3

# RANGE

也可以直接使用range標簽,替換前面的判斷用法:

{range name="id" value="1,2,3" type="in"}
輸出內容1
{/range}
1
2
3

其中type屬性的值可以用in/notin/between/notbetween,其它屬性的用法和IN或者BETWEEN一致。

# PRESENT NOTPRESENT標簽

present標簽用於判斷某個變量是否已經定義,用法:

{present name="name"}
name已經賦值
{/present}
1
2
3

如果判斷沒有賦值,可以使用:

{notpresent name="name"}
name還沒有賦值
{/notpresent}
1
2
3

可以把上面兩個標簽合並成為:

{present name="name"}
name已經賦值
{else /}
name還沒有賦值
{/present}
1
2
3
4
5

present標簽的name屬性可以直接使用系統變量,例如:

{present name="Think.get.name"}
$_GET['name']已經賦值
{/present}
1
2
3

# EMPTY NOTEMPTY 標簽

empty標簽用於判斷某個變量是否為空,用法:

{empty name="name"}
name為空值
{/empty}
1
2
3

如果判斷沒有賦值,可以使用:

{notempty name="name"}
name不為空
{/notempty}
1
2
3

以把上面兩個標簽合並成為:

{empty name="name"}
name為空
{else /}
name不為空
{/empty}
1
2
3
4
5

name屬性可以直接使用系統變量,例如:

{empty name="Think.get.name"}
$_GET['name']為空值
{/empty}
1
2
3

# DEFINED 標簽

DEFINED標簽用於判斷某個常量是否有定義,用法如下:

{defined name="NAME"}
NAME常量已經定義
{/defined}
1
2
3

TIP

name屬性的值要註意嚴格大小寫

如果判斷沒有被定義,可以使用:

{notdefined name="NAME"}
NAME常量未定義
{/notdefined}
1
2
3

可以把上面兩個標簽合並成為:

{defined name="NAME"}
NAME常量已經定義
{else /}
NAME常量未定義
{/defined}
1
2
3
4
5

# 標簽嵌套

模板引擎支持標簽的多層嵌套功能,可以對標簽庫的標簽指定可以嵌套。

系統內置的標簽中,volistswitchifelseifelseforeachcompare(包括所有的比較標簽)、(notpresent、(notempty、(notdefined等標簽都可以嵌套使用。例如:

{volist name="list" id="vo"}
    {volist name="vo['sub']" id="sub"}
        {$sub.name}
    {/volist}
{/volist}
1
2
3
4
5
  • 嵌套循環外層分類內部視頻或文章,重點在於外部和內部標簽各自設置 id 和 key,系統默認都是vo不適合會導致數據沖掉。
{maccms:type ids="1,2,3,4" order="asc" by="sort" id="vo1" key="key1"}
    {maccms:vod num="10" type="'.$vo1['type_id'].'" order="desc" by="time" id="vo2" key="key2"}
        {$vo1.type_name}:{$vo2.vod_name};
    {/maccms:vod}
{/maccms:type}
1
2
3
4
5
  • 嵌套循環一級和二級分類數據
{maccms:type ids="1,2,3,4,5" order="asc" by="sort" id="vo" key="key"} 				  
	{maccms:type parent="'.$vo['type_id'].'" order="asc" by="sort" id="vo2" key="key2"} 
		<li><a href=":mac_url_type($vo2)}">{$vo2.type_name}</a></li>
	{/maccms:type}
{/maccms:type}
1
2
3
4
5

# 使用PHP

php代碼可以和標簽在模板文件中混合使用,可以在模板文件裏面書寫任意的PHP語句代碼 ,包括下面兩種方式:

# 使用php標簽

{php}echo 'Hello,world!';{/php}
1

我們建議需要使用PHP代碼的時候盡量采用php標簽,因為原生的PHP語法可能會被配置禁用而導致解析錯誤。

# 使用原生php代碼

<?php echo 'Hello,world!'; ?>
1

TIP

註意:php標簽或者php代碼裏面就不能再使用標簽(包括普通標簽和XML標簽)了,因此下面的幾種方式都是無效的:

{php}{eq name='name'value='value'}value{/eq}{/php}
1

Php標簽裏面使用了eq標簽,因此無效

{php}if( {$user} != 'ThinkPHP' ) echo  'ThinkPHP' ;{/php}
1

php標簽裏面使用了{$user}普通標簽輸出變量 ,因此無效。

{php}if( $user.name != 'ThinkPHP' ) echo  'ThinkPHP' ;{/php}
1

Php標簽裏面使用了$user.name 點語法變量輸出 ,因此無效。

TIP

簡而言之,在PHP標簽裏面不能再使用PHP本身不支持的代碼。

如果設置了tpl_deny_php參數為true,就不能在模板中使用原生的PHP代碼,但是仍然支持PHP標簽輸出。

# 自定義標簽

ASSIGN標簽 ASSIGN標簽用於在模板文件中定義變量,用法如下:

{assign name="var" value="123" /}
1

在運行模板的時候,賦值了一個var的變量,值是123

value屬性也支持變量,例如:

{assign name="var" value="$val" /}
1

或者直接把系統變量賦值給var變量,例如:

{assign name="var" value="$Think.get.name" /}
1

相當於,執行了:$var = $_GET['name'];

DEFINE標簽 DEFINE標簽用於中模板中定義常量,用法如下:

{define name="MY_DEFINE_NAME" value="3" /}
1

在運行模板的時候,就會定義一個MY_DEFINE_NAME的常量。

value屬性可以支持變量(包括系統變量),例如:

{define name="MY_DEFINE_NAME" value="$name" /}
1

或者

{define name="MY_DEFINE_NAME" value="$Think.get.name" /}
1