Ubercart 2.0 - список изменений кода для учета дробных величин? - PullRequest
2 голосов
/ 13 ноября 2009

Я работаю над проектом Ubercart 2.0 для клиента. Это для магазина ткани. Они хотят, чтобы покупатели могли добавлять дробные количества (или десятичное количество), например 1,75 м. У кого-нибудь есть полный список изменений кода , которые позволят эту функцию?

Ответы [ 5 ]

3 голосов
/ 14 ноября 2009

Я думаю, что изменение ядра Ubercart для достижения того, что вы имеете в виду, - плохая идея . По сути, вы обречены на то, что у вас не будет возможности обновлять / обновлять, когда есть исправления безопасности, и, возможно, какой-то другой модуль предположит, что вы используете целое число, уступая место трудно отслеживаемым ошибкам и исключениям php.

Я не проводил расширенный поиск, как предыдущий плакат, но, если бы мне пришлось самому реализовать вашу потребность, я бы сказал:

  1. Используйте сантиметры (целые числа) в качестве логической единицы измерения в серверной части.
  2. "Маскировать" десятичную функциональность путем изменения форм add_to_cart во время проверки / отправки для пользовательского ввода, чтобы при отправке 1,75 м преобразовывалось в 175 см .
  3. Измените шаблоны страниц продуктов, каталогов и заказов , чтобы они отображали информацию о ценах в метрах, чтобы значение 0,05 € / см (сохраненное в БД) будет отображаться как 5 € / м .

Только мои два цента, но учтите, что Ubercart находится в активной разработке и - несмотря на недавний выход из состояния кандидата на выпуск - у него все еще есть много ошибок: вы действительно хотите иметь возможность обновлять свою кодовую базу, когда появляются исправления.

РЕДАКТИРОВАТЬ: просто подчеркнуть то, что выше: так как я написал этот ответ менее недели назад, вышло два обновления UC, одно из которых исправляет критическую проблему безопасности ...

Надеюсь, это поможет!

1 голос
/ 19 июля 2012

На всякий случай, если кому-то нужно решение из сообщения Робнардо, но подать заявку на Drupal 7, Ubercart 3 - я описал, что сработало для меня в Drupal 7, Ubercart 3.1 здесь: http://www.ubercart.org/project/uc_decimal_quantities#comment-68750

1 голос
/ 13 ноября 2009

Текущий 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

0 голосов
/ 05 января 2010

Я разместил модуль, над которым работаю http://www.ubercart.org/issue/6044/abiility_have_decimal_quantities ... Пожалуйста, оставьте свой отзыв.

0 голосов
/ 17 ноября 2009

Маки правильно поняли. Такой подход намного проще и менее подвержен проблемам обслуживания.

Было бы также тривиально поддерживать любой тип измерения с использованием JavaScript для создания выпадающего списка системы измерения и выполнения преобразования при отправке.

...