Dede自定义全局标签如何创建使用?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文

在 DedeCMS 中,"全局标签"通常指的是那些可以在网站任何地方(包括首页、列表页、内容页、单页甚至外部文件)通过 {dede:标签名} 形式调用的标签,自定义这类标签,主要指的是创建一个自定义的函数,并将其注册到 DedeCMS 的标签解析系统中,使其能够像系统自带的标签一样被调用。

Dede自定义全局标签
(图片来源网络,侵删)

这个过程主要分为两大类:

  1. 创建简单的、纯 PHP 代码的标签:适用于直接执行一些 PHP 逻辑并返回结果的场景。
  2. 创建复杂的、带模板的标签:适用于需要循环输出数据,并且需要一套独立的 HTML 模板来渲染结果的场景(类似 {dede:arclist})。

下面我们以 DedeCMS 5.x / 7.x 版本为例,详细讲解这两种方法。


准备工作:找到核心文件

在进行任何修改之前,请务必备份你的网站文件! 你需要修改的核心文件通常位于 /include/ 目录下:

  • inc_fun_funAdmin.php:用于注册和存放简单标签的函数。
  • taglib目录/include/taglib/,这里存放的是复杂标签的解析类文件。

创建简单的全局标签(纯 PHP 函数)

这种方法适用于那些不需要循环、不需要模板、直接返回一个字符串或变量的标签。

Dede自定义全局标签
(图片来源网络,侵删)

示例:创建一个 {dede:hello_world/} 标签,输出 "Hello, DedeCMS!"

第一步:编写 PHP 函数

  1. 打开文件 /include/inc_fun_funAdmin.php

  2. 在文件末尾,添加以下 PHP 函数:

    /**
     * 自定义全局标签:hello_world
     * 返回一个固定的字符串
     *
     * @return string
     */
    if (!function_exists('HelloWorld'))
    {
        function HelloWorld()
        {
            return "Hello, DedeCMS! This is a custom tag.";
        }
    }

    函数命名规则

    Dede自定义全局标签
    (图片来源网络,侵删)
    • 函数名必须以大写字母开头(HelloWorld),因为在 DedeCMS 内部,标签名会被首字母大写来寻找对应的函数。
    • 函数名不能与已有函数重名。

第二步:注册标签

DedeCMS 的标签解析器会自动在 inc_fun_funAdmin.php 文件中寻找以大写字母开头的函数,并将其注册为标签,只要你按照上面的规则命名函数,这一步是自动完成的,无需额外操作。

第三步:使用标签

你可以在网站的任何模板文件(.htm)中使用这个标签了。

<!DOCTYPE html>
<html>
<head>自定义标签测试</title>
</head>
<body>
    <h1>欢迎使用 DedeCMS</h1>
    <p>下面是调用自定义标签的结果:</p>
    <p>{dede:hello_world/}</p>
</body>
</html>

第四步:更新缓存并测试

  1. 登录 DedeCMS 后台。
  2. 点击顶部菜单的“生成” -> “更新主页HTML” 或 “更新系统缓存”。
  3. 刷新你的前台页面,你应该就能看到 "Hello, DedeCMS! This is a custom tag." 这段文字了。

创建带模板的复杂全局标签(类库方式)

这种方法功能更强大,类似于系统自带的 {dede:arclist}{dede:channelartlist} 等标签,它需要一个 PHP 类来处理逻辑,并且需要一个独立的 HTML 模板文件来渲染输出。

示例:创建一个 {dede:mylist limit='5'} 标签,用于调用指定栏目下的最新文章列表。

第一步:创建标签解析类文件

  1. /include/taglib/ 目录下,创建一个新的 PHP 文件,命名为 mylist.lib.php

    • 文件名规则:标签名.lib.php,这里标签名是 mylist,所以文件名就是 mylist.lib.php
  2. mylist.lib.php 文件中,编写如下代码:

    <?php
    if(!defined('DEDEINC')) exit('Request Error!');
    /**
     * 自定义复杂标签:mylist
     * 功能:调用指定栏目的最新文章列表
     */
    class mylist
    {
        // 属性,用于存放标签的属性,如 limit, typeid 等
        var $dsql;
        var $PlusModel;
        // 构造函数
        function __construct()
        {
            global $dsql;
            $this->dsql = $dsql;
        }
        // 核心解析函数,必须命名为
        function GetList($ctp, $refObj)
        {
            // 1. 获取标签属性
            $typeid = $this->CTags->GetAtt('typeid'); // 获取 typeid 属性
            $limit = $this->CTags->GetAtt('limit'); // 获取 limit 属性,默认为 10
            if(empty($limit)) $limit = 10;
            // 2. 查询数据库
            // 注意:这里只是示例,实际应用中需要更严谨的SQL和安全检查
            $innertext = $this->CTags->GetInnerText(); // 获取标签内的内容(模板)
            $artlist = '';
            // 执行查询
            $query = "SELECT id, title, pubdate FROM `#@__archives` WHERE typeid = '$typeid' ORDER BY id DESC LIMIT 0, $limit";
            $dsql->SetQuery($query);
            $dsql->Execute();
            // 3. 循环处理数据并填充模板
            while($row = $dsql->GetArray())
            {
                // 处理日期格式
                $pubdate = MyDate('Y-m-d H:i:s', $row['pubdate']);
                // 使用 $ctp->Assign() 来替换模板中的变量
                // 模板中的变量名由这里决定,如 [field:title]
                $ctp->Assign('fields', array(
                    'title' => $row['title'],
                    'pubdate' => $pubdate,
                    'arcurl' => GetFileUrl($row['id']) // 获取文章链接
                ));
                // 调用Parse()方法解析内模板,并将结果追加到 $artlist
                $artlist .= $ctp->GetResult();
            }
            // 4. 返回最终结果
            return $artlist;
        }
    }
    ?>

代码解释

  • class mylist:类名必须和标签名、文件名保持一致(不区分大小写,但建议保持一致)。
  • GetList($ctp, $refObj):这是复杂标签的核心解析函数,名称必须是 GetList
  • $this->CTags->GetAtt('属性名'):用于获取标签的属性值,如 {dede:mylist typeid='2' limit='5'} 中的 typeidlimit
  • $this->CTags->GetInnerText():获取标签对之间的内容,也就是你的HTML模板。
  • $ctp->Assign('fields', array(...)):将数据库查询到的数据赋值给模板变量。'fields' 是一个固定的前缀,模板中的变量通过 [field:变量名] 来调用。
  • $ctp->GetResult():解析 $innertext 中的模板,并将已赋值的变量替换进去。

第二步:在模板中使用标签

现在你可以在模板中这样使用它:

<h2>最新文章列表(来自自定义标签)</h2>
<ul>
    {dede:mylist typeid='2' limit='5'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span class="date">发布时间:[field:pubdate/]</span>
    </li>
    {/dede:mylist}
</ul>
  • typeid='2':指定调用栏目ID为2下的文章。
  • limit='5':限制调用5条。
  • <li>...</li> 之间的所有内容就是 $innertext,也就是你的模板。
  • [field:arcurl/][field:title/][field:pubdate/] 就是在 PHP 类中 $ctp->Assign 赋值的变量。

第三步:更新缓存并测试

  1. 登录 DedeCMS 后台。
  2. 点击“生成” -> “更新系统缓存”。
  3. 刷新前台页面,你应该就能看到栏目ID为2的最新5篇文章列表了。

总结与注意事项

特性 简单标签 (方法一) 复杂标签 (方法二)
适用场景 返回单个值、简单计算、直接输出HTML片段 循环输出数据、需要独立模板渲染
核心文件 /include/inc_fun_funAdmin.php /include/taglib/标签名.lib.php
实现方式 编写一个独立的 PHP 函数 编写一个包含 GetList 方法的 PHP 类
模板 无,直接在调用位置输出结果 标签对 {dede:标签名}...模板...{/dede:标签名} 之间的内容
灵活性 较低 非常高,可以处理复杂逻辑和数据库交互
变量调用 不适用 通过 [field:变量名/] 调用

重要提示

  1. 安全第一:在方法二中,直接拼接 SQL 语句(如 $query = "SELECT ... WHERE typeid = '$typeid'")存在巨大的 SQL 注入风险。在实际项目中,务必使用 DedeCMS 提供的安全查询方法$dsql->SelectSql() 或预处理语句。
  2. 性能考虑:自定义标签会执行 PHP 代码和数据库查询,请确保代码效率,避免在首页等高频率访问的页面使用过于复杂的标签。
  3. 缓存:修改标签后,一定要在后台更新系统缓存,否则前台可能看不到效果。
  4. 版本差异:DedeCMS 不同版本(如 5.7, 5.8, 7.x)在底层实现上可能略有差异,但核心原理基本一致,如果遇到问题,可以查阅对应版本的官方文档或社区。

通过以上两种方法,你就可以根据自己的需求,灵活地扩展 DedeCMS 的功能,打造出更符合网站需求的个性化标签。

-- 展开阅读全文 --
头像
C语言如何用FindWindow函数查找窗口?
« 上一篇 03-01
tokenizer C语言
下一篇 » 03-01

相关文章

取消
微信二维码
支付宝二维码

目录[+]