使用 arc.listview.class.php 文件(推荐,最常用)
这是最标准、最推荐的方法,通过修改核心文件,可以在列表页循环中像调用普通字段一样调用body,它的优点是效率高,因为它是在数据库查询阶段就截取好内容,而不是在PHP循环中再用函数处理。

(图片来源网络,侵删)
适用场景:对性能有一定要求,且愿意修改核心文件的用户。
操作步骤:
-
找到并修改核心文件
- 打开你的网站根目录。
- 进入
/include/文件夹。 - 找到并编辑
arc.listview.class.php文件。
-
定位代码
(图片来源网络,侵删)- 在
arc.listview.class.php文件中,使用Ctrl + F搜索GetArcList函数,找到大约在第 590行 左右的代码段,它看起来像这样:// //处理每个字段的内容 // $this->Fields[$j] = $this->Fields;
- 将这两行代码注释掉(在前面加 ),然后在下面添加新的代码。
- 在
-
添加截取
body的代码- 将下面的代码粘贴到被注释掉的代码位置:
// 处理每个字段的内容 // $this->Fields[$j] = $this->Fields;
// 新增:截取body内容并添加到自定义字段中 $this->Fields['body'] = $this->Fields['body']; // 获取body原始内容 $this->Fields['body'] = cn_substr_html($this->Fields['body'], $this->TotalResult); // 使用cn_substr_html函数截取
**代码解释**: * `$this->Fields['body'] = $this->Fields['body'];`:将`body`字段的原始内容赋值给一个自定义字段`body`。 * `cn_substr_html(...)`:这是DedeCMS自带的、非常强大的截取函数,它可以智能地处理HTML标签,确保截断后不会破坏标签结构。 * `$this->TotalResult`:这里我们直接使用列表的总记录数作为截取长度。**这是一个不推荐的写法**,因为列表的总记录数可能非常大,导致截取过长,你应该用一个具体的数字,`200`,来限制摘要长度。 **修正后的代码(推荐)**: ```php // 处理每个字段的内容 // $this->Fields[$j] = $this->Fields; // 新增:截取body内容并添加到自定义字段中 $this->Fields['body'] = $this->Fields['body']; // 获取body原始内容 // 使用cn_substr_html函数截取,限制长度为200个字符 $this->Fields['body'] = cn_substr_html($this->Fields['body'], 200); - 将下面的代码粘贴到被注释掉的代码位置:
-
在列表页模板中调用
- 你可以在你的列表页模板文件(通常是
/templets/default/list_栏目ID.htm)中直接调用{dede:field.body/}了。 - 示例:
<ul> {dede:list pagesize='10'} <li> <h2><a href="[field:arcurl/]">[field:title/]</a></h2> <div class="summary"> [field:body/] </div> <span class="time">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:list} </ul>
- 你可以在你的列表页模板文件(通常是
使用自定义函数(灵活,不修改核心文件)
如果你不想修改核心文件,可以使用DedeCMS的自定义函数功能来实现,这种方法更灵活,且不会因为升级DedeCMS而丢失修改。
适用场景:不想修改核心文件,或者需要在多个不同场景下使用不同截取规则的用户。
操作步骤:
-
创建自定义函数文件
- 在你的网站根目录下创建一个名为
userfunc.php的文件(如果已存在则无需新建)。
- 在你的网站根目录下创建一个名为
-
编写截取函数
- 在
userfunc.php文件中,添加以下PHP函数:<?php // 函数名可以自定义,getBodySummary function getBodySummary($body, $len = 200) { // 使用DedeCMS自带的cn_substr_html函数进行安全截取 return cn_substr_html($body, $len); } ?>
- 在
-
在列表页模板中调用
- 在你的列表页模板文件中,使用
{dede:field.body function='getBodySummary(@me, 150)'/}的方式来调用。 - 示例:
<ul> {dede:list pagesize='10'} <li> <h2><a href="[field:arcurl/]">[field:title/]</a></h2> <div class="summary"> {dede:field.body function='getBodySummary(@me, 150)'/} </div> <span class="time">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:list} </ul>代码解释:
function='getBodySummary(@me, 150)':这里调用了我们刚刚在userfunc.php中定义的getBodySummary函数。@me:这是DedeCMS模板引擎的固定用法,代表当前字段的原始值,也就是body。150:这是传递给函数的第二个参数,表示截取的长度为150个字符,你可以根据需要调整这个值。
- 在你的列表页模板文件中,使用
使用 description 字段(最简单,推荐)
如果你的列表页只需要显示文章的摘要,那么最好的做法是在发布文章时就填写好摘要,然后调用description字段,这是DedeCMS设计的标准做法,性能最优。
适用场景:只需要显示简短摘要,不涉及从正文中截取。
操作步骤:
-
在后台填写摘要
在DedeCMS后台发布或编辑文章时,在“栏目填写你想要的摘要内容。
-
在列表页模板中调用
- 直接在模板中使用
{dede:field.description/}即可。 - 示例:
<ul> {dede:list pagesize='10'} <li> <h2><a href="[field:arcurl/]">[field:title/]</a></h2> <div class="summary"> [field:description/] </div> <span class="time">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:list} </ul>如果摘要为空,可以显示“暂无摘要”:
[field:description function='(@me=="" ? "暂无摘要" : @me)'/]
- 直接在模板中使用
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
修改arc.listview.class.php |
性能最高,直接在数据库查询层面处理。 | 需要修改核心文件,升级DedeCMS后可能需要重新修改。 | ⭐⭐⭐⭐⭐ (对性能要求高时) |
| 自定义函数 | 灵活,不修改核心文件,可复用。 | 性能略低于方法一,因为是在PHP循环中处理。 | ⭐⭐⭐⭐ (最通用、最推荐的方法) |
调用description |
最简单、最标准,性能最好。 | 需要手动维护摘要内容,无法自动截取正文。 | ⭐⭐⭐⭐⭐ (作为最佳实践) |
最终建议:
- 最佳实践:在后台文章编辑页面,手动填写
description摘要,这是最符合DedeCMS设计理念、最稳定、最高效的方式。 - 如果必须自动截取:优先使用方法二(自定义函数),因为它既灵活又安全,不会因为升级导致问题。
- 如果对性能有极致要求,且不介意修改核心文件:可以使用方法一。
