airdigital Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 Доброе времени форумчани! Можете направить или подсказать как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт. Спасибо Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 Объясните для каких это товаров можно применить? Какого товара может быть 2.20 шт.? Может речь о весе? Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.) Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 24 января, 2016 Автор Жалоба Поделиться Опубликовано 24 января, 2016 (изменено) Объясните для каких это товаров можно применить?Какого товара может быть 2.20 шт.? Может речь о весе?Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.)В данном случае метры, для каждого варианта не надо. В базе поменял в таблице s_variants поменял у поля stock Тип на decimal(14,2) , а где можно посмотреть код который отвечает за передачу в корзину и округление значения? Изменено 24 января, 2016 пользователем airdigital Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 В данном случае метры, для каждого варианта не надо.В базе поменял в таблице s_variants поменял у поля stock Тип на decimal(14,2)...Вы же сами себе противоречите. Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 24 января, 2016 Автор Жалоба Поделиться Опубликовано 24 января, 2016 (изменено) Вы же сами себе противоречите. Объясните для каких это товаров можно применить? - для товаров у которых измерения идут в граммах, сантиметрах и прочее.Какого товара может быть 2.20 шт.? Может речь о весе? - речь не о весе а метрах и сантиметрах, ошибся в написании не "шт", а метры.Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.) - для каждого варианта не надо. Изменено 24 января, 2016 пользователем airdigital Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 "Для каждого варианта не надо" но Вы же как раз проделываете те действия которые как раз таки для каждого варианта товара. Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 24 января, 2016 Автор Жалоба Поделиться Опубликовано 24 января, 2016 "Для каждого варианта не надо" но Вы же как раз проделываете те действия которые как раз таки для каждого варианта товара.Да видимо не так понял Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 Можете направить или подсказать как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт.Надо переделывать все места, связанные с количеством, в частности в корзине и заказе, чтобы работало с дробными величинами. Мест таких довольно много. Если готовы оплачивать - обращайтесь. Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 24 января, 2016 Автор Жалоба Поделиться Опубликовано 24 января, 2016 Все сделано, чуть позже будет выложено в паблик Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2016 Жалоба Поделиться Опубликовано 24 января, 2016 Все сделано, чуть позже будет выложено в паблик Паблик решения вопроса ТС уже давно есть в этой статье. Удачи! Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 января, 2016 Жалоба Поделиться Опубликовано 25 января, 2016 Паблик решения вопроса ТС уже давно есть в этой статье.Удачи! Ничего подобного!По ссылке отнюдь не решение вопроса ТС, там всего лишь меняется наименования единиц измерения.А вопрос был существенно другой - о ДРОБНЫХ значениях количества: ...как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 25 января, 2016 Жалоба Поделиться Опубликовано 25 января, 2016 Ничего подобного!По ссылке отнюдь не решение вопроса ТС, там всего лишь меняется наименования единиц измерения.А вопрос был существенно другой - о ДРОБНЫХ значениях количества: Может быть, все может быть... Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 26 января, 2016 Автор Жалоба Поделиться Опубликовано 26 января, 2016 (изменено) Может быть, все может быть...Да вопрос был именно про дробную часть единицы товараПока выложить в готовые решения не могу, так как статус не позволяет, поэтому отвечаю на свой вопрос сам Задача стояла добавлять товары не целым числом, а дробным, то есть 1.01 или же 1.10Решение получилось не универсальным, то есть без возможности выбора варианта учета (скорей всего будет доработка для выбора)Этап - 1. Работаем с таблицей1. В таблице s_variants меняем тип у поля stock decimal(14,2)2. В таблице s_purchases меняем тип у поля amount decimal(14,2)Этап - 2. Работаем с шаблоном пользовательской части (default)В папке .design/default/html/cart.tplменяем, стр. 39{section name=amounts start=1 loop=$purchase->variant->stock+1 step=1}amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {$settings->units}{/section}наvariant->stock + $purchase->amount} value="{$purchase->amount}" onchange="document.cart.submit();">onchange="document.cart.submit();"- можете не делать, а использовать свою кнопку с обработкой отправки формы (будет более правильно)step="0.1"- это шаг выбора количества, можно указать 0.01Этап - 3. Работаем с шаблоном административной частиВ папка .simpla/design/html/order.tplменяем стр. 248id}]>{section name=amounts start=1 loop=$loop+1 step=1}amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {$settings->units}{/section}наid}] step=0.1 min=0.1 max={$purchase->variant->stock + $purchase->amount} value={$purchase->amount} style="width: 70px;">Визуальная часть на этом законченаЭтап - 4. Переходит в обработке количества товара, если можно так выразить убираем округление товара.4.1 - в папка .view/CartView.phpменя стр. 111$this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>intval($amount)));на$this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>$amount));на этом работу с файлом заканчиваем4.2 - в папка .api/Cart.phpменяем стр. c 111 по 157/* * * Добавление варианта товара в корзину * */ public function add_item($variant_id, $amount = 1) { $amount = max(1, $amount); if(isset($_SESSION['shopping_cart'][$variant_id])) $amount = max(1, $amount+$_SESSION['shopping_cart'][$variant_id]); // Выберем товар из базы, заодно убедившись в его существовании $variant = $this->variants->get_variant($variant_id); // Если товар существует, добавим его в корзину if(!empty($variant) && ($variant->stock>0) ) { // Не дадим больше чем на складе $amount = min($amount, $variant->stock); $_SESSION['shopping_cart'][$variant_id] = intval($amount); } } /* * * Обновление количества товара * */ public function update_item($variant_id, $amount = 1) { $amount = max(1, $amount); // Выберем товар из базы, заодно убедившись в его существовании $variant = $this->variants->get_variant($variant_id); // Если товар существует, добавим его в корзину if(!empty($variant) && $variant->stock>0) { // Не дадим больше чем на складе $amount = min($amount, $variant->stock); $_SESSION['shopping_cart'][$variant_id] = intval($amount); } }на/* * * Добавление варианта товара в корзину * */ public function add_item($variant_id, $amount = 0.01) { $amount = max(0.1, $amount); if(isset($_SESSION['shopping_cart'][$variant_id])) $amount = max(0.01, $amount+$_SESSION['shopping_cart'][$variant_id]); // Выберем товар из базы, заодно убедившись в его существовании $variant = $this->variants->get_variant($variant_id); // Если товар существует, добавим его в корзину if(!empty($variant) && ($variant->stock>0.00) ) { // Не дадим больше чем на складе $amount = min($amount, $variant->stock); $_SESSION['shopping_cart'][$variant_id] = $amount; } } /* * * Обновление количества товара * */ public function update_item($variant_id, $amount = 0.01) { $amount = max(0.01, $amount); // Выберем товар из базы, заодно убедившись в его существовании $variant = $this->variants->get_variant($variant_id); // Если товар существует, добавим его в корзину if(!empty($variant) && $variant->stock>0.00) { // Не дадим больше чем на складе $amount = min($amount, $variant->stock); $_SESSION['shopping_cart'][$variant_id] = $amount; } }Этап - 5. Добавление количества товара из витрины магазина и списка товаров в категории5.1 -.в папке .design/default/js/ajax_cart.jsменяем стр. 11data: {variant: variant},наdata: {variant: variant,amount: $(this).find('input[name="amount"]').val()},5.2 - в папке ajax/cart.phpменяем стр. 5$simpla->cart->add_item($simpla->request->get('variant', 'integer'), $simpla->request->get('amount', 'integer'));на$simpla->cart->add_item($simpla->request->get('variant', 'integer'), $simpla->request->get('amount'));5.3 - в папке .design/default/html/ в файлах product.tpl и products.tpl добавляем рядом с кнопкой купитьstock}>Вроде ничего не упустил, если что-то не получиться пишите, у меня все работает и остатки списываются как надо.Если кто-то может улучшить данное решение, моего вопроса, жду комментариев с примерами, что где подправить или поменять Таких слов как - "можно сделать лучше" , "я бы сделал по другому" или "это костыль" прошу не писать, если пишете примеры в студию Изменено 26 января, 2016 пользователем airdigital Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 26 января, 2016 Жалоба Поделиться Опубликовано 26 января, 2016 Да вопрос был именно про дробную часть единицы товара меняем, стр. 39 {section name=amounts start=1 loop=$purchase->variant->stock+1 step=1}amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {$settings->units}{/section}на variant->stock + $purchase->amount} value="{$purchase->amount}" onchange="document.cart.submit();"> onchange="document.cart.submit();" этот участок немного не туда написан. в корзине стоит селект, а у вас непонятно что, меняется на непонятно что. надо <select name="amounts[{$purchase->variant->id}]" onchange="document.cart.submit();"> {section name=amounts start=1 loop=$purchase->variant->stock+1 step=1} <option value="{$smarty.section.amounts.index}" {if $purchase->amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {$settings->units}</option> {/section} </select> заменить на <input name="amounts[{$purchase->variant->id}]" value="{$purchase->amount}" onchange="document.cart.submit();" насчет настройки админки, на этапе 3, лучше вывести инпутом а не селектом, нет смысла в селекте если у вас шаг будет в 0.1. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 26 января, 2016 Жалоба Поделиться Опубликовано 26 января, 2016 Этап - 4. Переходит в обработке количества товара, если можно так выразить убираем округление товара. 4.1 - в папка .view/CartView.php меня стр. 111 $this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>intval($amount)));на $this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>$amount));тут можно заменить intval на floatval. хотя впринципе туда не передаются текстовые данные. 5.3 - в папке .design/default/html/ в файлах product.tpl и products.tpl добавляем рядом с кнопкой купить stock}> эта часть вообще загадочна. видимо тут должен был быть инпут <input type="number" name="amount"> Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 27 января, 2016 Жалоба Поделиться Опубликовано 27 января, 2016 К замечаниям mishanya добавлю свои замечания об общей концепции предложенного способа: 1. Предложенный вариант решает совсем не ту задачу, которая была поставлена в начале: ставилась задача задавать ДРОБНЫЕ количества товара для заказа. Решается реально другая - позволяются не произвольно дробные, а всего лишь дробные с одним (или двумя) десятичными знаками...2. Сама реализация содержит ошибки (или, по меньшей мере, странности). Например, в 4.2 стоитpublic function add_item($variant_id, $amount = 0.01) {$amount = max(0.1, $amount);В результате положить в корзину, например, количество 0,02 не удастся.3. Сама ошибка п.2 возникла из-за принципиально неверного подхода. Минимальный шаг количества надо бы задавать в настройках. Было бы и легче менять, и уменьшился бы риск ошибок.4. Если реально стоит задача работать с количествами с точностью до 0.1 или 0.01, до добиться этого можно проще - перейти на другие единицы измерения, например, с метров на сантиметры. Дополнительно, если надо, лишь немного изменить вывод в шаблоне ( разделить на 100, чтобы получилось в метрах) и прием значений количества из форм (всего лишь умножить на 100). Было бы намного проще... Цитата Ссылка на сообщение Поделиться на другие сайты
airdigital Опубликовано 27 января, 2016 Автор Жалоба Поделиться Опубликовано 27 января, 2016 (изменено) К замечаниям mishanya добавлю свои замечания об общей концепции предложенного способа: 1. Предложенный вариант решает совсем не ту задачу, которая была поставлена в начале: ставилась задача задавать ДРОБНЫЕ количества товара для заказа. Решается реально другая - позволяются не произвольно дробные, а всего лишь дробные с одним (или двумя) десятичными знаками...2. Сама реализация содержит ошибки (или, по меньшей мере, странности). Например, в 4.2 стоитpublic function add_item($variant_id, $amount = 0.01) {$amount = max(0.1, $amount);В результате положить в корзину, например, количество 0,02 не удастся.3. Сама ошибка п.2 возникла из-за принципиально неверного подхода. Минимальный шаг количества надо бы задавать в настройках. Было бы и легче менять, и уменьшился бы риск ошибок.4. Если реально стоит задача работать с количествами с точностью до 0.1 или 0.01, до добиться этого можно проще - перейти на другие единицы измерения, например, с метров на сантиметры. Дополнительно, если надо, лишь немного изменить вывод в шаблоне ( разделить на 100, чтобы получилось в метрах) и прием значений количества из форм (всего лишь умножить на 100). Было бы намного проще... Да возможно не так выразился с дробным значением, вы правы, на счет второго пункта описал, что в карточке есть поле ввода, в котором можно указать какое нужно количество. На счет чтобы сделать все в настройках это решение не универсальным, было сказано. На счет упрощения задачи, было изначально так же предложено, как вы описали (кто же хочет тратить свое врем, если можно сделать легче и быстрее), но его отклонили, так как остатки грузятся с десятичной частью и менеджерам не удобно в сантиметрах. тут можно заменить intval на floatval. хотя впринципе туда не передаются текстовые данные. эта часть вообще загадочна. видимо тут должен был быть инпут <input type="number" name="amount"> тут почему то редактор все скушал, чуть позже просто в файл перепишу и приложу....первый блин комом ( Изменено 27 января, 2016 пользователем airdigital Цитата Ссылка на сообщение Поделиться на другие сайты
dmitry Опубликовано 21 июля, 2017 Жалоба Поделиться Опубликовано 21 июля, 2017 может кто поделится решением? не бесплатно) нужны десятые у товара Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.