開發模板
想要書寫一個主題,首先在template錄創建一個 theme_tpl 目錄作爲我們自定義的模板目錄,接着創建一個 html文件夾 用來存放所有的html文件
└─ template
└─ `theme_tpl`
├─ css
├─ js
└─ html詳細可參考 模板結構 來構建你的模板結構,這裏知識點主要是開發技巧,不做詳細的構建步驟介紹,開發任何網站模板是要具備一定 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>#使用標籤
蘋果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)); ?>如果前面輸出的變量在後面定義的函數的第一個參數,則可以直接使用:
{$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)}
變量輸出使用的函數可以支持內置的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>
#視頻、文章、專題點擊量顯示 通用
總點擊量:
<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>
- 訪問頁面觸發定時任務,建議放到首頁底部; 由於入口文件名可變,默認是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>
- 獲取用戶記錄日誌,比如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>
#使用默認值
我們可以給變量輸出提供默認值,例如:
{$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'])} //正確的
#三元運算
模板可以支持三元運算符,例如:
{$status? '正常' : '錯誤'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
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>
然後我們在子模板(其實是當前操作的入口模板)中使用繼承:
{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}
上例中,我們可以看到在子模板中使用了extend標籤來繼承了base模板。 在子模板中,可以對基礎模板中的區塊進行重載定義,如果沒有重新定義的話,則表示沿用基礎模板中的區塊定義,如果定義了一個空的區塊,則表示刪除基礎模板中的該區塊內容。 上面的例子,我們就把left區塊的內容刪除了,其他的區塊都進行了重載。而
{block name="footer"}
{__block__}@大圖模板datll.com 版權所有
{/block}
這一區塊中有{_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>
導航部分將是無效的,不會顯示在模板中。 模板可以多級繼承,比如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}
當 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}
當vo對象的屬性等於5就輸出
{eq name="vo:vod_name" value="5"}
{$vo.vod_name}
{/eq}
當$vo['vod_name']等於5就輸出
{eq name="vo['vod_name']" value="5"}
{$vo.name}
{/eq}
而且還可以支持對變量使用函數 當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}
使用方法如下:
{switch name="User.level"}
{case value="1"}value1{/case}
{case value="2"}value2{/case}
{default /}default
{/switch}
其中name屬性可以使用函數以及系統變量,例如:
{switch name="Think.get.userId|abs"}
{case value="1"}admin{/case}
{default /}default
{/switch}
對於case的value屬性可以支持多個條件的判斷,使用”|”進行分割,例如:
{switch name="Think.get.type"}
{case value="gif|png|jpg"}圖像格式{/case}
{default /}其他格式
{/switch}
表示如果$_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}
也可以對case的value屬性使用變量,例如:
{switch name="User.userId"}
{case value="$adminId"}admin{/case}
{case value="$memberId"}member{/case}
{default /}default
{/switch}
使用變量方式的情況下,不再支持多個條件的同時判斷。
簡潔的用法
{switch $User.userId}
{case $adminId}admin{/case}
{case $memberId}member{/case}
{/switch}
#IF標籤
用法示例:
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
除此之外,我們可以在condition屬性裏面使用php代碼,例如:
{if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP
{else /} other Framework
{/if}
condition屬性可以支持點語法和對象語法,例如: 自動判斷user變量是數組還是對象
{if condition="$user.name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
或者知道user變量是對象
{if condition="$user:name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
由於if標籤的condition屬性裏面基本上使用的是php語法,儘可能使用判斷標籤和Switch標籤會更加簡潔,原則上來說,能夠用switch和比較標籤解決的儘量不用if標籤完成。因爲switch和比較標籤可以使用變量調節器和系統變量。如果某些特殊的要求下面,IF標籤仍然無法滿足要求的話,可以使用原生php代碼或者PHP標籤來直接書寫代碼。 簡潔的用法
{if condition="表達式"}
{if (表達式)}
{if 表達式}
這三種寫法結果是一樣的
#範圍判斷
範圍判斷標籤包括in notin between notbetween四個標籤,都用於判斷變量是否中某個範圍。
#IN和NOTIN
用法: 假設我們中控制器中給id賦值爲1:
$id = 1;
$this->assign('id',$id);
我們可以使用in標籤來判斷模板變量是否在某個範圍內,例如:
{in name="id" value="1,2,3"}
id在範圍內
{/in}
最後會輸出:id在範圍內。
如果判斷不在某個範圍內,可以使用notin標籤:
{notin name="id" value="1,2,3"}
id不在範圍內
{/notin}
最後會輸出:id不在範圍內。 可以把上面兩個標籤合併成爲:
{in name="id" value="1,2,3"}
id在範圍內
{else/}
id不在範圍內
{/in}
name屬性還可以支持直接判斷系統變量,例如:
{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在範圍內
{/in}更多的系統變量用法可以參考系統變量部分。
value屬性也可以使用變量,例如:
{in name="id" value="$range"}
id在範圍內
{/in}
$range變量可以是數組,也可以是以逗號分隔的字符串。 value屬性還可以使用系統變量,例如:
{in name="id" value="$Think.post.ids"}
id在範圍內
{/in}
#BETWEEN 和 NOTBETWEEN
可以使用between標籤來判斷變量是否在某個區間範圍內,可以使用:
{between name="id" value="1,10"}
輸出內容1
{/between}
同樣,也可以使用notbetween標籤來判斷變量不在某個範圍內:
{notbetween name="id" value="1,10"}
輸出內容2
{/notbetween}
也可以使用else標籤把兩個用法合併,例如:
{between name="id" value="1,10"}
輸出內容1
{else/}
輸出內容2
{/between}
當使用between標籤的時候,value只需要一個區間範圍,也就是隻支持兩個值,後面的值無效,例如
{between name="id" value="1,3,10"}
輸出內容1
{/between}
實際判斷的範圍區間是1~3,而不是1~10,也可以支持字符串判斷,例如:
{between name="id" value="A,Z"}
輸出內容1
{/between}
name屬性可以直接使用系統變量,例如:
{between name="Think.post.id" value="1,5"}
輸出內容1
{/between}
value屬性也可以使用變量,例如:
{between name="id" value="$range"}
輸出內容1
{/between}
變量的值可以是字符串或者數組,還可以支持系統變量。
{between name="id" value="$Think.get.range"}
輸出內容1
{/between}
#RANGE
也可以直接使用range標籤,替換前面的判斷用法:
{range name="id" value="1,2,3" type="in"}
輸出內容1
{/range}
其中type屬性的值可以用in/notin/between/notbetween,其它屬性的用法和IN或者BETWEEN一致。
#PRESENT NOTPRESENT標籤
present標籤用於判斷某個變量是否已經定義,用法:
{present name="name"}
name已經賦值
{/present}
如果判斷沒有賦值,可以使用:
{notpresent name="name"}
name還沒有賦值
{/notpresent}
可以把上面兩個標籤合併成爲:
{present name="name"}
name已經賦值
{else /}
name還沒有賦值
{/present}
present標籤的name屬性可以直接使用系統變量,例如:
{present name="Think.get.name"}
$_GET['name']已經賦值
{/present}
#EMPTY NOTEMPTY 標籤
empty標籤用於判斷某個變量是否爲空,用法:
{empty name="name"}
name爲空值
{/empty}
如果判斷沒有賦值,可以使用:
{notempty name="name"}
name不爲空
{/notempty}
以把上面兩個標籤合併成爲:
{empty name="name"}
name爲空
{else /}
name不爲空
{/empty}
name屬性可以直接使用系統變量,例如:
{empty name="Think.get.name"}
$_GET['name']爲空值
{/empty}
#DEFINED 標籤
DEFINED標籤用於判斷某個常量是否有定義,用法如下:
{defined name="NAME"}
NAME常量已經定義
{/defined}name屬性的值要注意嚴格大小寫
如果判斷沒有被定義,可以使用:
{notdefined name="NAME"}
NAME常量未定義
{/notdefined}
可以把上面兩個標籤合併成爲:
{defined name="NAME"}
NAME常量已經定義
{else /}
NAME常量未定義
{/defined}
#標籤嵌套
模板引擎支持標籤的多層嵌套功能,可以對標籤庫的標籤指定可以嵌套。
系統內置的標籤中,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}
- 嵌套循環外層分類內部視頻或文章,重點在於外部和內部標籤各自設置 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}
- 嵌套循環一級和二級分類數據
{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}
#使用PHP
php代碼可以和標籤在模板文件中混合使用,可以在模板文件裏面書寫任意的PHP語句代碼 ,包括下面兩種方式:
#使用php標籤
{php}echo 'Hello,world!';{/php}
我們建議需要使用PHP代碼的時候儘量採用php標籤,因爲原生的PHP語法可能會被配置禁用而導致解析錯誤。
#使用原生php代碼
<?php echo 'Hello,world!'; ?>
注意: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 點語法變量輸出 ,因此無效。
簡而言之,在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" /}