直接修改核心文件(简单直接,但升级后需重复修改)

这种方法直接修改 category.php 文件,让它根据分类 ID 来加载不同的模板文件。

ecshop 不同分类不同模板
(图片来源网络,侵删)

第 1 步:准备你的模板文件

  1. 假设你的默认分类模板是 library/category_list.lbi
  2. 为不同的分类创建对应的模板文件。
    • 分类 ID 为 5 的分类,你创建一个新文件 library/category_list_5.lbi
    • 分类 ID 为 10 的分类,你创建 library/category_list_10.lbi
    • 以此类推。

第 2 步:修改 category.php 文件

  1. 用 FTP 或文件管理器,打开你的 ECSHOP 根目录下的 category.php 文件。

  2. 找到如下代码(通常在文件末尾,就在 ?> 之前):

    // 获得分类中的商品
    $children = get_cat_children($cat_id);
    $smarty->assign('cat_goods_list', get_category_goods($cat_id, $children));
    $smarty->display('category.dwt');
    ?>
  3. 将上面的代码替换为下面的代码:

    // 获得分类中的商品
    $children = get_cat_children($cat_id);
    $smarty->assign('cat_goods_list', get_category_goods($cat_id, $children));
    // --- 开始:不同分类不同模板 ---
    // 定义你的分类ID和对应模板文件的映射关系
    // 键是分类ID,值是模板文件名(不带.lbi后缀)
    $template_map = array(
        5 => 'category_list_5',  // 分类ID为5,使用 category_list_5.lbi
        10 => 'category_list_10', // 分类ID为10,使用 category_list_10.lbi
        // 可以继续添加更多分类
    );
    // 检查当前分类ID是否在映射数组中
    if (isset($template_map[$cat_id])) {
        // 如果存在,则使用指定的模板
        $smarty->assign('cat_tpl', $template_map[$cat_id]);
    } else {
        // 如果不存在,则使用默认模板
        $smarty->assign('cat_tpl', 'category_list');
    }
    // --- 结束:不同分类不同模板 ---
    $smarty->display('category.dwt');
    ?>

第 3 步:修改模板文件 category.dwt

你需要告诉 category.dwt 在哪里显示我们指定的分类模板。

ecshop 不同分类不同模板
(图片来源网络,侵删)
  1. 打开你的主题目录下的 category.dwt 文件(通常是 themes/你的主题名/category.dwt)。

  2. 找到默认调用分类列表模板的代码,它通常长这样:

    <!-- {if $cat_goods_list} -->
    <!-- #BeginLibraryItem "/library/category_list.lbi" --><!-- #EndLibraryItem -->
    <!-- {/if} -->
  3. 将它替换为下面的动态代码:

    <!-- {if $cat_goods_list} -->
    <!-- {if $cat_tpl} -->
      <!-- #BeginLibraryItem "/library/{$cat_tpl}.lbi" --><!-- #EndLibraryItem -->
    <!-- {else} -->
      <!-- #BeginLibraryItem "/library/category_list.lbi" --><!-- #EndLibraryItem -->
    <!-- {/if} -->
    <!-- {/if} -->

工作原理:

ecshop 不同分类不同模板
(图片来源网络,侵删)
  • category.php 中,我们创建了一个 $template_map 数组来存储“分类ID”和“模板名”的对应关系。
  • 程序会检查当前访问的分类 ID ($cat_id) 是否在这个数组里。
  • 如果在,就把对应的模板名(如 category_list_5)赋值给 Smarty 变量 $cat_tpl
  • 如果不在,就给 $cat_tpl 赋默认值 category_list
  • category.dwt 模板文件接收到 $cat_tpl 变量后,就会动态地加载 library/{$cat_tpl}.lbi 这个文件。

优点:

  • 实现简单,只需要修改两个文件。

缺点:

  • 硬编码:分类 ID 和模板名的对应关系是直接写在 category.php 里的。
  • 升级麻烦:每次 ECSHOP 官方升级 category.php 文件后,你都需要手动重新修改这个文件,否则你的自定义功能会丢失。

使用 ECSHOP 插件(推荐,灵活且升级无忧)

这是更专业、更推荐的做法,通过 ECSHOP 的“模板机制”来实现,不修改核心业务逻辑文件。

第 1 步:创建自定义模板目录和文件

  1. 在你的主题目录下(themes/你的主题名/),创建一个名为 category 的文件夹。
    • 路径:themes/你的主题名/category/
  2. 在这个新创建的 category 文件夹里,为不同的分类创建模板文件。
    • 文件命名规则:category_分类ID.dwt
    • 为分类 ID 5 创建 category_5.dwt,为分类 ID 10 创建 category_10.dwt
    • 这些文件是你的完整页面模板,可以包含 category.dwt 的所有内容,并可以自由修改布局、样式等。

第 2 步:修改 category.php 文件(轻微修改)

这一步的修改非常小,且不会破坏原有逻辑。

  1. 打开 category.php 文件。

  2. 找到 assign_main_template() 函数的调用,它通常在文件末尾,代码如下:

    $smarty->assign('helps',       get_shop_help()); // 网店帮助
    $smarty->assign('categories',   get_categories_tree()); // 分类树
    $smarty->assign('top_goods',    get_top_goods()); // 顶级商品
    $smarty->assign('best_goods',   get_best_goods()); // 热销商品
    $smarty->assign('new_goods',    get_new_goods()); // 新品
    $smarty->assign('hot_goods',    get_hot_goods()); // 热门
    $smarty->assign('promote_goods',get_promote_goods()); // 特价商品
    $smarty->assign('brand_list',   get_brands(get_cat_info($cat_id), 'category')); // 品牌列表
    $smarty->assign('cat_desc',      get_cat_desc($cat_id)); // 分类描述
    $smarty->assign('filter_attr_list', get_filter_attr_list($cat_id)); //筛选属性
    $smarty->assign('url',         build_uri('category', array('cid'=>$cat_id), $cat['cat_name'])); //分类页URL
    assign_dynamic('category');
    $smarty->display('category.dwt', $cache_id);
    ?>
  3. $smarty->display('category.dwt', $cache_id); 这一行修改为:

    // --- 开始:不同分类不同模板 ---
    // 检查是否存在针对当前分类的自定义模板
    $custom_template = 'themes/' . $GLOBALS['_CFG']['template'] . '/category/category_' . $cat_id . '.dwt';
    if (file_exists($custom_template)) {
        // 如果存在,则使用自定义模板
        $smarty->display($custom_template, $cache_id);
    } else {
        // 如果不存在,则使用默认模板
        $smarty->display('category.dwt', $cache_id);
    }
    // --- 结束:不同分类不同模板 ---

工作原理:

  • ECSHOP 在渲染页面时,会先去当前主题目录下的 category 文件夹里查找是否有名为 category_分类ID.dwt 的文件。
  • 如果找到了(category_5.dwt),它就会直接使用这个文件来渲染整个页面。
  • 如果没找到,它就会回退到默认的 category.dwt 模板。
  • 这种方法利用了 ECSHOP 的模板查找机制,没有破坏任何核心逻辑。

优点:

  • 灵活强大:你可以为每个分类定制完全不同的页面布局、样式和内容。
  • 升级无忧:你只修改了 display 方法,而官方升级通常不会改动这个逻辑,即使改动,也更容易对比和恢复。
  • 管理方便:所有自定义模板都集中在 themes/你的主题名/category/ 目录下,一目了然。

总结与建议

特性 方法一 (修改核心文件) 方法二 (使用模板机制)
实现难度 简单 稍简单
灵活性 低,只能改列表部分 极高,可定制整个页面
维护性 差,升级后需重复修改 ,升级影响小
适用场景 只想微调列表样式,且不打算升级系统 强烈推荐,任何需要不同分类不同模板的场景

除非你的需求非常简单,并且确定不会升级 ECSHOP,否则强烈建议你使用方法二,它更专业、更稳定,也为你未来的功能扩展提供了更大的可能性。