dede列表页如何调用文章内容?

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

这里提供几种常用的方法,从最推荐到最不推荐,并解释其优缺点。

dede列表页调用文章内容
(图片来源网络,侵删)

使用 cn_substr 函数截取内容(最推荐)

这是最标准、最高效的方法,它直接在数据库层面进行操作,性能最好,也最符合织梦的设计思想。

原理: 通过修改织梦的标签,在调用 body)字段时,使用 cn_substr 函数进行截取。

步骤:

  1. 打开你的列表页模板文件,通常是 /templets/你的栏目目录/list_栏目ID.htm
  2. 找到你想要显示文章内容的地方。
  3. 使用以下修改后的标签:
{dede:list pagesize='10'}
    <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
    <!-- 推荐用法:截取body内容的前200个字符,并去掉HTML标签 -->
    <p>[field:body function='cn_substr(Html2Text(@me), 200)'/]...</p>
    <p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
    <hr>
{/dede:list}

标签详解:

dede列表页调用文章内容
(图片来源网络,侵删)
  • [field:body/]:这是调用文章完整内容的标签。
  • function='cn_substr(Html2Text(@me), 200)':这是核心部分,它对 field:body 的值(用 @me 表示)进行函数处理。
    • @me:代表当前字段的原始值,即 [field:body] 的内容。
    • Html2Text(@me):这是一个织梦内置函数,作用是把HTML代码(如 <p>, <br>)转换成纯文本,这一步非常重要,可以防止截断的HTML标签导致页面样式错乱。
    • cn_substr(..., 200):这是织梦的截取字符串函数,它会把 Html2Text 处理后的纯文本内容截取前200个字符,你可以根据需要修改 200 这个数字。
  • 在截取的文本后面加上省略号,是很好的用户体验习惯。

优点:

  • 性能最佳:直接在数据库查询时完成(虽然这里是在PHP里处理,但效率远高于方法三),对服务器压力小。
  • 安全可靠:使用官方函数,兼容性好。
  • 代码简洁:一行代码搞定。

使用自定义宏标记(灵活且高效)

如果你的网站多个列表页都需要显示内容摘要,并且摘要长度可能不同,使用自定义宏标记是最好的选择,它实现了“代码复用”和“参数化”。

步骤:

  1. 在后台创建宏标记

    • 登录DedeCMS后台。
    • 进入 核心 -> 批量维护 -> 宏标记管理
    • 点击 增加新宏标记
    • 宏名称:填写一个你喜欢的名字,artbody
    • 宏类型:选择 标记调用
    • :输入与方法一中的函数调用相同的代码:cn_substr(Html2Text(@me), 200)
    • 备注:可以写上“截取文章内容前200字作为摘要”。
    • 点击 保存
  2. 在列表页模板中使用 创建好宏标记后,在列表页模板中调用就非常方便了。

{dede:list pagesize='10'}
    <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
    <!-- 使用自定义宏标记 -->
    <p>[field:body function='artbody'/]...</p>
    <p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
    <hr>
{/dede:list}

优点:

  • 代码复用:只需定义一次,全站所有列表页都可以调用。
  • 易于维护:如果需要修改摘要长度(比如从200改成300),只需在后台修改宏标记内容即可,无需改动所有模板文件。
  • 性能同方法一:本质上是方法一的封装,性能一样好。

修改PHP源文件(不推荐,应作为最后手段)

这种方法直接修改织梦的核心文件,可以实现“无感”调用,即你仍然使用 [field:body/],但它在列表页会自动截取。但强烈不推荐,因为升级织梦版本时,你的修改会被覆盖。

原理: 修改 include/arc.listview.class.php 文件,在列表查询数据时,对 body 字段进行处理。

步骤:

  1. 备份文件!备份 include/arc.listview.class.php

  2. 用代码编辑器打开该文件。

  3. 搜索 GetSqlList($this->TypeID); 函数,找到下面这段代码(可能在 Select 查询语句附近):

    $this->dsql->SetQuery("Select id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath
    From `dede_arctype` where id='$typeid' ");
  4. 找到生成文章列表的 Select 语句,它通常长这样(在第100多行):

    $this->dsql->SetQuery("Select id,arcrank,click,title,shorttitle,color,writer,
    source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid,
    ismake,channel,description,keywords,mtype,tid
    From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc");
  5. 修改 Select 语句,在 title 后面添加 body 字段,并用 SUBSTRING 函数进行截取。注意不同数据库的语法

    • MySQL 数据库

      // 将原来的 title 后面加上 ,body
      $this->dsql->SetQuery("Select id,arcrank,click,title,body,shorttitle,color,writer,
      source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid,
      ismake,channel,description,keywords,mtype,tid
      From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc");

      这样会获取完整的 body,然后我们再在PHP里处理。

    • 更彻底的修改(不推荐):直接在SQL里截取(MySQL):

      // 在 Select 语句中直接处理
      $this->dsql->SetQuery("Select id,arcrank,click,title,shorttitle,color,writer,
      source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid,
      ismake,channel,description,keywords,mtype,tid,
      LEFT(body, 200) as body  -- 注意:这里只是简单截取,可能包含HTML标签
      From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc");

      这种方法非常不推荐,因为它没有处理HTML标签,容易导致页面错乱。

  6. 更推荐的PHP处理方式:在第5步中,我们只把 body 字段加入查询,然后在文件中找到处理数据的循环(通常在 while($row = $this->dsql->GetArray()) 循环里),对 $row['body'] 进行处理。 找到类似这样的代码:

    while($row = $this->dsql->GetArray()){
        $row['title'] = $row['title']; // ... 其他处理
        // ... 把$row数组赋值给一个总的数组
    }

    在循环内部,对 $row['body'] 进行处理:

    while($row = $this->dsql->GetArray()){
        // ... 其他字段处理
        // 在这里对body进行处理
        $row['body'] = cn_substr(Html2Text($row['body']), 200);
        // ... 把$row数组赋值给一个总的数组
    }

优点:

  • 模板标签最干净,直接使用 [field:body/]

缺点:

  • 破坏性修改:修改了核心文件,织梦升级后会被覆盖,需要重新修改。
  • 维护困难:不熟悉代码的开发者很难找到和修复问题。
  • 风险高:错误修改可能导致整个列表页无法显示。

总结与建议

方法 优点 缺点 推荐度
cn_substr函数 性能好,代码简洁,安全可靠 每个模板里都要写一遍函数 ⭐⭐⭐⭐⭐
自定义宏标记 最佳实践,代码复用,易于维护,性能好 需要后台设置一次 ⭐⭐⭐⭐⭐
修改PHP源文件 模板标签最简洁 破坏性修改,升级会丢失,维护困难,风险高 ⭐☆☆☆☆

最终建议:

  • 如果只是在一个或少数几个列表页使用,直接选择 方法一
  • 如果这个需求会在多个地方使用,或者你希望以后能方便地调整摘要长度,请务必使用 方法二(自定义宏标记),这是最专业、最规范的做法。
-- 展开阅读全文 --
头像
dede登录成功为何无法进入后台?
« 上一篇 昨天
dede如何实现上传文件自动压缩?
下一篇 » 昨天

相关文章

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

目录[+]