一个经常提到的问题是,如何将不同类的商品按不同的格式显示。
例如,音乐类商品和园艺类商品要保存和显示不同的字段。
商品类型定义,正是用于处理该问题。
下面的简要说明,将使用v1.2版本中的音乐商品类型作为例子。具体实现,还要根据自己的需求来做调整。
本文将尽量说明原理,如有疑问,请到论坛上提出。
*********************************************
1. 数据库设计
商品类型系统(PTS)使用Zen Cart的基本数据表和可选数据表。
基本数据表包括:PRODUCT_TYPES,PRODUCT_TYPE_LAYOUT,GET_TERMS_TO_FILTER
_PRODUCT_TYPES 数据表
_PRODUCT_TYPES 数据表用于记录当前安装的商品类型的基本信息。包含以下8个字段:
type_id
type_name
type_handler
type_master_type
allow_add_to_cart
default_image
date_added
last_modified
type_id 是自动增值字段,PTS用于和商品类型的其它数据表关联。
type_name 用户定义字段,尽量采用开发小组使用的命名规则。例如在ZC 1.2中,使用“商品 - 普通”来定义标准商品,用“商品 - 音乐”来定义音乐CD的商品类型。还有“文档 - 普通”来定义文档的基本外观,以及“文档 - 商品”来定义用于出售的文档。这些名称位于管理商品页面的下拉菜单中。
type_handler 用户定义字段,用于定义指向商品类型代码的地址。最好定义成类似type_name字段。例如,如果type_name字段为商品-音乐,那么 type_handler就为product_music。为了跨平台兼容,type_handler要使用小写字母。
type_master_type 用于将商品类型连接在一起。主要为了用不同的边框来显示特定商品类型的分类目录。例如,文档类型链接在一起,这样,可以建立一个边框,仅用来显示所有的文档类目录。
allow_add_to_cart 该字段指定仅用于显示的商品类型,该类商品不能添加到购物车。基本的“文档”类型就是个例子。
default_image 保留字段。
date_added/last_modified 仅用于内部编码。
_PRODUCT_TYPE_LAYOUT 数据表
Zen Cart可以在管理页面下,设置商品信息页面上显示的字段,这部分信息保存在CONFIGURATION数据表。由于不同商品类型含不同信息,所以我们使用另一个数据表。
该数据表类似configuration表,含以下字段:
configuration_id
configuration_title
configuration_key
configuration_value
configuration_description
product_type_id
sort_order
last_modified
date_added
use_function
set_function
下面是音乐类商品的一个例子:
INSERT INTO product_type_layout (configuration_title, configuration_key, configuration_value, configuration_description, product_type_id, sort_order, set_function, date_added) VALUES ('显示唱片公司', 'SHOW_PRODUCT_MUSIC_INFO_RECORD_COMPANY', '1', '在商品页面上显示唱片公司 0= off 1= on', '2', '4', 'zen_cfg_select_drop_down(array(array('id'=">'1'," 'text'=">'True')," array('id'=">'0'," 'text'=">'False'))," ', now());
这样,管理员可以设定是否在商品信息页面显示唱片公司。当然,还需要修改音乐商品信息页面的代码:
if (SHOW_PRODUCT_MUSIC_INFO_RECORD_COMPANY ="=" '1') {
?>
} // SHOW_PRODUCT_MUSIC_INFO_URL
这只是一个例子,参考商品信息页面的代码(参照PRODUCT_TYPE_LAYOUT数据表)
GET_TERMS_TO_FILTER 数据表
该表不算PTS的核心部分,但用于处理新的条件边框。
条件边框根据一些变量来选择商品列表。
厂家边框就是一个例子,该边框根据商品厂家选择商品列表。
例如,显示所有Microsoft的商品。
音乐商品类型增加了两个条件边框,唱片公司和音乐流派
该表中只有一个字段:get_term_name
这是条件边框返回的$_GET变量的名字,这将在后面的代码中说明。
2. 商店后台管理部分的代码修改
admin/categories.PHP 用于显示和管理分类目录,同时也包含添加新商品的按钮。添加新商品时,categories.php会调用处理文件 [product handler].php。而[product handler]就是保存在product_types数据表中的名字。例如,音乐类型商品的处理文件为 product_music.php。
该处理文件只是个框架,可以直接复制product.php为自定义的处理文件。记住还要建立一个相应的语言文件。
商品处理页面需要另外几个文件,最重要的两个是:
admin/includes/modules/[handler_name]/collect_info.php
admin/includes/modules/[handler_name]/preview_info.php
其中,[handler name]是product_types数据表中的type_handler字段。
这两个文件在商品表中建立新记录,所以如果你的商品类型含有新字段/选项,这里是需要修改最多的地方。
collect_info.php含有输入商品细节的代码,例如:
商品名称
商品描述
商品价格
等等...
preview_info.php 用于将新建的商品数据写入数据库之前的预览。
在admin/includes/modules目录中,还有几个文件可以替代,也就是在admin/includes/modules/[handler name]/目录中,使用相同名字的文件, 视情况使用。
这些文件为:
update_product.php
该代码用于更新各个数据表,以将商品加入数据库。仅当你的商品类型需要在数据库中另外增加字段时,才需要替代该文件。
例如:音乐类型在单独数据表product_music_extra中保存流派类型、唱片公司,所以需要在update.php中添加代码,以保证collect_info.php中的信息能添加到数据表中。
copy_to_confirm.php
在复制商品时用到该代码。如果你的商品类型使用其它数据表保存资料,那么在这里添加代码,以保证数据复制到新商品中。
例如:音乐类型在这里添加代码,将products_music_extra数据表中的数据复制到新商品中。
delete_product_confirm.php
该代码用于删除商品。在这里删除其它数据表中有关该商品类型的数据。
move_product_confirm.php
该代码用于在分类间移动商品,通常不要替代该文件,因为移动仅修改product_id。当然也有可能需要修改。
3. 商店前台的代码修改
在分类中显示商品类型,要做的修改相对比较少。
总的来说,只要提供处理页面来显示商品信息。在新建商品信息页面前,先建立一个新目录/includes/modules/pages/[handler name]_info
复制所有includes/modules/pages/product_info/目录下的文件到includes/modules/pages/[handler name]_info/ 目录。
通常该目录中需要修改的文件只有main_template_var.php
例如:音乐类型在这里添加代码,用来从product_music_extra数据表中读取音乐流派、唱片公司等等信息。
然后需要为新商品类型的商品信息页面建立模板。该模板位于includes/templates/template_default/templates,如果要和核心代码分开,就保存在includes/templates/[你的模板]/templates 。
模板文件必须命名为:
tpl_[handler name]_info_display.php,同样,[handler name]与product_types数据表中的type_handler相同。
当然要在模板中加入新商品类型的新添内容。
很重要的一点,在模板中,通常使用几个常量来定义是否显示某个元素。例如,在标准商品信息页面,SHOW_PRODUCT_INFO_QUAntITY 如果设置为1,将显示库存数量。这些常量保存在数据表product_type_layout中。
最好是为该表中的每个商品类型建立不同的常量。例如,音乐类型使用SHOW_PRODUCT_MUSIC_INFO_QUANTITY替代了SHOW_PRODUCT_INFO_QUANTITY。这样,管理员可以给不同商品类型定制外观。
添加边框
PTS的另外一个重要功能是条件边框可以选择商品列表。你在用厂家边框时可能就知道了,你可以列出指定厂家的商品。
音乐类型增加了两个条件边框:音乐流派和唱片公司。打开音乐流派边框的代码 includes/modules/sideboxes/music_genre.php,可以看到选择的音乐流派的ID会在url中通过$_GET变量调用music_genre_name。为了正确处理,需要自动记录这些条件。前面的数据库部分提到,你可以在get_terms_to_filter数据表中添加条件变量的名称。