Дробное количество товара
- avers_inc
- Автор темы
- Не в сети
- Новый участник
Less
Больше
- Сообщений: 2
- Спасибо получено: 0
13 года 6 мес. назад #538
от avers_inc
avers_inc создал тему: Дробное количество товара
Доброго времени суток!
Делаю магазин на Virtuemart. Уже почти доделал. И вдруг столкнулся с неожиданной (как минимум для меня) проблемой: оказывается количество товара может быть только целым числом.
У меня в магазине товар учитывается в тоннах и цены указываются за тонну. Но заказывать могут не обязательно целую тонну, а, например, 0,35 тонны и, соответственно, количество на складе тоже может быть дробным.
Что можете посоветовать на этот счет? Я обыскал уже все. Странно, но похоже, таких вопросов никто не задавал.
Дело в том, что в базе данных, поле количества товара на складе типа INT, достаточно ли будет только изменить тип этого поля или надо, что-то менять и в коде?
А также количество заказываемого товара: какие таблицы, поля и код еще нужно изменить, чтоб работать с дробным количеством.
Делаю магазин на Virtuemart. Уже почти доделал. И вдруг столкнулся с неожиданной (как минимум для меня) проблемой: оказывается количество товара может быть только целым числом.
У меня в магазине товар учитывается в тоннах и цены указываются за тонну. Но заказывать могут не обязательно целую тонну, а, например, 0,35 тонны и, соответственно, количество на складе тоже может быть дробным.
Что можете посоветовать на этот счет? Я обыскал уже все. Странно, но похоже, таких вопросов никто не задавал.
Дело в том, что в базе данных, поле количества товара на складе типа INT, достаточно ли будет только изменить тип этого поля или надо, что-то менять и в коде?
А также количество заказываемого товара: какие таблицы, поля и код еще нужно изменить, чтоб работать с дробным количеством.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Wedal
- Не в сети
- Администратор
Less
Больше
- Сообщений: 2868
- Спасибо получено: 659
13 года 6 мес. назад #541
от Wedal
Wedal ответил в теме Re: Дробное количество товара
avers_inc, в вашем случае я вижу только одно более-менее простое решение - перевод всех дробных чисел в целые. Т.е., к примеру, в килограммы. Таким образом, единицей товара у вас будет 1 его килограмм. И цены будут указаны именно за килограмм. Если все сделать так, то пользователь зайдет на страницу товара, введет в поле "количество" скажем 350, и нажмет кнопку "Купить". 350кг товара добавится в корзину и автоматически будет вычислена общая стоимость.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- avers_inc
- Автор темы
- Не в сети
- Новый участник
Less
Больше
- Сообщений: 2
- Спасибо получено: 0
13 года 6 мес. назад - 13 года 6 мес. назад #546
от avers_inc
avers_inc ответил в теме Re: Дробное количество товара
Спасибо, Wedal, за быстрый ответ.
Да - это решение самое простое, но к сожалению, врядли применимо в моем случае... Думаю, что рынок металлопроката будет ухахатываться, если я выставлю цены за килограм.
Да и учет ведется в тоннах.
В принципе, я уже нашел решение... даже 2
Для тех, кому тоже не применимо решение с целыми числами, рассказываю:
Решение 1. (На этом решении пока я остановился):
1) в БД в таблице jos_wm_product поле product_in_stock меняем тип int на float
2) дальше работаем с файлом ../administrator/components/com_virtuemart/classes/ps_product.php
- в функции add находим строку 'product_in_stock' => vmRequest::getInt('product_in_stock'), и меняем getInt на getFloat
- в функции update делаем тоже самое
Теперь уже можно писать в остатках на складе дробные числа. Но еще остается сделать чтоб можно было при покупке вводить дробное число.
3) в БД в таблице jos_wm_order_item поле product_quantity меняем тип int на float
4) дальше работаем с файлом ../administrator/components/com_virtuemart/classes/ps_cart.php
- в функции add находим строку $quantity = intval($quantity); и комментируем ее или удаляем
- в функции update в строке $quantity = isset($d["quantity"]) ? (int)$d["quantity"] : 1; меняем int на float (наверно можно просто убрать (int), но лучше наверняка )
- и аналогично делаем в функции updateSaved
Вроде бы все, если я ничего не забыл. Не протестировано еще на 100%, но вроде работает.
Решение 2. (Пока только в теории)
Заключается в том, чтоб данные в базе все таки хранились в целых числах, а пользователь вводил дробные и отображались тоже дробные...
Проще объяснить на примере: цены у меня в БД указываются за тонну, а количество товара в кг, но при выводе и подсчете общей суммы просто приводить единицы количества товара к тоннам. аналогично при вводе: пользователь вводит дробное число в тоннах, а в расчете сразу приводится к кг.
Второе решение мне кажется более правильным по двум причинам: во-первых меньшее вмешательство в ядро и структуру БД, а во-вторых с целыми числами конечно проще работать, чем с плавающей точкой; но возможно более сложно буде отследить все моменты, когда надо приводить величины.
Вообще (я еще не очень разбирался в объектной структуре Virtuemart) не плохо было бы добавить какой-нибудь наследуемый класс-посредник для преобразования величин. Его также можно было бы использовать, например, для случая, когда покупатель хочет купить не 2 тонны какой-нибудь трубы, а 10 метров. Тогда просто нужно хранить для товара дополнительное поле с коеффициентом перевода, а пользователь сможет выбирать в каких единицах делать заказ.
P.S. Wedal, искреннее спасибо за отличный ресурс! особенно на тему Virtuemart.
Вот бы еще какой-нить CCK также подробно разобрать, например, jSeblod,.... ну или К2 на крайняк
Да - это решение самое простое, но к сожалению, врядли применимо в моем случае... Думаю, что рынок металлопроката будет ухахатываться, если я выставлю цены за килограм.
Да и учет ведется в тоннах.
В принципе, я уже нашел решение... даже 2
Для тех, кому тоже не применимо решение с целыми числами, рассказываю:
Решение 1. (На этом решении пока я остановился):
1) в БД в таблице jos_wm_product поле product_in_stock меняем тип int на float
2) дальше работаем с файлом ../administrator/components/com_virtuemart/classes/ps_product.php
- в функции add находим строку 'product_in_stock' => vmRequest::getInt('product_in_stock'), и меняем getInt на getFloat
- в функции update делаем тоже самое
Теперь уже можно писать в остатках на складе дробные числа. Но еще остается сделать чтоб можно было при покупке вводить дробное число.
3) в БД в таблице jos_wm_order_item поле product_quantity меняем тип int на float
4) дальше работаем с файлом ../administrator/components/com_virtuemart/classes/ps_cart.php
- в функции add находим строку $quantity = intval($quantity); и комментируем ее или удаляем
- в функции update в строке $quantity = isset($d["quantity"]) ? (int)$d["quantity"] : 1; меняем int на float (наверно можно просто убрать (int), но лучше наверняка )
- и аналогично делаем в функции updateSaved
Вроде бы все, если я ничего не забыл. Не протестировано еще на 100%, но вроде работает.
Решение 2. (Пока только в теории)
Заключается в том, чтоб данные в базе все таки хранились в целых числах, а пользователь вводил дробные и отображались тоже дробные...
Проще объяснить на примере: цены у меня в БД указываются за тонну, а количество товара в кг, но при выводе и подсчете общей суммы просто приводить единицы количества товара к тоннам. аналогично при вводе: пользователь вводит дробное число в тоннах, а в расчете сразу приводится к кг.
Второе решение мне кажется более правильным по двум причинам: во-первых меньшее вмешательство в ядро и структуру БД, а во-вторых с целыми числами конечно проще работать, чем с плавающей точкой; но возможно более сложно буде отследить все моменты, когда надо приводить величины.
Вообще (я еще не очень разбирался в объектной структуре Virtuemart) не плохо было бы добавить какой-нибудь наследуемый класс-посредник для преобразования величин. Его также можно было бы использовать, например, для случая, когда покупатель хочет купить не 2 тонны какой-нибудь трубы, а 10 метров. Тогда просто нужно хранить для товара дополнительное поле с коеффициентом перевода, а пользователь сможет выбирать в каких единицах делать заказ.
P.S. Wedal, искреннее спасибо за отличный ресурс! особенно на тему Virtuemart.
Вот бы еще какой-нить CCK также подробно разобрать, например, jSeblod,.... ну или К2 на крайняк
Последнее редактирование: 13 года 6 мес. назад пользователем avers_inc.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Wedal
- Не в сети
- Администратор
Less
Больше
- Сообщений: 2868
- Спасибо получено: 659
13 года 6 мес. назад #547
от Wedal
Wedal ответил в теме Re: Дробное количество товара
avers_inc, да, про CCK с вами согласен. Ждем выхода SEBLOD 2.0 для Joomla 1.6. Потом по нему будет серия статей, надеюсь, что не меньше, чем по Virtuemart'у.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.