DedeCMS从v5.3版本开始就支持本身扩展标签,不外很多新人很罕用谁人对象,简朴的先容下如何编写本身的挪用标签。
我们需要知道下扩展标签的存放目次及文件名组成,首先,扩展的标签都是存放在/include/taglib这个目次,名称都是以"标签名.lib.php"名目,譬喻{dede:channel/}标签对应的是channel.lib.php文件。
我们可以看一个示例标签:demotag.lib.php
if(!defined('DEDEINC')){exit("Request Error!");
}
function lib_demotag(&$ctag,&$refObj){
global $dsql,$envs;
//属性处理惩罚
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = '';
//你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue
//------------------------------------------------------
$revalue = 'Hello Word!';
//------------------------------------------------------
return $revalue;
}
?>
我们登录系统靠山的[模板]-[全局标签测试]中运行{dede:demotag/},显示如下的功效,我们会发明标签起浸染了,输出了我们的内容。
这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数return $revalue;中的$revalue需要是颠末处理惩罚后生成的字符串。
$attlist="row|12,titlelen|24";这个是属性列表,这个颠末函数处理惩罚后会直接生成变量并复制,我们可以测试下,做如下的修改:
这样我们可以看到,这个属性已经被建设变量而且赋值了。接下来我们可以再进一步去修改这个标签。好比说我们需要写一个标签专门来查询文章内容页的谁人相关文章,成果雷同于上面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;
}
?>