Ubercart 2.0 - 允许分数数量的代码更改列表?

Posted

技术标签:

【中文标题】Ubercart 2.0 - 允许分数数量的代码更改列表?【英文标题】:Ubercart 2.0 - list of code changes to allow for Fractional Quantities? 【发布时间】:2010-12-16 10:46:44 【问题描述】:

我正在为客户开发 Ubercart 2.0 项目。这是一家面料店。他们希望客户能够添加小数(或小数),例如 1.75 m。有没有人有一个完整的代码更改列表可以实现这个功能?

【问题讨论】:

只是好奇......你最后是怎么做到的? 嘿,mac,我创建了一个自定义模块来处理这个问题。感谢您的提问。 【参考方案1】:

我认为改变 ubercart 核心来实现你的意思是一个坏主意。当有安全修复程序时,您基本上注定自己无法更新/升级,并且可能其他一些模块会假设您使用的是整数,从而让位于难以跟踪的错误和 php 异常。

我没有像上一张海报那样进行广泛的搜索,但如果我必须自己实现您的需求,我会:

    在后端使用厘米(整数)作为逻辑度量单位。 通过在验证/提交时更改 add_to_cart 表单为用户输入“屏蔽”十进制功能,以便在提交时 1,75 m 将被转换175 厘米更改产品、目录和订单页面模板,以便它们以米为单位显示价格信息,以便价值 0.05 €/cm(存储在 DB 中)为显示为 5 €/m

只是我的两分钱,但考虑到 ubercart 正在积极开发中,并且 - 尽管最近退出了候选发布状态 - 它仍然有很多错误:你真的希望能够在修复出现时更新你的代码库。

编辑:只是为了强调上述内容:自从我在不到一周前写下这个答案以来,已经发布了两个 UC 更新,其中一个修复了一个关键的安全问题......

希望这会有所帮助!

【讨论】:

是的,这是有道理的。如果我必须重新访问这个问题,我会以这种方式处理它。我可能应该把这个答案归功于你。【参考方案2】:

当前的 Uberart (v 2.0) 不允许使用小数表示数量。

如果您在 Ubercart 论坛中搜索“数量为十进制”、“分数为数量”和“十进制数量”,您会获得一些点击率。本文旨在概述可能对您安装的 Ubercart 系统进行的一些更改,以允许将“小数”添加到您的购物车中。

感谢 Lyle 和他的帖子回复,帮助我开始使用 this article。

添加到 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

【讨论】:

【参考方案3】:

以防万一有人需要 robnardo 消息中的解决方案,但申请 drupal 7, ubercart 3 - 我在这里描述了 Drupal 7, Ubercart 3.1 中对我有用的内容: http://www.ubercart.org/project/uc_decimal_quantities#comment-68750

【讨论】:

【参考方案4】:

mac 做对了。这种方法更简单,更不容易出现维护问题。

使用 javascript 生成测量系统下拉列表并在提交时进行转换也可以轻松支持任何类型的测量。

【讨论】:

【参考方案5】:

我在http://www.ubercart.org/issue/6044/abiility_have_decimal_quantities 发布了我正在开发的模块...请留下您的反馈。

【讨论】:

以上是关于Ubercart 2.0 - 允许分数数量的代码更改列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubercart 中显示可用库存数量?

允许客户在 UberCart 中查看发票?

向 Ubercart 发票添加自定义字段

如何在 ubercart 中设置主题目录页面?

带有 ubercart 的 drupal 6 或 7

二柱子四则运算2.0版本