Ubercart 2.0 - список изменений кода, позволяющих использовать дробные количества?

Asked
Viewd665

2

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

  • Привет, мак, я создал специальный модуль, чтобы справиться с этим.Спасибо за вопрос.

    robnardo30 октября 2011, 19:47
  • Просто любопытно… как у вас все получилось?

    mac16 декабря 2009, 20:01

5 ответов

3

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

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

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

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

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

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

  • Да, в этом есть смысл.Если мне придется вернуться к этому вопросу, я подойду к нему таким же образом.я, вероятно, должен отдать вам должное за этот ответ.

    robnardo30 октября 2011, 19:50
0

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

1

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

0

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

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

1

Текущая версия Uberart (версия 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