Zen Cart 开发教程:从入门到精通

Zen Cart 是一个功能强大、基于 PHP 和 MySQL 的开源电子商务购物车系统,其核心理念是“为用户而设计”,但这也意味着其代码结构对于新手来说可能有些复杂,本教程将带你一步步揭开它的面纱。

zencart开发教程
(图片来源网络,侵删)

第一部分:Zen Cart 开发基础

在开始编码之前,你必须了解 Zen Cart 的核心架构和设计哲学。

Zen Cart 的核心设计哲学

  • MVC (Model-View-Controller) 的变种:Zen Cart 并非严格遵循现代 MVC 框架,但其结构有类似之处。
    • Model (模型):数据层,主要位于 includes/classes/ 目录,负责处理数据库交互、业务逻辑(如计算价格、处理订单)。
    • View (视图):表现层,主要位于 includes/templates/includes/languages/ 目录,负责展示 HTML 和文本内容。
    • Controller (控制器):逻辑层,主要位于 includes/modules/pages/includes/modules/extra/ 目录,负责接收用户请求,调用模型和视图,决定页面显示什么内容。
  • 核心文件
    • index.php:所有前端请求的入口文件,它会加载核心配置、类库,并根据 URL 请求分发到不同的页面控制器。
    • includes/application_top.php“心脏”文件,几乎所有页面都会加载它,负责初始化整个应用,加载配置、类库、语言包等。
  • 插件化系统:Zen Cart 的核心优势在于其高度可扩展的插件系统,通过“覆盖”(Override)机制,你可以在不修改核心文件的情况下,自定义网站的功能和外观。

开发环境准备

你需要一个本地的开发环境,推荐使用 XAMPP (Windows/Mac/Linux) 或 MAMP (Mac)。

  1. 安装 Web 服务器:确保 Apache/Nginx、PHP (建议 7.4 或 8.x,注意兼容性)、MySQL 已安装并运行。
  2. 下载 Zen Cart:从 Zen Cart 官网 下载最新稳定版。
  3. 安装 Zen Cart
    • 将下载的 Zen Cart 压缩包解压,把 zc_install 文件夹和 admin 文件夹放到你的 Web 服务器根目录(如 htdocswww)。
    • 在浏览器中访问 http://localhost/zc_install/,按照安装向导进行操作,你需要提前创建一个空的 MySQL 数据库。
    • 安装完成后,删除 zc_install 文件夹以保证安全。
  4. 安装开发工具
    • 代码编辑器:强烈推荐 Visual Studio Code,它支持 PHP 语法高亮、代码补全和 FTP/SFTP 同步。
    • FTP/SFTP 客户端:用于将本地文件上传到服务器,FileZilla 是一个免费且好用的选择。

第二部分:Zen Cart 文件结构详解

理解文件结构是开发的第一步,Zen Cart 的文件组织非常有逻辑。

zen-cart-root/
├── admin/                    # 后台管理系统
├── cache/                    # 缓存目录
├── docs/                     # 文档
├── download/                 # 下载商品目录
├── email_templates/          # 邮件模板
├── images/                   # 图片资源
├── includes/                 # # 核心代码库
│   ├── classes/             # # 模型 - 核心类库
│   ├── functions/            # # 辅助函数库
│   ├── extra/                # # 模块 - 额外功能模块
│   ├── modules/              # # 模块 - 页面和侧边栏模块
│   │   └── pages/           # # 控制器 - 页面级控制器
│   │   └── sideboxes/       # # 侧边栏控制器
│   ├── templates/            # # 视图 - 模板文件
│   │   └── template_default/ # # 默认模板
│   └── languages/            # # 视图 - 语言包
│       └── english/          # # 英文语言包
├── logs/                     # 日志文件
├── media/                    # 媒体资源
├── pub/                      # 公共资源 (CSS, JS, etc.)
├── test/                     # 测试文件
├── tmp/                      # 临时文件
├── .htaccess                 # Apache 配置文件
└── index.php                 # 前台入口文件

关键目录说明

zencart开发教程
(图片来源网络,侵删)
  • includes/templates/:存放网站的 HTML 模板,Zen Cart 使用模板引擎,你可以在这里修改网站的外观。
  • includes/languages/:存放所有文本内容,修改这里可以改变网站显示的文字,实现多语言。
  • includes/modules/pages/:每个 PHP 文件对应一个页面。product_info.php 控制商品详情页。
  • includes/classes/:存放核心的 PHP 类。products.php 处理所有商品相关的逻辑。

第三部分:修改模板与语言(前端定制)

这是最常见的需求,比如修改网站标题、页脚、或者某个区块的文字。

修改网站标题

  1. 定位文件通常在页面的 <head> 部分,默认模板的头部文件是 includes/templates/template_default/common/html_header.php
  2. 编辑文件:打开这个文件,找到类似 <title><?php echo TITLE; ?></title> 的代码。
  3. 修改方式
    • 直接修改:不推荐,因为升级 Zen Cart 后会被覆盖。
    • 推荐方式:使用覆盖机制
      1. 在你的主题目录下创建相同的路径:includes/templates/你的主题名/common/html_header.php
      2. 将默认模板中的 html_header.php 文件复制到你的主题目录下。
      3. 现在你可以安全地修改这个文件,Zen Cart 会优先加载你的版本。

修改页脚文字

  1. 定位文件:页脚文字通常在 includes/templates/template_default/tpl_footer.php
  2. 编辑文件:打开这个文件,找到 Powered by Zen Cart... 这行文字。
  3. 修改方式
    • 同样,建议使用覆盖机制,在你的主题下创建 tpl_footer.php 并修改它。
    • 或者,更优雅的方式是修改语言包,打开 includes/languages/english/common/footer.php,找到 FOSTER_TEXT_INFORMATION 或类似的常量定义,修改它的值。

修改商品详情页布局

  1. 定位文件:商品详情页的模板是 includes/templates/template_default/templates/tpl_product_info_display.php
  2. 编辑文件:这个文件定义了商品图片、描述、价格、加入购物车按钮等的 HTML 结构,你可以直接修改 HTML 和 PHP 代码来改变布局。

第四部分:添加自定义功能(开发插件)

这是 Zen Cart 开发的精髓,我们通过一个最简单的例子来学习:在商品详情页添加一个“自定义标签”字段

步骤 1:创建数据库表

  1. 登录你的 phpMyAdmin。
  2. 为 Zen Cart 数据库执行以下 SQL 语句,创建一个新表来存储自定义标签。
CREATE TABLE `zen_products_custom_tags` (
  `products_id` int(11) NOT NULL,
  `custom_tag` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`products_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤 2:修改后台商品添加/编辑表单

我们需要在后台的商品编辑页面添加一个输入框。

  1. 定位文件:后台商品表单由 admin/includes/modules/products_attributes.phpadmin/includes/templates/template_default/templates/product_info.php 等文件控制,更简单的方式是创建一个“额外”的模块。

  2. 创建模块文件:在 admin/includes/modules/extra/ 目录下创建一个新文件,my_custom_tag.php

    <?php
    // 如果不是在商品编辑页面,则不执行
    if ($action != 'new_product' && $action != 'update_product') {
      return;
    }
    // 查询自定义标签
    $custom_tag_query = $db->Execute("SELECT custom_tag FROM " . TABLE_PRODUCTS_CUSTOM_TAGS . " WHERE products_id = " . (int)$_GET['pID']);
    $custom_tag_value = $custom_tag_query->fields['custom_tag'];
    // 在表单中添加 HTML
    ?>
    <tr>
      <td class="main" colspan="2"><?php echo TEXT_CUSTOM_TAG; ?></td>
      <td class="main" colspan="4">
        <input type="text" name="products_custom_tag" value="<?php echo zen_output_string_protected($custom_tag_value); ?>" size="60" />
      </td>
    </tr>
  3. 包含模块文件:打开 admin/includes/templates/template_default/templates/product_info.php,在合适的位置(比如其他表单字段的后面)添加以下代码来包含你刚刚创建的模块:

    require(DIR_WS_MODULES . 'extra/my_custom_tag.php');
  4. 添加语言标签:打开 admin/includes/languages/english/product_info.php,添加常量定义:

    define('TEXT_CUSTOM_TAG', 'Custom Tag:');

步骤 3:处理表单提交的数据

当你在后台保存商品时,需要将 products_custom_tag 的值存入数据库。

  1. 定位文件:处理商品保存逻辑的核心文件是 admin/includes/modules/update_product.php

  2. 修改文件:找到处理商品信息更新的部分(通常在 if (zen_not_null($_POST['products_model'])) { ... } 这样的代码块内),添加以下代码:

    // ... 其他更新代码 ...
    // 更新或插入自定义标签
    $sql_data_array = array(
      'custom_tag' => zen_db_prepare_input($_POST['products_custom_tag'])
    );
    if ($db->Execute("SELECT products_id FROM " . TABLE_PRODUCTS_CUSTOM_TAGS . " WHERE products_id = " . (int)$_GET['pID'])->EOF) {
      // 如果记录不存在,则插入
      $sql_data_array['products_id'] = (int)$_GET['pID'];
      zen_db_perform(TABLE_PRODUCTS_CUSTOM_TAGS, $sql_data_array);
    } else {
      // 如果记录已存在,则更新
      zen_db_perform(TABLE_PRODUCTS_CUSTOM_TAGS, $sql_data_array, 'update', "products_id = " . (int)$_GET['pID']);
    }

步骤 4:在前台显示自定义标签

  1. 定位文件:前台商品详情页的控制器是 includes/modules/pages/product_info/header_php.php,这个文件负责获取商品数据并传递给模板。

  2. 修改文件:在这个文件中,你需要从数据库查询自定义标签,并将其赋值给一个模板变量。

    // ... 原有代码 ...
    // 查询自定义标签
    $custom_tag_query = $db->Execute("SELECT custom_tag FROM " . TABLE_PRODUCTS_CUSTOM_TAGS . " WHERE products_id = " . (int)$_GET['products_id']);
    $zco_notifier->notify('NOTIFY_PRODUCT_INFO_CUSTOM_TAG_QUERY', $custom_tag_query);
    $template_data->assign('CUSTOM_TAG', $custom_tag_query->fields['custom_tag']);
    // ... 原有代码 ...

    注意TABLE_PRODUCTS_CUSTOM_TAGS 是一个常量,你需要在 includes/database_tables.php 中定义它: define('TABLE_PRODUCTS_CUSTOM_TAGS', TABLE_PREFIX . 'products_custom_tags');

  3. 在模板中使用:打开 includes/templates/你的主题名/templates/tpl_product_info_display.php,在合适的位置添加以下代码来显示标签:

    <?php if ($CUSTOM_TAG) { ?>
      <div class="custom-tag">
        <?php echo $CUSTOM_TAG; ?>
      </div>
    <?php } ?>
  4. 添加前台语言标签:打开 includes/languages/english/product_info.php,添加:

    define('TEXT_PRODUCT_CUSTOM_TAG', 'This product has a special tag: ');

    然后在模板中可以这样使用:<div class="custom-tag"><?php echo TEXT_PRODUCT_CUSTOM_TAG . $CUSTOM_TAG; ?></div>


第五部分:进阶主题与最佳实践

使用覆盖机制

永远不要修改 Zen Cart 核心文件! 核心文件会在升级时被覆盖,导致你的所有修改丢失。

正确做法是使用“覆盖”:

  • 模板覆盖:在 includes/templates/你的主题名/ 下创建与核心文件相同的目录结构。
  • 语言覆盖:在 includes/languages/你的语言包/ 下创建与核心文件相同的目录结构。
  • 类库覆盖:在 includes/classes/ 下创建一个 overrides/ 文件夹,将需要修改的类文件复制到这里进行修改。

调试技巧

  • 开启错误报告:在 includes/extra_configures/ 目录下创建一个 enable_error_logging.php 文件,内容如下:

    <?php
    // 开启详细的错误报告
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    ?>

    注意:开发完成后务必删除此文件或将其移除,否则会在前台暴露错误信息,带来安全风险。

  • 使用 echoprint_r:在 PHP 代码中插入 echo "我在这里";print_r($your_variable); 来检查代码执行流程和变量值。

学习资源


Zen Cart 开发是一个循序渐进的过程,从修改模板和语言开始,然后尝试创建简单的插件,逐步深入到核心逻辑的定制。“覆盖而非修改” 的黄金法则,善用其强大的插件系统,你就能高效地开发出功能丰富、个性化的电子商务网站,祝你开发顺利!