下面由thinkphp教程欄目給大家介紹解析ThinkPHP5.1自定義標簽的使用,希望對需要的朋友有所幫助!
近來有項目需要用的自定義的標簽,tp使用的是5.1,各位要注意,5.1較5.0在目錄結構和程序上有較大的改動。注意自己的版本。下面進入正題。
一、創建標簽函數文件
在模型目錄下創建目錄 tabLib,在目錄里創建一個Cms.php?
namespace?appcmstagLib; use?thinkDb; use?thinktemplateTagLib; class?Cms?extends?TagLib{ ????protected?$tags?=?[ ????????//標簽定義:?attr?屬性列表,close?是否閉合(0或1,默認1),alias標簽別名?level嵌套層次 ????????'lists'?=>?['attr'?=>?'num,order,sort'], ????]; ????//?當不使用content的時候,閉合標簽沒有效果 ????//?修改過此文件后,需要改動下模板的內容,否則模板有緩存不會執行新的內容。 ????public?function?tagLists($tag,$content){ ????????$cateID?=?$tag['cate_id'];?//欄目ID ????????$num????=?$tag['num'];?//數量 ????????$order??=?input($tag['order']);?//排序方式 ????????$type?=?$cateID; ????????$name?=?$tag['name']; ????????$tableName?=?'table_name'; ????????$parse?=?'<?php $map=[];'; $parse .= '$__LIST__ = Db::name('.$tableName.')->where(["cate_id"=>'.?$cateID?.']) ????????????->limit('.$num.') ????????????->select();??>'; ????????$parse?.=?'{volist?name="__LIST__"?id="'.?$name?.'"}'; ????????$parse?.=?$content; ????????$parse?.=?"{/volist}"; ????????return?$parse; ????}
在開發中遇到疑惑:
1.?上面的tagLists?函數對應 protected $tags中的標簽定義,大小寫要注意,否則是找不到函數的。
立即學習“PHP免費學習筆記(深入)”;
2. $parse?字符中全部為組裝的字符串,該字符串會被TP的模板標簽再解析一次,所以在里面可以使用TP原有的標簽或原生的PHP語句。但是不可以把外面的Array或對象做為參數傳入$param中,要知道他只是一個用來組裝的字符串。請注意 $__LIST__這個變量的使用,要想從數據庫中讀取數據,必須寫完整的PHP代碼,不可以在外面執行完查詢,然后把查詢后的list做為變量傳入。
?二、在模板配置信息中加載此標簽函數
在模塊 cms/config/template.php?中加入一句:?‘taglib_pre_load’ => ‘appcmstagLibCms’,
如果你沒有此文件,可以在根目錄里的config目錄下,復制一份template放到cms/config目錄下。
三、在模板中使用標簽。
??{cms:lists?name="row"?num="10"?cate_id="5"?order="1"} ????????
????{/cms:lists}
name, num ,cate_id?等屬性會作為tagLists的第一個參數 $tags傳入。而{cms:lists}?和 {$/cms:lists}之間的內容,會作為一個完整的字符串$content?傳入 tagLists?的第二個參數。
注意:這里分閉合標簽和非閉合標簽,如果是閉合標簽,則必須在(一)中使用content,如果是非閉合標簽則可以不用。如果你不使用content變量,則閉合的標簽 {/cms:lists}會被原樣輸出,不會進行解析。
暫時有這么多的困惑,關于分頁列表的問題還在研究,研究完了再補充上來。
補充:在tagList中不要對$tag[]數組中獲取到的數據進行數據類型轉換,因為當傳過來的是一個變量時,這個變量不會生效!!所以在這里使用intval($tag[num])是不對的。