Текущий Uberart (v 2.0) не допускает десятичные дроби для их количества.
Если вы ищите на форумах Ubercart «количество как десятичное число», «дробь для количества» и «десятичное количество», вы получите несколько посещений. В этой статье описываются некоторые изменения, которые могут быть внесены в установленную систему Ubercart, чтобы разрешить добавление «дробных количеств» в вашу корзину.
Спасибо Лайлу и его посту, который помог мне начать работу с этой статьей .
Добавить в Ubercart Core?
Я надеюсь, что разработчики 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));
-
Мысли - Дополнительные изменения
Вероятно, было бы неплохо добавить некоторые функциональные возможности, позволяющие сделать выбор в отношении того, разрешено ли определенному типу / классу продукта принимать «дробные количества». Возможно добавление логического столбца (например, «allow_frac_qty») в таблицу uc_product_classes или в таблицу uc_products. Тогда, конечно, было бы больше дополнений / изменений кода, чтобы учесть это. Кроме того, столбец «pkg_qty» в таблице uc_products также может потребоваться изменить
Другие сообщения на форуме 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