我正在为客户开发 Ubercart 2.0 项目。这是一家面料店。他们希望客户能够添加小数(或小数),例如 1.75 m。有没有人有一个完整的代码更改列表允许这个功能?
5 回答
我认为改变 ubercart 核心来实现你的意思是一个坏主意。当有安全修复时,您基本上注定自己无法更新/升级,并且可能其他一些模块会假设您使用的是整数,从而让位于难以跟踪的错误和 php 异常。
我没有像以前的海报那样进行广泛的搜索,但是如果我必须自己实现您的需求,我会不由自主地:
- 在后端使用厘米(整数)作为逻辑测量单位。
- 通过在验证/提交时更改 add_to_cart 表单来“屏蔽”十进制功能,以便用户输入,以便在提交时1,75 m将转换为175 cm。
- 更改产品、目录和订单页面模板,以便它们以米为单位显示价格信息,因此0.05 €/cm(存储在 DB 中)的值将显示为5 €/m。
只是我的两分钱,但考虑到 ubercart 正在积极开发中,并且 - 尽管最近退出了候选发布状态 - 它仍然有很多错误:你真的希望能够在修复出现时更新你的代码库。
编辑:只是为了强调以上内容:自从我在不到一周前写了这个答案以来,已经发布了两个 UC 更新,其中一个修复了一个关键的安全问题......
希望这可以帮助!
当前的 Uberart (v 2.0) 不允许使用小数表示其数量。
如果您在 Ubercart 论坛中搜索“数量为十进制”、“分数为数量”和“十进制数量”,您会获得一些点击率。本文旨在概述可能对您安装的 Ubercart 系统进行的一些更改,以允许将“小数”添加到您的购物车中。
感谢 Lyle 和他的回复,帮助我开始写这篇文章。
添加到 Ubercart 核心?
我希望 Ubercart 开发人员能够找到一种方法来实现 Ubercart Core 的“分数”功能。我希望这份文件/文章将有助于实现这一目标!
数据库更改
将 Ubercart 更改为接受小数意味着某些表列的数据类型必须从 INTEGER 更改为 FLOAT(M,D)。FLOAT 数据类型允许存储小数。这是来自http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html的描述
这里,“(M,D)”是指总共最多可以存储M位的值,其中D位可以在小数点之后。例如,定义为 FLOAT(7,4) 的列在显示时看起来像 -999.9999。MySQL 在存储值时执行舍入,因此如果将 999.00009 插入 FLOAT(7,4) 列,则近似结果为 999.0001。
以下是对表格进行的更改,以允许 2 个小数位和 6 个总数字。应用以下数据库表更改不应影响现有数据,除非您的数量大于 6 位——在这种情况下,您可以增加 M 值。
// # UC_CART_PRODUCTS
ALTER TABLE `uc_cart_products` MODIFY COLUMN `qty` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 0;
UC_ORDERS
// # UC_ORDERS
ALTER TABLE `uc_orders` MODIFY COLUMN `product_count` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 0;
// # UC_PRODUCTS
ALTER TABLE `uc_products` MODIFY COLUMN `default_qty` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 1.00;
// # UC_ORDER_PRODUCTS
ALTER TABLE `uc_order_products` MODIFY COLUMN `qty` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 0;
代码更改
// # uc_cart.module (line 1445)
db_query("UPDATE {uc_cart_products} SET qty = %d, changed = UNIX_TIMESTAMP(), data = '%s' WHERE cart_item_id = %d",
至...
db_query("UPDATE {uc_cart_products} SET qty = %f, changed = UNIX_TIMESTAMP(), data = '%s' WHERE cart_item_id = %d",
--
// # uc_cart.module (line 1509)
db_query("INSERT INTO {uc_cart_products} (cart_id, nid, qty, changed, data) VALUES ('%s', %d, %d, %d, '%s')", $cid, $node->nid, $qty, time(), serialize($data));
至...
db_query("INSERT INTO {uc_cart_products} (cart_id, nid, qty, changed, data) VALUES ('%s', %d, %f, %d, '%s')", $cid, $node->nid, $qty, time(), serialize($data));
--
// # uc_order.module (line 1043)
db_query("UPDATE {uc_orders} SET uid = %d, order_status = '%s', order_total = %f, product_count = %d, primary_email = '%s', "
至...
db_query("UPDATE {uc_orders} SET uid = %d, order_status = '%s', order_total = %f, product_count = %f, primary_email = '%s', "
--
// # uc_order.module (line 1143)
db_query("UPDATE {uc_orders} SET product_count = %d WHERE order_id = %d", $count, $order->order_id);
至...
db_query("UPDATE {uc_orders} SET product_count = %f WHERE order_id = %d", $count, $order->order_id);
--
// # uc_order.install (replace lines 48 to 51)
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
和...
'type' => 'float',
'precision' => '6',
'scale' => '2',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 1.00,
--
// # uc_product.module (line 1207)
db_query("UPDATE {uc_cart_products} SET qty = %d, changed = %d WHERE nid = %d AND cart_id = '%s' AND data = '%s'", $qty, time(), $nid, $cid, serialize($data));
至...
db_query("UPDATE {uc_cart_products} SET qty = %f, changed = %d WHERE nid = %d AND cart_id = '%s' AND data = '%s'", $qty, time(), $nid, $cid, serialize($data));
--
想法 - 额外的变化
添加一些功能以允许选择是否允许某个产品类型/类别接受“小数”可能是一个好主意。可能会在 uc_product_classes 表或 uc_products 表中添加一个布尔列(如“allow_frac_qty”)。那么当然,会有更多的代码添加/更改来实现这一点。此外,可能还需要更改 uc_products 表中的“pkg_qty”列
其他 Ubercart 论坛帖子
http://www.ubercart.org/forum/support/4651/use_fractions_quantity_15_yards
http://www.ubercart.org/forum/support/6074/decimal_quantities_items
http://www.ubercart.org/issue/6044/abiility_have_decimal_quantities
http://www.ubercart.org/forum/ideas_and_suggestions/3283/comma_values_quantity_field
以防万一有人需要 robnardo 消息中的解决方案,但申请 drupal 7, ubercart 3 - 我在这里描述了 Drupal 7, Ubercart 3.1 中对我有用的东西: http ://www.ubercart.org/project/uc_decimal_quantities#comment -68750
mac 做对了。这种方法更简单,更不容易出现维护问题。
它还可以轻松地支持任何类型的测量,使用 JavaScript 生成测量系统的下拉列表并在提交时进行转换。
我在http://www.ubercart.org/issue/6044/abiility_have_decimal_quantities上发布了一个我正在开发的模块……请留下您的反馈。