在栏目后台直接指定模板文件(最推荐、最灵活)

这是最常用、最规范也是最灵活的方法,你不需要修改任何核心代码,只需在后台进行设置即可。

dede 根据栏目调用不同的模板
(图片来源网络,侵删)

适用场景:绝大多数需要为特定栏目定制模板的情况。

操作步骤

  1. 登录DedeCMS后台:使用你的管理员账号登录。

  2. 进入栏目管理:在左侧菜单栏中,找到 核心 -> 栏目管理

    dede 根据栏目调用不同的模板
    (图片来源网络,侵删)
  3. 选择目标栏目:在栏目列表中,找到你想要设置独立模板的那个栏目,并点击它进入编辑页面。

    (这是一个示例图,点击栏目名称进入编辑)

  4. 设置栏目内容模板

    • 在栏目编辑页面,向下滚动,找到 栏目列表选项高级选项 这样的区域。
    • 你会看到一个名为 栏目列表模板 的输入框。
    • 默认情况下,这里可能是 list_default.htm,这是系统默认的列表页模板。
    • 你需要在这里输入你为这个栏目专门创建的模板文件名list_product.htm

    (这是一个示例图,红框内就是需要填写的地方)

    dede 根据栏目调用不同的模板
    (图片来源网络,侵删)
  5. 保存设置:点击页面底部的 确定保存 按钮即可。

工作原理: 当 DedeCMS 渲染一个列表页时,系统会首先检查当前栏目的 栏目列表模板 设置,如果设置了自定义的模板文件名,系统就会去 /templets/ 目录下寻找并加载这个指定的模板文件,如果没有设置,则会使用系统默认的 list_default.htm

优点

  • 灵活:可以为每个栏目独立设置,互不干扰。
  • 无需修改代码:纯后台操作,安全且不会破坏系统文件。
  • 易于管理:所有模板设置都在后台,一目了然。

通过修改 include/arc.listview.class.php 文件实现自动匹配(不推荐,除非有特殊需求)

这种方法可以让你通过某种规则(比如栏目ID)自动加载不同的模板,而无需在后台为每个栏目都设置一遍。

⚠️ 重要提示:此方法需要修改核心文件,在DedeCMS升级后,这些修改可能会被覆盖,因此请谨慎使用,并做好备份。

适用场景:有大量栏目,且它们的模板命名有规律,希望通过代码自动判断,减少后台设置的工作量。

操作步骤

  1. 备份文件:在修改之前,务必备份 include/arc.listview.class.php 文件。

  2. 编辑文件:使用 FTP 或其他文件管理工具,找到并打开 /include/arc.listview.class.php 文件。

  3. 找到关键代码:在文件中搜索 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;
    }

    这段代码已经实现了“自动匹配”的逻辑,它会按顺序查找模板:

    1. 后台指定的模板。
    2. .../栏目目录/ 下查找模板。
    3. 在默认风格目录下查找模板。
  4. 添加自定义逻辑(示例): 假设你想让栏目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文件中,手动指定一个模板参数。

适用场景:通常用于制作一个特殊的页面,而不是常规的栏目列表页。

操作步骤

  1. 创建模板:创建一个自定义模板文件,my_special_list.htm

  2. 修改 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();
  3. 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使用习惯的方式,只有当你有非常特殊的需求,并且有信心处理后续的升级和维护问题时,才考虑使用其他方法。