我們需要知道下擴展標簽的存放目錄及文件名構成,首先,擴展的標簽都是存放在/include/taglib這個目錄,名稱都是以“標簽名.lib.php”格式,例如{dede:channel/}標簽對應的是channel.lib.php文件。
我們可以看一個示例標簽:demotag.lib.php
這樣我們可以看到,這個屬性已經被創建變量并且賦值了。
接下來我們可以再進一步去修改這個標簽。
比如說我們需要寫一個標簽專門來查詢文章內容頁的那個相關文章,功能類似于上面sql標簽中的那個sql,只是這里我們將其分裝為一個標簽。
我們可以新建一個標簽,例如叫writerarc,那我們就需要創建一個writerarc.lib.php,然后模仿demotag編寫函數,注意需要修改為
function lib_writerarc(&$ctag,&$refObj)
接下來我們就可以編寫查詢語句及對底層模板處理的相關函數了
$revalue = ”;
$innertext = $ctag->GetInnerText();
$ctp = new DedeTagParse();
$ctp->SetNameSpace(‘field’, ‘[', ']‘);
$sql = "SELECT * FROM dede_archives WHERE writer=’{$refObj->Fields['writer']}’ limit 0, $row";
$innertext這個是用來獲取標簽的底層模板的,$ctp創建用于處理底層模板中的變量,并處理進行替換。我們根據獲取的屬性編寫我們的sql語句,這里我們使用limit 0, $row,這樣就可以根據$row來確定查詢的內容數目。
當然我們可以獲取更多的屬性以便我們這個標簽更強大,例如我們可以增加類似于arclist中的相關屬性,并在函數中進行處理,不過這個需要有一定的PHP基礎。
接下來我們通過執行查詢對sql及輸出變量進行處理:
$dsql->Execute(‘me’,$sql);
while($rs = $dsql->GetArray(‘me’))
{
//根據屬性處理查詢變量
$rs['title'] = cn_substr($rs['title'], $titlelen);
//獲取底層模板
$ctp->LoadSource($innertext);
foreach($ctp->CTags as $tagid=>$ctag) {
if(!empty($rs[strtolower($ctag->GetName())])) {
$ctp->Assign($tagid,$rs[$ctag->GetName()]);
}
}
//根據底層模板及查詢變量得到處理結果
$revalue .= $ctp->GetResult();
}
這樣我們就將查詢出來的結果同底層模板中出現的相關變量進行替換,然后生成輸出字符串,將所有的字符串信息存儲到$revalue中。
最后返回這個值return $revalue;
整個文件內容如下:
if(!defined(‘DEDEINC’))
{
exit("Request Error!");
}
function lib_writerarc(&$ctag,&$refObj)
{
global $dsql,$envs;
//屬性處理
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = ”;
$innertext = $ctag->GetInnerText();
$ctp = new DedeTagParse();
$ctp->SetNameSpace(‘field’, ‘[', ']‘);
$sql = "SELECT * FROM dede_archives WHERE writer=’{$refObj->Fields['writer']}’ limit 0, $row";
$dsql->Execute(‘me’,$sql);
while($rs = $dsql->GetArray(‘me’))
{
//根據屬性處理查詢變量
$rs['title'] = cn_substr($rs['title'], $titlelen);
//獲取底層模板
$ctp->LoadSource($innertext);
foreach($ctp->CTags as $tagid=>$ctag) {
if(!empty($rs[strtolower($ctag->GetName())])) {
$ctp->Assign($tagid,$rs[$ctag->GetName()]);
}
}
//根據底層模板及查詢變量得到處理結果
$revalue .= $ctp->GetResult();
}
return $revalue;
}
?>
接下來我們來測試我們這個標簽,我們修改article_article.htm模板,在里面加入以下的標簽代碼:
{dede:writerarc row=’10′ titlelen=’6′}
[field:title/]
{/dede:writerarc}
通過動態瀏覽頁面進行查看調試http://www.dedecms.com/plus/view.php?aid=3
至此我們完成了標簽的編寫,這里面主要涉及到PHP、MySQL的很多知識,需要有一定相關方面的基礎才能夠編寫標簽了,當然這里只是一個簡單的標簽開發例子,還有許多的東西可以去開發。