使用 {dede:field.body} 标签(最直接,但需注意性能)
这是最直接的方法,适用于在文章列表页、首页等地方,直接显示某篇文章的完整正文。
基本用法
{dede:arclist idlist='1'}
<h2>{dede:field.title/}</h2>
<div class="article-content">
{dede:field.body/}
</div>
{/dede:arclist}
代码解释:
{dede:arclist idlist='1'}:arclist是文章列表标签,idlist='1'表示只调用ID为1的文章,你可以用英文逗号隔开,指定多个文章ID,idlist='1,5,10'。{dede:field.body/}: 在arclist标签内部,field就是指当前文章的字段,body就是文章正文内容。
⚠️ 重要提醒(性能问题)
这种方法有一个致命的缺点:{dede:field.body}会调用文章的完整正文内容,包括里面的所有图片、代码、样式等。
如果你在首页或者其他列表页使用这个标签,它会将整篇文章的HTML代码都加载进来,这会:
- 严重拖慢页面加载速度。
- 破坏页面布局,因为文章正文里的样式(如
<p>、<div>等)可能会与列表页的样式冲突。
强烈建议不要在列表页或首页使用 {dede:field.body} 来显示完整正文。
使用 GetOneArchive 函数(推荐,灵活且高效)
这是最推荐、最常用的方法,它通过PHP代码来获取文章数据,然后我们可以对数据进行处理,比如截取摘要、去除图片等,非常灵活。
基本用法
{dede:php}
// 1. 引入全局对象
global $dsql;
// 2. 指定你要调用的文章ID
$aid = 1;
// 3. 执行SQL查询,获取文章的所有信息
$arcRow = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE id = {$aid}");
// 4. 根据文章ID获取附加表(body字段在附加表里)的内容
$bodyRow = $dsql->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = {$aid}");
// 5. 将body内容赋值给一个变量,方便在模板中调用
$body = $bodyRow['body'];
// 6. 输出正文(可以在这里进行处理,见下面的进阶用法)
// echo $body;
{/dede:php}
<!-- 在模板的任意位置使用变量 -->
<div class="custom-article-body">
{$body}
</div>
代码解释:
global $dsql;: 获取DedeCMS的数据库操作对象。$aid = 1;: 这是你需要修改的地方,设置为你想调用的文章ID。GetOne("SELECT ..."): 执行一条SQL查询,并返回第一条结果。#@__archives: 是DedeCMS主表,存储文章的基本信息(标题、ID、发布时间等)。#@__addonarticle: 是DedeCMS文章附加表,存储文章的详细内容(body、来源、作者等)。
{$body}: 在PHP代码块外,可以直接使用Dede模板的变量输出语法来显示我们定义的$body变量。
GetOneArchive 进阶用法(处理body内容)
方法二的强大之处在于,你可以在PHP代码中对$body进行各种处理,然后再输出。
示例1:只显示正文的前200个字符(去除HTML标签)
{dede:php}
global $dsql;
$aid = 1;
$bodyRow = $dsql->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = {$aid}");
$body = $bodyRow['body'];
// 去除HTML标签,并截取前200个字符
$shortBody = cn_substr(strip_tags($body), 200);
{/dede:php}
<div class="article-summary">
{$shortBody}...
</div>
strip_tags(): PHP函数,用于去除字符串中的HTML和PHP标签。cn_substr(): DedeCMS自带的截取字符串函数,比PHP自带的substr()更强大,支持中文截取,不会出现乱码。
示例2:移除正文中的第一张图片(常见需求)
{dede:php}
global $dsql;
$aid = 1;
$bodyRow = $dsql->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = {$aid}");
$body = $bodyRow['body'];
// 使用正则表达式移除第一张图片及其周围的空白
$body = preg_replace('/[\s\S]*?<img.*?src=[\'"]([^\'"]+)[\'"][^>]*?>/', '', $body, 1);
{/dede:php}
<div class="article-body-without-first-img">
{$body}
</div>
preg_replace(): PHP正则表达式替换函数,这里的正则表达式会匹配从开头到第一张<img>标签结束的所有内容,并将其替换为空,从而实现移除第一张图片的目的。
使用自定义SQL标签(简洁,但灵活性稍差)
如果你不想写PHP代码,也可以直接在模板里使用{dede:sql}标签执行SQL查询。
{dede:sql sql="SELECT body FROM `#@__addonarticle` WHERE aid = 1"}
<div class="article-content">
[field:body/]
</div>
{/dede:sql}
代码解释:
{dede:sql sql="..."}: 执行自定义的SQL语句。[field:body/]: 在sql标签内部,使用[field:字段名/]来输出查询结果。
优缺点对比:
- 优点: 代码简洁,无需PHP知识。
- 缺点:
- 安全性: 直接在模板里写SQL,如果
$aid变量来自用户输入,可能会有SQL注入风险。务必确保传入的ID是硬编码或经过严格验证的。 - 灵活性: 不方便进行复杂的PHP后处理(如循环、判断、调用其他函数)。
- 安全性: 直接在模板里写SQL,如果
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:field.body} |
语法最简单 | 性能极差,易破坏布局,不推荐 | 仅在文章详情页(article_article.htm)内使用,因为详情页本身就是显示正文的。 |
GetOneArchive (PHP) |
灵活、高效、强大任意处理 | 需要少量PHP知识 | 强烈推荐,适用于首页、列表页、栏目页等任何需要调用指定文章正文并进行处理的场景。 |
{dede:sql} |
代码简洁,无需PHP | 安全性风险,灵活性差 | 简单、直接的查询,且ID是固定不变的情况。 |
最终建议:
对于99%的需求,请使用 方法二(GetOneArchive函数),它既保证了页面的性能,又提供了无与伦比的灵活性,是DedeCMS二次开发中最核心、最实用的技巧之一。
