DEDECMS 扩展标签和dede自定义标签实现方法
来源:易贤网 阅读:667 次 日期:2014-09-24 11:24:06
温馨提示:易贤网小编为您整理了“DEDECMS 扩展标签和dede自定义标签实现方法”,方便广大网友查阅!

我们需要知道下扩展标签的存放目录及文件名构成,首先,扩展的标签都是存放在/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的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。

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

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

代码如下:

  $revalue = 'Hello Word!';

  $revalue .="

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

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

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

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

更多信息请查看IT技术专栏

更多信息请查看CMS教程
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:易贤网
云南网警报警专用图标