直接修改核心文件(简单直接,但升级后需重复修改)
这种方法直接修改 category.php 文件,让它根据分类 ID 来加载不同的模板文件。

(图片来源网络,侵删)
第 1 步:准备你的模板文件
- 假设你的默认分类模板是
library/category_list.lbi。 - 为不同的分类创建对应的模板文件。
- 分类 ID 为 5 的分类,你创建一个新文件
library/category_list_5.lbi。 - 分类 ID 为 10 的分类,你创建
library/category_list_10.lbi。 - 以此类推。
- 分类 ID 为 5 的分类,你创建一个新文件
第 2 步:修改 category.php 文件
-
用 FTP 或文件管理器,打开你的 ECSHOP 根目录下的
category.php文件。 -
找到如下代码(通常在文件末尾,就在
?>之前):// 获得分类中的商品 $children = get_cat_children($cat_id); $smarty->assign('cat_goods_list', get_category_goods($cat_id, $children)); $smarty->display('category.dwt'); ?> -
将上面的代码替换为下面的代码:
// 获得分类中的商品 $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 在哪里显示我们指定的分类模板。

(图片来源网络,侵删)
-
打开你的主题目录下的
category.dwt文件(通常是themes/你的主题名/category.dwt)。 -
找到默认调用分类列表模板的代码,它通常长这样:
<!-- {if $cat_goods_list} --> <!-- #BeginLibraryItem "/library/category_list.lbi" --><!-- #EndLibraryItem --> <!-- {/if} --> -
将它替换为下面的动态代码:
<!-- {if $cat_goods_list} --> <!-- {if $cat_tpl} --> <!-- #BeginLibraryItem "/library/{$cat_tpl}.lbi" --><!-- #EndLibraryItem --> <!-- {else} --> <!-- #BeginLibraryItem "/library/category_list.lbi" --><!-- #EndLibraryItem --> <!-- {/if} --> <!-- {/if} -->
工作原理:

(图片来源网络,侵删)
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 步:创建自定义模板目录和文件
- 在你的主题目录下(
themes/你的主题名/),创建一个名为category的文件夹。- 路径:
themes/你的主题名/category/
- 路径:
- 在这个新创建的
category文件夹里,为不同的分类创建模板文件。- 文件命名规则:
category_分类ID.dwt - 为分类 ID 5 创建
category_5.dwt,为分类 ID 10 创建category_10.dwt。 - 这些文件是你的完整页面模板,可以包含
category.dwt的所有内容,并可以自由修改布局、样式等。
- 文件命名规则:
第 2 步:修改 category.php 文件(轻微修改)
这一步的修改非常小,且不会破坏原有逻辑。
-
打开
category.php文件。 -
找到
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); ?> -
将
$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,否则强烈建议你使用方法二,它更专业、更稳定,也为你未来的功能扩展提供了更大的可能性。
