解决方案
中实现系统标签的效果,主要有以下三种方法,从推荐到备选排列:

使用“自定义字段” + “页面内容”(最推荐、最灵活)
这是最标准、最灵活、最符合DedeCMS设计思路的方法,它利用了DedeCMS内置的“页面内容”字段,这个字段天生就是为了存放复杂HTML和模板标签而设计的。
操作步骤:
-
添加自定义字段:
- 登录DedeCMS后台,进入“核心” -> “内容模型管理”。
- 点击你想要修改的内容模型(文章模型”)的“管理字段”。
- 点击“添加新字段”。
- 字段名:输入一个英文名,
my_content。 - 字段别名:输入一个中文别名,我的自定义内容”。
- 字段类型:选择“编辑器”(这是关键!)。
- 其他选项(如是否为必填项)根据需要设置。
- 保存。
-
在后台编辑内容:
(图片来源网络,侵删)-
发布或编辑一篇该模型的文章。
-
你会发现新添加的“我的自定义内容”字段是一个富文本编辑器。
-
在这个编辑器里,你可以直接输入或粘贴DedeCMS的系统标签,
这里是一些固定文本。 {dede:arclist row='5' titlelen='24'} - [field:title/] {/dede:arclist} 这是更多内容。
-
-
在模板中调用:
(图片来源网络,侵删)- 在你的文章模板文件(如
article_article.htm)中,像调用普通字段一样调用它。 - 注意: 由于这个字段里包含了需要解析的标签,你必须使用
{dede:field}标签来调用,并指定function='Html2Text(@me)'或类似的函数来确保内容被正确解析。
模板调用代码示例:
<article> <h1>{dede:field.title/}</h1> <!-- 调用并解析自定义内容字段 --> <div class="my-custom-content"> {dede:field name='my_content' function='Html2Text(@me)'/} </div> <!-- 文章的正文内容(原始的body字段) --> <div class="article-body"> {dede:field.body/} </div> </article> - 在你的文章模板文件(如
优点:
- 功能强大: 可以使用所有DedeCMS支持的标签。
- 后台可视化: 在后台编辑时就能看到效果(如果预览功能支持)。
- 维护方便: 内容和结构分离,编辑者可以在后台直接修改。
使用“function”对字段值进行二次开发(适用于高级用户)
如果你不能或不想添加新字段,需要对一个已经存在的文本型字段(如 keywords 或一个普通文本字段)中的内容进行解析,可以使用PHP函数。
原理:
在模板中调用字段时,通过 function 属性调用一个自定义的PHP函数,这个函数会获取字段的原始值,在其中查找并替换掉DedeCMS标签,然后将处理后的HTML代码返回。
操作步骤:
-
编写PHP函数: 在
include/extend.func.php文件中(如果没有就创建一个)添加如下函数:/** * 解析字段内容中的DedeCMS标签 * @param string $content 包含待解析标签的字符串 * @return string 解析后的HTML字符串 */ function parse_field_tags($content) { // 如果内容为空,则直接返回 if (empty($content)) { return $content; } // 创建一个临时的、唯一的模板文件名 $tmpfile = dirname(__FILE__) . '/tmp_' . md5($content) . '.htm'; // 将内容写入临时文件 file_put_contents($tmpfile, $content); // 使用DedeCMS的库来解析这个临时文件 // 这里需要引入DedeCMS的核心解析类 require_once(DEDEINC . '/arc.partview.class.php'); $pv = new PartView(); $html = $pv->GetTemplet($tmpfile); // 删除临时文件 @unlink($tmpfile); return $html; } -
在模板中调用: 假设你有一个名为
my_field的字段,里面写入了{dede:arclist row='3'}...{/dede:arclist}。在模板文件中,这样调用:
<div class="dynamic-content"> {dede:field name='my_field' function='parse_field_tags(@me)'/} </div>
优点:
- 不需要修改数据库结构。
- 非常灵活,可以处理任何字段。
缺点:
- 性能开销大: 每次调用都需要创建临时文件、加载解析类,对服务器性能有一定影响,不适合在列表页等高频调用的地方使用。
- 实现复杂: 需要一定的PHP编程能力。
使用“灵动标签” {dede:php}(不推荐,有风险)
这是一种“绕过”机制的方法,直接在模板中执行PHP代码,虽然可以实现,但极度不推荐,因为它破坏了模板与逻辑分离的原则,带来安全风险。
操作步骤:
-
确保你的模板开启了PHP支持: 在后台“系统” -> “系统基本参数” -> “核心设置”中,找到“模板引擎类型”,选择“php”。
-
在模板中使用
{dede:php}<div class="risky-content"> {dede:php} // 获取当前文章的 my_field 字段值 $fieldValue = $this->Fields['my_field']; // 创建临时文件并解析(和方法二类似) $tmpfile = dirname(__FILE__) . '/tmp_risky_' . md5($fieldValue) . '.htm'; file_put_contents($tmpfile, $fieldValue); require_once(DEDEINC . '/arc.partview.class.php'); $pv = new PartView(); $html = $pv->GetTemplet($tmpfile); @unlink($tmpfile); // 输出结果 echo $html; {/dede:php} </div>
缺点:
- 安全风险高: 任何能编辑模板的人都能执行任意PHP代码,极易被黑客利用进行getshell攻击。
- 维护困难: PHP代码混在HTML中,可读性差,不易维护。
- 性能差: 同样存在性能问题。
总结与对比
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 自定义字段(编辑器) | 功能强大、灵活、安全、符合规范、后台可视化 | 需要添加新字段,占用数据库空间 | 绝大多数情况下的首选,特别是需要管理员在后台编辑复杂内容时。 |
| function二次开发 | 无需修改数据库,非常灵活 | 实现复杂,性能开销大 | 适用于对现有字段进行特殊处理,且调用频率不高的场景。 |
灵动标签{dede:php} |
灵活性“极高” | 安全风险极高、破坏模板结构、难维护、性能差 | 强烈不推荐,仅在紧急修复或个人测试项目等极端情况下使用。 |
最终建议: 除非有特殊且无法克服的困难,否则请优先选择方法一,这是DedeCMS官方设计的、最稳定、最安全、最强大的解决方案。
