dede调用指定文章body

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

使用 {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代码都加载进来,这会:

  1. 严重拖慢页面加载速度
  2. 破坏页面布局,因为文章正文里的样式(如<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>

代码解释:

  1. global $dsql;: 获取DedeCMS的数据库操作对象。
  2. $aid = 1;: 这是你需要修改的地方,设置为你想调用的文章ID。
  3. GetOne("SELECT ..."): 执行一条SQL查询,并返回第一条结果。
    • #@__archives: 是DedeCMS主表,存储文章的基本信息(标题、ID、发布时间等)。
    • #@__addonarticle: 是DedeCMS文章附加表,存储文章的详细内容(body、来源、作者等)。
  4. {$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知识。
  • 缺点:
    1. 安全性: 直接在模板里写SQL,如果$aid变量来自用户输入,可能会有SQL注入风险。务必确保传入的ID是硬编码或经过严格验证的
    2. 灵活性: 不方便进行复杂的PHP后处理(如循环、判断、调用其他函数)。

总结与推荐

方法 优点 缺点 适用场景
{dede:field.body} 语法最简单 性能极差,易破坏布局,不推荐 仅在文章详情页article_article.htm)内使用,因为详情页本身就是显示正文的。
GetOneArchive (PHP) 灵活、高效、强大任意处理 需要少量PHP知识 强烈推荐,适用于首页、列表页、栏目页等任何需要调用指定文章正文并进行处理的场景。
{dede:sql} 代码简洁,无需PHP 安全性风险,灵活性差 简单、直接的查询,且ID是固定不变的情况。

最终建议:

对于99%的需求,请使用 方法二(GetOneArchive函数),它既保证了页面的性能,又提供了无与伦比的灵活性,是DedeCMS二次开发中最核心、最实用的技巧之一。

-- 展开阅读全文 --
头像
Error C1083错误,如何解决C语言编译失败?
« 上一篇 01-28
c语言之父1001c语言之父
下一篇 » 01-28

相关文章

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

目录[+]