Zen Cart™ v1.2版本的产品类型介绍
1、简介
Zen Cart™多请求功能是为不同类型的产品提供独特信息布局的能力。例如,音乐视频,需要有不同的信息存储和显示,相比说花园里的长椅。
以前,Zen Cart™ 的商店用户不拆散核心代码没有办法做到这一点。产品类型系统的设计正是为了解决这个问题。
纵观这个小教程,我们将使用音乐产品类型作为V1.2标准版本的一个例子。这并不意味着实现产品类型有一个详尽的论述,因为这取决于你正在试图实现的东西。
然而,它应该提供足够的概述。更多信息可在支持论坛找到。
2、数据库Schema
产品类型系统使用所需的数量,和一些非必需的表内的 Zen Cart™ 数据库。所需的数据库表:
PRODUCT_TYPES
PRODUCT_TYPE_LAYOUT
GET_TERMS_TO_FILTER
PRODUCT_TYPES
产品类型数据库是用来跟踪与当前安装的产品类型相关的基本信息,它由8个领域组成。
Type _id
Type _name
Type _handler
Type _master _type
Allow _add _to _cart
default _image
date _added
last _modified
TYPE_ID是一个自动递增的领域,用于交叉引用其他产品类型系统所使用的数据库表的类型。
TYPE_NAME是用户定义的,但你应该坚持使用核心团队已决定的命名。举个例子,在
Zen Cart™ 1.2,有些产品,一般来说是标准产品,产品-音乐是产品的类型,设计为音乐CD。然后,有些文件,通常只是文件信息的基础布局,文件-产品是可以出售的文件。这些名字在产品管理页面的下拉菜单中可以使用。
type_handler再次被用户定义,用于构建URL的代码,实际上做的产品类型的工作。这是对于TYPE_NAME的最好的定义。例如,如果TYPE_NAME是产品-音乐,type_handler将会是product_music。对于跨操作系统的兼容性,始终使用小写的type_handler。更多的解释稍后说明,type_handler如何访问一个给定的产品类型的特殊代码。
type_master_type用于把产品类型联系在一起。这主要用来显示某些产品种类的目录树,如果你想建立独立的侧边框的话。例如文件类型已链接好,并提供一个侧边框,用来浏览包含文件类型的分类。
allow_add_to_cart. Provision这个领域是用来创建
product_types 的。只为了显示信息,因为你不想让购物者添加它们到购物车。基本的文件类型是一个很好的例子。
default_image是保留到将来使用的。
date_added/ LAST_MODIFIED仅限内部代码使用。
产品类别布局
在Zen Cart™,使用管理界面,一直有可能决定显示产品信息的哪些要素。这个信息原来被保存在配置表。然而,作为不同的产品类型,有不同类型的信息,现在使用一个单独的表来认识产品类型。
本表的布局是相似的配置表中的一个项目。代码是
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 Record
Company', 'SHOW_PRODUCT_MUSIC_INFO_RECORD_COMPANY', '1', 'Display Record Company
on Product Info 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') {
?>
<tr>
<td class="main" align="center"
colspan="2">
<?php echo sprintf(TEXT_RECORD_COMPANY_URL,
zen_href_link(FILENAME_REDIRECT,
'action=url&goto=' .
urlencode($products_record_company_url), 'NONSSL',
true, false)); ?>
</td>
</tr>
<?php
} // SHOW_PRODUCT_MUSIC_INFO_URL
这只是一个例子,你应该看看产品信息代码,以及在PRODUCT_TYPE_LAYOUT表中相关条目的更多例子。
GET_TERMS_TO_FILTER
此表并不是核心产品类型系统的一部分,但用于处理新的过滤器侧边框。
过滤器根据一些变量,用于过滤侧边框产品名单。
这部分主要的例子是制造商侧边框。它允许你过滤基于产品制造商的产品列表。
例如显示所有产品的制造商是微软。
音乐产品类型增加了两个过滤器侧边框,唱片公司和音乐类型。
在此表中只有一个领域:
get_term_name - 这是_GET变量的名称。这是有过滤器侧边框返回的。当我们看到产品类型系统的目录端代码,相关性将有更深入的讨论,。
3、管理代码
在以前的版本中,处理添加类别或产品的所有代码包含在admin/categories.php
文件中。为了适应产品类型系统,这个文件需要被拆分。
现在,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] 是
type_handler 输入product_types表里的名字。
这两个文件实际上就是在产品表中创建一个新项目,因此将最需要定制,如果你的产品类型包含为产品类型的新领域或选项的话。
collect_info.php 包含了收集产品详情的代码。例如:
产品名称
产品描述
产品价格
等等
preview_info.php用于预览创建的产品之前,将它永久添加到数据库中。
在admin/includes/modules
目录中,有一些你可以覆盖的其他文件。我的意思是,通过添加一个同名的文件admin/includes/modules/[handler
name]/ directory,它会被优先使用。
那些文件是:
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。但是有些人在某些地方可能会使用。
4、目录代码
这个修改需要支持在目录代码中的产品类型,比管理区稍微繁杂一些。
从本质上讲,只需要提供一个处理程序页面显示产品信息。要创建一个新的产品信息页,必须首先在/includes/modules/pages/[handler
name]_info创建一个新的目录。
最初,你应该复制所有includes/modules/pages/product_info/ directory 的文件到你的includes/modules/pages/[handler name]_info/ directory文件中。
通常在目录里面,你需要编辑的唯一文件是 main_template_vars.php。
而且,从技术上说,你完全不需要编辑该文件。相反,只需在/includes/templates/YOUR_TEMPLATE/[handler
name]_info/extra_main_template_vars 文件夹中创建你自己的脚本就行了。这个文件将被载入基本的main_template_vars.php 文件(还是需要从产品信息文件夹复制它,这样可以处理基础数据),并准备你的模板所需要的内容(假设你在该文件中编写代码)
例如,从product_music_extra 表中,音乐类型添加音乐流派、唱片公司等加载信息。
然后,你需要为产品类型的产品信息页创建一个模板。这个模板应该放在includes/templates/template_default/templates文件中,或者单独放在includes/templates/[your template]/templates 文件中,如果你想要让它与核心代码分开的话。
模板文件应该被称为:tpl_[handler name]_info_display.php
再次强调,[handler name] 与
product_types table的type_handler 领域必须同名。
当然,你需要调整模板,以包含产品类型的任何附加信息。
其中,最重要的一点,在一般的模板中,常量是用来决定某个元素是否显示的。例如,在标准的产品信息页面上,SHOW_PRODUCT_INFO_QUANTITY如果设置为1,将显示库存数量。这些常数在database/product_type_layout
table. 中加载。
在这个表格中为每个产品类型创建单独的常量是非常好的做法。例如,音乐类型使用SHOW_PRODUCT_MUSIC_INFO_QUANTITY
代替SHOW_PRODUCT_INFO_QUANTITY.这个允许管理员分别设置不同的产品类型的布局。
5、过滤器边箱
目录中的产品类型体系的重要补充,sideboxes可以过滤产品上市。使用制造商sidebox时,你可能已经熟悉这个。这允许你限制某一特定制造商的产品上市。
音乐类型增加了两个额外的过滤器sideboxes。分别是音乐类型和唱片公司。如果你在includes/modules/sideboxes/music_genre.php
看到代码说是音乐类型sidebox,你可以看到,选择的音乐流派的ID将在
$_GET变量叫做music_genre_name的URL传递。为了正确处理,我们需要一个可以自动注册这些过滤条件的方式。正如前面提到的,通过增加过滤器变量名称的get_terms_to_filter数据库表的名称,可以做到这一点。
6、书面产品类型写作
作为如何创建产品类型的一个例子,你可以想看看由Justin K (jazzyjus)创建的图书产品类型。这包括一个优秀的自述文件,还有很好的注释代码。
可以从下载区下载图书产品类型。 |