# 開發模板
想要書寫一個主題,首先在template
錄創建一個 theme_tpl
目錄作為我們自定義的模板目錄,接著創建一個 html文件夾
用來存放所有的html文件
└─ template
└─ `theme_tpl`
├─ css
├─ js
└─ html
2
3
4
5
TIP
詳細可參考 模板結構 來構建你的模板結構,這裏知識點主要是開發技巧,不做詳細的構建步驟介紹,開發任何網站模板是要具備一定 html
css
和 javascript
等前端基礎哦
必備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>
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}
- 編譯後的結果是:
<?php echo (md5($data['name'])); ?>
- 如果函數有多個參數需要調用,則使用:
{$create_time|date="y-m-d",###}
表示date函數傳入兩個參數,每個參數用逗號分割,這裏第一個參數是y-m-d,第二個參數是前面要輸出的create_time變量,因為該變量是第二個參數,因此需要用###標識變量位置,編譯後的結果是:
<?php echo (date("y-m-d",$create_time)); ?>
2
如果前面輸出的變量在後面定義的函數的第一個參數,則可以直接使用:
{$data.name|substr=0,3}
表示輸出
<?php echo (substr($data['name'],0,3)); ?>
雖然也可以使用:
{$data.name|substr=###,0,3}
但完全沒用這個必要。
還可以支持多個函數過濾,多個函數之間用|
分割即可,例如:
{$name|md5|strtoupper|substr=0,3}
編譯後的結果是:
<?php echo (substr(strtoupper(md5($name)),0,3)); ?>
函數會按照從左到右的順序依次調用。 如果你覺得這樣寫起來比較麻煩,也可以直接這樣寫:
{:substr(strtoupper(md5($name)),0,3)}
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',' '}
把,號相連的一串字符生成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>
- 會員-收藏文章內容頁
<a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.art_id}">我要收藏</a>
- 會員-收藏專題內容頁
<a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.topic_id}">我要收藏</a>
以下內容一般放到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>
- 會員-專題瀏覽記錄
<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>
- 會員-視頻瀏覽記錄
<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>
- 會員-視頻播放記錄
<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>
- 會員-視頻下載記錄
<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>
- 視頻、文章、專題 頂和踩 通用
<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>
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>
- 日點擊量:
<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>
- 周點擊量:
<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>
- 月點擊量:
<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>
- 前臺瀏覽歷史記錄調用
<a href="javascript:;" class="mac_history">歷史記錄</a>
# 在視頻、文章、專題詳情頁面寫入瀏覽歷史記錄
<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>
2
3
- 訪問頁面觸發定時任務,建議放到首頁底部; 由於入口文件名可變,默認是api.php,如需修改請自定義 data-file="xxx.php"
<span style="display: none;" class="mac_timming" data-file="" ></span>
- 網址導航來路記錄統計;建議放到首頁底部。來路域名必須和網址導航裏的跳轉url裏的一致。
<span style="display: none;" class="mac_referer" data-file="" ></span>
- 自動獲取短網址連接
<input type="text" name="shorten" class="mac_shorten" />
- 短網址自定義用法,js來獲取
<script>
MAC.Shorten.Get("http://www.baidu.com/",function(r){
alert(r.data.url_short);
});
</script>
2
3
4
5
- 獲取用戶記錄日誌,比如1瀏覽、2收藏、3想看、4點播、5下載
MAC.Ulog.Get
有4
個參數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>
2
3
4
5
6
7
8
9
10
11
# 使用默認值
我們可以給變量輸出提供默認值,例如:
{$obj.user_nickname|default="這個人沒有昵稱"}
對系統變量依然可以支持默認值輸出,例如:
{$obj.vod_actor|default="演員為空"}
默認值和函數可以同時使用,例如:
{$Think.get.name|getName|default="名稱為空"}
# 使用運算符
我們可以對模板輸出使用運算符,包括對“+”“-” “*” “/”和“%”的支持。 例如:
運算符 | 使用示例 |
---|---|
+ | {$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'])} //正確的
2
3
4
5
# 三元運算
模板可以支持三元運算符,例如:
{$status? '正常' : '錯誤'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
2
3
5.0版本還支持如下的寫法:
{$varname.aa ?? 'xxx'}
表示如果有設置$varname則輸出$varname,否則輸出'xxx'。 解析後的代碼為:
<?php echo isset($varname['aa']) ? $varname['aa'] : '默認值'; ?>
{$varname?='xxx'}
表示$varname為真時才輸出xxx。 解析後的代碼為:
<?php if(!empty($name)) echo 'xxx'; ?>
{$varname ?: 'no'}
表示如果$varname為真則輸出$varname,否則輸出no。解析後的代碼為:
<?php echo $varname ? $varname : 'no'; ?>
{$a==$b ? 'yes' : 'no'}
前面的表達式為真輸出yes,否則輸出no, 條件可以是==、===、!=、!==、>=、<=
# 模板繼承
模板繼承是一項更加靈活的模板布局方式,模板繼承不同於模板布局,甚至來說,應該在模板布局的上層。模板繼承其實並不難理解,就好比類的繼承一樣,模板也可以定義一個基礎模板(或者是布局),並且其中定義相關的區塊block
,然後繼承extend
該基礎模板的子模板中就可以對基礎模板中定義的區塊進行重載。
因此,模板繼承的優勢其實是設計基礎模板中的區塊`block)和子模板中替換這些區塊。
每個區塊由{block} {/block}
標簽組成。 下面就是基礎模板中的一個典型的區塊設計(用於設計網站標題):
{block name="title"}<title>網站標題</title>{/block}
block標簽必須指定name屬性來標識當前區塊的名稱,這個標識在當前模板中應該是唯一的,block標簽中可以包含任何模板內容,包括其他標簽和變量,例如:
{block name="title"}<title>{$web_title}</title>{/block}
你甚至還可以在區塊中加載外部文件:
{block name="include"}{include file="Public:header" /}{/block}
一個模板中可以定義任意多個名稱標識不重復的區塊,例如下面定義了一個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>
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}
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}
2
3
這一區塊中有{_block_}
這個標簽,當區塊中有這個標記時,就不只是直接重載這個區塊,它表示引用所繼承模板對應區塊的內容到這個位置,最終這個區塊是合並後的內容。所以這裏footer
區塊最後的內容是: 底部@大圖模板 版權所有
extend
標簽的用法和include
標簽一樣,你也可以加載其他模板:
{extend name="Public:base" /}
或者使用絕對文件路徑加載
{extend name="./Template/Public/base.html" /}
在當前子模板中,只能定義區塊而不能定義其他的模板內容,否則將會直接忽略,並且只能定義基礎模板中已經定義的區塊。 例如,如果采用下面的定義:
{block name="title"}<title>{$title}</title>{/block}
<a href="/" >首頁</a>
<a href="/art/index" >資訊</a>
<a href="/actor/" >明星</a>
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}
或者
{equal name="name" value="value"}value{/equal}
也可以支持和else標簽混合使用:
{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
2
3
4
5
當 name變量的值大於5就輸出
{gt name="vod_name" value="5"}value{/gt}
當name變量的值不小於5就輸出
{egt name="name" value="5"}value{/egt}
比較標簽中的變量可以支持對象的屬性或者數組,甚至可以是系統變量,例如: 當vo對象的屬性(或者數組,或者自動判斷)等於5就輸出
{eq name="vo.vod_name" value="5"}
{$vo.vod_name}
{/eq}
2
3
當vo
對象的屬性等於5就輸出
{eq name="vo:vod_name" value="5"}
{$vo.vod_name}
{/eq}
2
3
當$vo['vod_name']
等於5就輸出
{eq name="vo['vod_name']" value="5"}
{$vo.name}
{/eq}
2
3
而且還可以支持對變量使用函數 當vo
對象的屬性值的字符串長度等於5
就輸出
{eq name="vo:name|strlen" value="5"}{$vo.name}{/eq}
變量名可以支持Thinkphp5.0系統變量的方式,例如:
{eq name="Think.get.name" value="value"}相等{else/}不相等{/eq}
通常比較標簽的值是一個字符串或者數字,如果需要使用變量,只需要在前面添加$
標誌: 當vo
對象的屬性等於$a
就輸出
{eq name="vo:vod_name" value="$a"}{$vo.vod_name}{/eq}
所有的比較標簽可以統一使用compare
標簽(其實所有的比較標簽都是compare
標簽的別名),例如: 當name
變量的值等於5就輸出
{compare name="name" value="5" type="eq"}value{/compare}
等效於
{eq name="name" value="5" }value{/eq}
其中type屬性的值就是上面列出的比較標簽名稱
# 條件判斷
# SWITCH標簽
用法:
{switch name="變量" }
{case value="值1" break="0或1"}輸出內容1{/case}
{case value="值2"}輸出內容2{/case}
{default /}默認情況
{/switch}
2
3
4
5
使用方法如下:
{switch name="User.level"}
{case value="1"}value1{/case}
{case value="2"}value2{/case}
{default /}default
{/switch}
2
3
4
5
其中name屬性可以使用函數以及系統變量,例如:
{switch name="Think.get.userId|abs"}
{case value="1"}admin{/case}
{default /}default
{/switch}
2
3
4
對於case的value屬性可以支持多個條件的判斷,使用”|”進行分割,例如:
{switch name="Think.get.type"}
{case value="gif|png|jpg"}圖像格式{/case}
{default /}其他格式
{/switch}
2
3
4
5
表示如果$_GET["type"]
是gif
、png
或者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}
2
3
4
5
也可以對case的value屬性使用變量,例如:
{switch name="User.userId"}
{case value="$adminId"}admin{/case}
{case value="$memberId"}member{/case}
{default /}default
{/switch}
2
3
4
5
TIP
使用變量方式的情況下,不再支持多個條件的同時判斷。
簡潔的用法
{switch $User.userId}
{case $adminId}admin{/case}
{case $memberId}member{/case}
{/switch}
2
3
4
# IF標簽
用法示例:
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
2
3
4
除此之外,我們可以在condition屬性裏面使用php代碼,例如:
{if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP
{else /} other Framework
{/if}
2
3
condition屬性可以支持點語法和對象語法,例如: 自動判斷user變量是數組還是對象
{if condition="$user.name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
2
3
或者知道user變量是對象
{if condition="$user:name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
2
3
由於if
標簽的condition
屬性裏面基本上使用的是php
語法,盡可能使用判斷標簽和Switch
標簽會更加簡潔,原則上來說,能夠用switch
和比較標簽解決的盡量不用if
標簽完成。因為switch
和比較標簽可以使用變量調節器和系統變量。如果某些特殊的要求下面,IF
標簽仍然無法滿足要求的話,可以使用原生php
代碼或者PHP
標簽來直接書寫代碼。
簡潔的用法
{if condition="表達式"}
{if (表達式)}
{if 表達式}
2
3
這三種寫法結果是一樣的
# 範圍判斷
範圍判斷標簽包括in
notin
between
notbetween
四個標簽,都用於判斷變量是否中某個範圍。
# IN和NOTIN
用法: 假設我們中控製器中給id賦值為1:
$id = 1;
$this->assign('id',$id);
2
我們可以使用in標簽來判斷模板變量是否在某個範圍內,例如:
{in name="id" value="1,2,3"}
id在範圍內
{/in}
2
3
最後會輸出:id
在範圍內。
如果判斷不在某個範圍內,可以使用notin
標簽:
{notin name="id" value="1,2,3"}
id不在範圍內
{/notin}
2
3
最後會輸出:id
不在範圍內。
可以把上面兩個標簽合並成為:
{in name="id" value="1,2,3"}
id在範圍內
{else/}
id不在範圍內
{/in}
2
3
4
5
name
屬性還可以支持直接判斷系統變量,例如:
{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在範圍內
{/in}
2
3
TIP
更多的系統變量用法可以參考系統變量部分。
value屬性也可以使用變量,例如:
{in name="id" value="$range"}
id在範圍內
{/in}
2
3
$range
變量可以是數組,也可以是以逗號分隔的字符串。
value
屬性還可以使用系統變量,例如:
{in name="id" value="$Think.post.ids"}
id在範圍內
{/in}
2
3
# BETWEEN 和 NOTBETWEEN
可以使用between標簽來判斷變量是否在某個區間範圍內,可以使用:
{between name="id" value="1,10"}
輸出內容1
{/between}
2
3
同樣,也可以使用notbetween標簽來判斷變量不在某個範圍內:
{notbetween name="id" value="1,10"}
輸出內容2
{/notbetween}
2
3
也可以使用else
標簽把兩個用法合並,例如:
{between name="id" value="1,10"}
輸出內容1
{else/}
輸出內容2
{/between}
2
3
4
5
當使用between標簽的時候,value只需要一個區間範圍,也就是只支持兩個值,後面的值無效,例如
{between name="id" value="1,3,10"}
輸出內容1
{/between}
2
3
實際判斷的範圍區間是1~3
,而不是1~10
,也可以支持字符串判斷,例如:
{between name="id" value="A,Z"}
輸出內容1
{/between}
2
3
name
屬性可以直接使用系統變量,例如:
{between name="Think.post.id" value="1,5"}
輸出內容1
{/between}
2
3
value屬性也可以使用變量,例如:
{between name="id" value="$range"}
輸出內容1
{/between}
2
3
變量的值可以是字符串或者數組,還可以支持系統變量。
{between name="id" value="$Think.get.range"}
輸出內容1
{/between}
2
3
# RANGE
也可以直接使用range標簽,替換前面的判斷用法:
{range name="id" value="1,2,3" type="in"}
輸出內容1
{/range}
2
3
其中type
屬性的值可以用in/notin/between/notbetween
,其它屬性的用法和IN
或者BETWEEN
一致。
# PRESENT NOTPRESENT標簽
present標簽用於判斷某個變量是否已經定義,用法:
{present name="name"}
name已經賦值
{/present}
2
3
如果判斷沒有賦值,可以使用:
{notpresent name="name"}
name還沒有賦值
{/notpresent}
2
3
可以把上面兩個標簽合並成為:
{present name="name"}
name已經賦值
{else /}
name還沒有賦值
{/present}
2
3
4
5
present
標簽的name
屬性可以直接使用系統變量,例如:
{present name="Think.get.name"}
$_GET['name']已經賦值
{/present}
2
3
# EMPTY NOTEMPTY 標簽
empty標簽用於判斷某個變量是否為空,用法:
{empty name="name"}
name為空值
{/empty}
2
3
如果判斷沒有賦值,可以使用:
{notempty name="name"}
name不為空
{/notempty}
2
3
以把上面兩個標簽合並成為:
{empty name="name"}
name為空
{else /}
name不為空
{/empty}
2
3
4
5
name
屬性可以直接使用系統變量,例如:
{empty name="Think.get.name"}
$_GET['name']為空值
{/empty}
2
3
# DEFINED 標簽
DEFINED標簽用於判斷某個常量是否有定義,用法如下:
{defined name="NAME"}
NAME常量已經定義
{/defined}
2
3
TIP
name屬性的值要註意嚴格大小寫
如果判斷沒有被定義,可以使用:
{notdefined name="NAME"}
NAME常量未定義
{/notdefined}
2
3
可以把上面兩個標簽合並成為:
{defined name="NAME"}
NAME常量已經定義
{else /}
NAME常量未定義
{/defined}
2
3
4
5
# 標簽嵌套
模板引擎支持標簽的多層嵌套功能,可以對標簽庫的標簽指定可以嵌套。
系統內置的標簽中,volist
、switch
、if
、elseif
、else
、foreach
、compare
(包括所有的比較標簽)、(not
)present
、(not
)empty
、(not
)defined
等標簽都可以嵌套使用。例如:
{volist name="list" id="vo"}
{volist name="vo['sub']" id="sub"}
{$sub.name}
{/volist}
{/volist}
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}
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}
2
3
4
5
# 使用PHP
php代碼可以和標簽在模板文件中混合使用,可以在模板文件裏面書寫任意的PHP語句代碼 ,包括下面兩種方式:
# 使用php標簽
{php}echo 'Hello,world!';{/php}
我們建議需要使用PHP代碼的時候盡量采用php標簽,因為原生的PHP語法可能會被配置禁用而導致解析錯誤。
# 使用原生php代碼
<?php echo 'Hello,world!'; ?>
TIP
註意:php標簽或者php代碼裏面就不能再使用標簽(包括普通標簽和XML標簽)了,因此下面的幾種方式都是無效的:
{php}{eq name='name'value='value'}value{/eq}{/php}
Php標簽裏面使用了eq
標簽,因此無效
{php}if( {$user} != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
php標簽裏面使用了{$user}
普通標簽輸出變量 ,因此無效。
{php}if( $user.name != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
Php標簽裏面使用了$user.name 點語法變量輸出 ,因此無效。
TIP
簡而言之,在PHP標簽裏面不能再使用PHP本身不支持的代碼。
如果設置了tpl_deny_php
參數為true
,就不能在模板中使用原生的PHP
代碼,但是仍然支持PHP
標簽輸出。
# 自定義標簽
ASSIGN標簽 ASSIGN
標簽用於在模板文件中定義變量,用法如下:
{assign name="var" value="123" /}
在運行模板的時候,賦值了一個var
的變量,值是123
。
value
屬性也支持變量,例如:
{assign name="var" value="$val" /}
或者直接把系統變量賦值給var變量,例如:
{assign name="var" value="$Think.get.name" /}
相當於,執行了:$var = $_GET['name'];
DEFINE標簽 DEFINE
標簽用於中模板中定義常量,用法如下:
{define name="MY_DEFINE_NAME" value="3" /}
在運行模板的時候,就會定義一個MY_DEFINE_NAME
的常量。
value
屬性可以支持變量(包括系統變量),例如:
{define name="MY_DEFINE_NAME" value="$name" /}
或者
{define name="MY_DEFINE_NAME" value="$Think.get.name" /}