在栏目后台直接指定模板文件(最推荐、最灵活)
这是最常用、最规范也是最灵活的方法,你不需要修改任何核心代码,只需在后台进行设置即可。

适用场景:绝大多数需要为特定栏目定制模板的情况。
操作步骤:
-
登录DedeCMS后台:使用你的管理员账号登录。
-
进入栏目管理:在左侧菜单栏中,找到
核心->栏目管理。
(图片来源网络,侵删) -
选择目标栏目:在栏目列表中,找到你想要设置独立模板的那个栏目,并点击它进入编辑页面。
(这是一个示例图,点击栏目名称进入编辑)
-
设置栏目内容模板:
- 在栏目编辑页面,向下滚动,找到
栏目列表选项或高级选项这样的区域。 - 你会看到一个名为
栏目列表模板的输入框。 - 默认情况下,这里可能是
list_default.htm,这是系统默认的列表页模板。 - 你需要在这里输入你为这个栏目专门创建的模板文件名,
list_product.htm。
(这是一个示例图,红框内就是需要填写的地方)
(图片来源网络,侵删) - 在栏目编辑页面,向下滚动,找到
-
保存设置:点击页面底部的
确定或保存按钮即可。
工作原理:
当 DedeCMS 渲染一个列表页时,系统会首先检查当前栏目的 栏目列表模板 设置,如果设置了自定义的模板文件名,系统就会去 /templets/ 目录下寻找并加载这个指定的模板文件,如果没有设置,则会使用系统默认的 list_default.htm。
优点:
- 灵活:可以为每个栏目独立设置,互不干扰。
- 无需修改代码:纯后台操作,安全且不会破坏系统文件。
- 易于管理:所有模板设置都在后台,一目了然。
通过修改 include/arc.listview.class.php 文件实现自动匹配(不推荐,除非有特殊需求)
这种方法可以让你通过某种规则(比如栏目ID)自动加载不同的模板,而无需在后台为每个栏目都设置一遍。
⚠️ 重要提示:此方法需要修改核心文件,在DedeCMS升级后,这些修改可能会被覆盖,因此请谨慎使用,并做好备份。
适用场景:有大量栏目,且它们的模板命名有规律,希望通过代码自动判断,减少后台设置的工作量。
操作步骤:
-
备份文件:在修改之前,务必备份
include/arc.listview.class.php文件。 -
编辑文件:使用 FTP 或其他文件管理工具,找到并打开
/include/arc.listview.class.php文件。 -
找到关键代码:在文件中搜索
GetTemplets()函数,你会找到类似下面的代码:// 获取模板位置 function GetTemplets($tempname) { if($tempname=='') { $tempname = $this->Fields['templet']; } if(!isset($GLOBALS['cfg_templet_dir'])) { $GLOBALS['cfg_templet_dir'] = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir']; } if($tempname=='') { $tempname = $GLOBALS['cfg_df_style'].'/list_default.htm'; } if(defined('DEDEMOB')) { $tmpfile = $GLOBALS['cfg_mobile_templet_dir'].'/'.$tempname; if(file_exists($tmpfile)) { return $tmpfile; } } if(defined('DEDEADMIN')) { $tmpfile = str_replace($GLOBALS['cfg_basedir'], '', $this->TypeID); $tmpfile = preg_replace("/[\/]{1,}/", '/', $tmpfile); $tmpfile = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir'].'/'.$tmpfile.'/'.$tempname; if(file_exists($tmpfile)) { return $tmpfile; } } // 默认路径 $tmpfile = $GLOBALS['cfg_templet_dir'].'/'.$tempname; if(file_exists($tmpfile)) { return $tmpfile; } // 尝试从当前栏目目录查找 $tmpfile = $GLOBALS['cfg_templet_dir'].'/'.$this->TypeLink->TypeInfos['typedir'].'/'.$tempname; if(file_exists($tmpfile)) { return $tmpfile; } // 尝试从系统默认目录查找 $tmpfile = $GLOBALS['cfg_templet_dir'].'/'.$GLOBALS['cfg_df_style'].'/'.$tempname; if(file_exists($tmpfile)) { return $tmpfile; } return $tmpfile; }这段代码已经实现了“自动匹配”的逻辑,它会按顺序查找模板:
- 后台指定的模板。
- 在
.../栏目目录/下查找模板。 - 在默认风格目录下查找模板。
-
添加自定义逻辑(示例): 假设你想让栏目ID为
5的栏目使用list_special.htm模板,你可以在GetTemplets函数的开头添加判断:function GetTemplets($tempname) { // ====================== 自定义逻辑开始 ====================== // 获取当前栏目ID $typeid = $this->TypeID; // 如果栏目ID是5,并且没有指定模板,则强制使用list_special.htm if($typeid == 5 && $tempname == 'list_default.htm') { $tempname = 'list_special.htm'; } // ====================== 自定义逻辑结束 ====================== if($tempname=='') { $tempname = $this->Fields['templet']; } // ... 后面的代码保持不变 ... }
优点:
- 自动化:一旦设置好,新增栏目如果符合规则,会自动应用模板。
- 减少后台操作:对于有规律的栏目,可以省去后台设置的步骤。
缺点:
- 修改核心文件:有升级后代码被覆盖的风险。
- 维护困难:代码逻辑不直观,对于不熟悉代码的人来说难以理解和修改。
- 不够灵活:规则一旦写死,修改起来比较麻烦。
通过修改 list.php 文件传递模板参数(较少用)
这种方法是在调用列表页的PHP文件中,手动指定一个模板参数。
适用场景:通常用于制作一个特殊的页面,而不是常规的栏目列表页。
操作步骤:
-
创建模板:创建一个自定义模板文件,
my_special_list.htm。 -
修改
list.php:打开/list.php文件,找到类似这样的代码:require_once(dirname(__FILE__)."/include/common.inc.php"); require_once(DEDEINC."/arc.listview.class.php"); $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; // ... 其他代码 ... $lv = new ListView($typeid); $lv->Display();
-
在
Display()之前指定模板:require_once(dirname(__FILE__)."/include/common.inc.php"); require_once(DEDEINC."/arc.listview.class.php"); $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; // ... 其他代码 ... $lv = new ListView($typeid); // 强制指定使用 my_special_list.htm 模板 $lv->SetTemplet('my_special_list.htm'); $lv->Display();
缺点:
- 侵入性强:直接修改了程序入口文件。
- 不通用:这种方法只对通过这个
list.php访问的页面有效,无法直接应用于后台管理的栏目。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 后台指定 | 灵活、安全、无需代码、易于管理 | 需要为每个栏目在后台设置一次 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 修改核心文件 | 自动化、减少后台操作 | 修改核心文件、有升级风险、维护困难 | ⭐☆☆☆☆ (不推荐,除非必要) |
| 修改PHP文件 | 可实现特殊页面需求 | 侵入性强、不通用 | ⭐☆☆☆☆ (仅限特殊场景) |
对于绝大多数情况,请直接使用 方法一,这是 DedeCMS 设计之初就考虑到的标准功能,也是最稳定、最安全、最符合CMS使用习惯的方式,只有当你有非常特殊的需求,并且有信心处理后续的升级和维护问题时,才考虑使用其他方法。
