dede扩展标签及自定义标签

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/},
显示如下的结果:

,我们会发现标签起作用了,输出了我们的内容。

至此我们完成了标签的编写,这里面主要涉及到
PHP

MySQL
的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。
8_090929100606_1

这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数
return $revalue;
中的
$revalue
需要是经过处理后生成的字符串。

$attlist="row|12,titlelen|24";
这个是属性列表,这个经过函数处理后会直接生成变量并复制,我们可以测试下,做如下的修改:

$revalue = 'Hello Word!';

$revalue .="

Row:".$row.";TitleLen:".$titlelen;
8_090929100830_1

这样我们可以看到,这个属性已经被创建变量并且赋值了。

接下来我们可以再进一步去修改这个标签。

比如说我们需要写一个标签专门来查询文章内容页的那个相关文章,功能类似于上面
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}

版权声明:
作者:王金阁
链接:https://www.nnbbxx.net/post-6987.html
来源:王金阁博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>