Appearance
DedeCMS標簽擴展 ?
定義標簽 ?
在解析式模板引擎中我們需要定義全局標簽,在上面的文檔說(shuō)明中已經(jīng)知道在系統根目錄下 /include/taglib
中進(jìn)行擴展,標簽的文件名應該是:標簽.lib.php
,例如 arclist
所對應的標簽名稱(chēng)則為:arclist.lib.php
。
我們創(chuàng )建一個(gè)測試的標簽 {dede:test name='dedecms'/}
,那就需要創(chuàng )建一個(gè)名為 test.lib.php
的文件。
標簽文件內容結構 ?
標簽內容的文件結構如下,為一個(gè)函數
php
<?php
if(!defined('DEDEINC')) exit("Request Error!");
function lib_test(&$ctag,&$refObj)
{
global $dsql,$envs;
//屬性處理
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = '';
//你需編寫(xiě)的代碼,不能用echo之類(lèi)語(yǔ)法,把最終返回值傳給$revalue
//------------------------------------------------------
$revalue = 'Hello Word!';
//------------------------------------------------------
return $revalue;
}
?>
這里 function lib_test(&$ctag,&$refObj)
就是我們標簽的擴展函數,所有標簽生成的內容都是由這個(gè)函數解析后獲得的。
屬性處理 ?
函數中 $attlist="row|12,titlelen|24"
為系統默認屬性的參數,例如我們上面 test 標簽需要一個(gè)默認的屬性 name
,并且 name
為空,則需要更改為:
php
$attlist="name|"
這里符號 ,
用來(lái)隔開(kāi)各個(gè)屬性,符號 |
用來(lái)分隔變量的名稱(chēng)和值,這里 name|
則代表默認參數 name
為空。
我們在使用參數的時(shí)候,直接使用 $name
就可以在函數中進(jìn)行調用了,例如:
php
function lib_test(&$ctag,&$refObj)
{
global $dsql,$envs;
//屬性處理
$attlist="name|";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = '我的名字:'.$name;
return $revalue;
}
我們在系統后臺標簽測試器中進(jìn)行測試:
底層模板處理 ?
一般的標簽會(huì )涉及到底層模板,例如:arclist
、channel
等,我們來(lái)擴展下我們上面標簽的功能:
html
{dede:test name='dedecms'/}
我的名字叫:[field:name/]
{dede:test}
這里 我的名字叫:[field:name/]
則為我們要處理的底層模板,[field:name/]
為我們標簽屬性中的 name
。
這里我們需要了解 lib_test(&$ctag,&$refObj)
函數中 $ctag
參數,這個(gè)參數就是我們解析式模板引擎獲取的當前標簽內容,其中這個(gè)對象下有一個(gè) GetInnerText()
方法能夠獲取當前標簽的底層模板。
php
<?php
if(!defined('DEDEINC')) exit("Request Error!");
function lib_test(&$ctag,&$refObj)
{
global $dsql,$envs;
//屬性處理
$attlist="name|";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
// 獲取底層模板
$innertext= $ctag->GetInnerText();
// 對標簽進(jìn)行解析
$revalue = str_replace("[field:name/]", $name, $innertext);
return $revalue;
}
?>
這樣我們就完成了一個(gè)簡(jiǎn)單的對底層模板解析的處理。
標簽其他一些開(kāi)發(fā)技巧可參考 /include/taglib
其他標簽文件。