[织梦CMS教程] dede扩展标签及自定义标签

[复制链接]
查看1587 | 回复8 | 2020-3-2 18:15:06 | 显示全部楼层 |阅读模式
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 的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。

  这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数 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}从0基础开始学习织梦dedecms建站,分享全套的织梦dedecms网站搭建教程、织梦安装使用教程。 汇聚了最全、最新的织梦cms建站教程。包含dedecms建站、仿站教程;dedecms系统使用常见问题;主题插件推荐下载等!欢迎学习!
回复

使用道具 举报

不好吃荤漳 | 2021-3-16 16:23:05 | 显示全部楼层
感谢悟空源码分享精品资源!
回复

使用道具 举报

是鹅好甜 | 2021-3-27 22:30:14 | 显示全部楼层
谢谢楼主分享的资源,爱了~~~
回复

使用道具 举报

大头226 | 2022-3-26 21:09:57 | 显示全部楼层
我是来白嫖悟空源码的积分的!!!!!
回复

使用道具 举报

123457875 | 2022-5-7 07:38:19 | 显示全部楼层
我是来白嫖资源的!
回复

使用道具 举报

嫣冉 | 2023-1-25 04:15:46 | 显示全部楼层
找了很多地方都不能下载,终于在悟空源码找到了
回复

使用道具 举报

雍不言弃 | 2024-2-25 21:44:58 | 显示全部楼层
没积分哈,谁来帮帮我啊
回复

使用道具 举报

核桃脆 | 2024-5-27 05:31:32 | 显示全部楼层
5kym.cn这个站资源太全了
回复

使用道具 举报

我是一个梦蛋 | 2024-6-24 19:05:51 | 显示全部楼层
厉害了悟空源码,这么多资源
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则