Последнее время приходится создавать сайты не уровня визиток и блогов, а что-то покрупнее, поэтому полюбился мне Drupal. Здесь я еще не писал о нем, несмотря на то, что сделано немало, какие-то решения найдены, что-то написано самостоятельно.
Но начну наконец делиться решениями в блоге с темы, обозначенной в заголовке. Суть в том, что этот вопрос неоднократно поднимался как в рунете, так и в буржунете, и даже есть почти решение, но оно не до конца работает.
Собрав воедино информацию из всех источников, я добился возможности задавать дробное количество товара с его страницы и даже изменения этого количества в корзине. Но если количество товара меньше единицы (0.5, например), то при обновлении корзины, а также при изменении количества, он удаляется.
Итак, ниже список действий, который я выполнил, чтобы реализовать дробное количество товара в OpenStore (Ubercart на Drupal 6).
Работа с БД
Для начала необходимо изменить тип данных для количества товаров. Реализуется это выполнением MySQL-запроса. Как его сделать - отдельная тема, тут гугл подскажет. Намекну лишь, что вам потребуется PHPMyAdmin. Запрос следующий:
ALTER TABLE `uc_orders` MODIFY COLUMN `product_count` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE `uc_products` MODIFY COLUMN `default_qty` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 1.00;
ALTER TABLE `uc_order_products` MODIFY COLUMN `qty` FLOAT(6,2) UNSIGNED NOT NULL DEFAULT 0;
Работа с файлами
Все указанные файлы находятся в папке модуля ubercart, номера строк (числа в скобках) могут несколько не совпадать, просто ищите где-то в этом районе.
uc_cart/uc_cart.module (1445)
заменяем на
uc_cart/uc_cart.module (1509)
заменяем на
uc_order/uc_order.module (1043)
заменяем на
uc_order/uc_order.module (1143)
заменяем на
uc_order/uc_order.install (48—51)
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
заменяем на
'precision' => '6',
'scale' => '2',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 1.00,
uc_product/uc_product.module (1204—1205)
uc_cart_remove_item($nid, $cid, $data);
заменяем на
uc_cart_remove_item($nid, $cid, $data);
uc_product/uc_product.module (1208)
заменяем на
uc_product/uc_product.module (1511)
заменяем на
docs/hooks.php (1673—1678)
uc_cart_remove_item($nid, $cid, $data);
}
else {
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));
}
заменяем на
uc_cart_remove_item($nid, $cid, $data);
}
else {
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));
}
Все готово
Если вы видели ранее представленные решения (а точнее попытки), поймете, что я сделал не так много. Вся проблема заключалась в том, что были забыты валидаторы значений, и если количество товара в корзине было меньше единицы, то он удалялся оттуда.
Ускорим познавания процесс,
И в этом нам с тобой поможет
Подписка на информативный RSS...





