Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Доброе времени форумчани!

 

Можете направить или подсказать как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт.

 

Спасибо

 

 

Ссылка на сообщение
Поделиться на другие сайты

Объясните для каких это товаров можно применить?

Какого товара может быть 2.20 шт.? Может речь о весе?

Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.)

Ссылка на сообщение
Поделиться на другие сайты

Объясните для каких это товаров можно применить?

Какого товара может быть 2.20 шт.? Может речь о весе?

Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.)

В данном случае метры, для каждого варианта не надо.

 

В базе поменял в таблице s_variants поменял у поля stock Тип на decimal(14,2) , а где можно посмотреть код который отвечает за передачу в корзину и округление значения?

Изменено пользователем airdigital
Ссылка на сообщение
Поделиться на другие сайты

В данном случае метры, для каждого варианта не надо.

В базе поменял в таблице s_variants поменял у поля stock Тип на decimal(14,2)...

Вы же сами себе противоречите.
Ссылка на сообщение
Поделиться на другие сайты

Вы же сами себе противоречите.

 

Объясните для каких это товаров можно применить? - для товаров у которых измерения идут в граммах, сантиметрах и прочее.

Какого товара может быть 2.20 шт.? Может речь о весе? - речь не о весе а метрах и сантиметрах, ошибся в написании не "шт", а метры.

Вообще можно сделать для каждого варианта товара свою единицу измерения (грамм, шт., ящик и т.д.) - для каждого варианта не надо.

Изменено пользователем airdigital
Ссылка на сообщение
Поделиться на другие сайты

"Для каждого варианта не надо" но Вы же как раз проделываете те действия которые как раз таки для каждого варианта товара.

Ссылка на сообщение
Поделиться на другие сайты

"Для каждого варианта не надо" но Вы же как раз проделываете те действия которые как раз таки для каждого варианта товара.

Да видимо не так понял  ;)

Ссылка на сообщение
Поделиться на другие сайты

Можете направить или подсказать как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт.

Надо переделывать все места, связанные с количеством, в частности в корзине и заказе, чтобы работало с дробными величинами.

Мест таких довольно много.

Если готовы оплачивать - обращайтесь.

Ссылка на сообщение
Поделиться на другие сайты

Все сделано, чуть позже будет выложено в паблик  :)

Паблик решения вопроса ТС уже давно есть в этой статье.

Удачи!

Ссылка на сообщение
Поделиться на другие сайты

Паблик решения вопроса ТС уже давно есть в этой статье.

Удачи!

 

Ничего подобного!

По ссылке отнюдь не решение вопроса ТС, там всего лишь меняется наименования единиц измерения.

А вопрос был существенно другой - о ДРОБНЫХ значениях количества:

 

...как сделать чтобы можно было добавлять в корзину не целое число товаров - 1, 2, 3, 4 шт , а 1.20, 2.20 шт.

Ссылка на сообщение
Поделиться на другие сайты

 

Ничего подобного!

По ссылке отнюдь не решение вопроса ТС, там всего лишь меняется наименования единиц измерения.

А вопрос был существенно другой - о ДРОБНЫХ значениях количества:

 

Может быть, все может быть...
Ссылка на сообщение
Поделиться на другие сайты

 

Может быть, все может быть...


Да вопрос был именно про дробную часть единицы товара

Пока выложить в готовые решения не могу, так как статус не позволяет, поэтому отвечаю на свой вопрос сам :)

Задача стояла добавлять товары не целым числом, а дробным, то есть 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

меняем стр. 248
id}]>{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

меняем стр. 11
data: {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}>


Вроде ничего не упустил, если что-то не получиться пишите, у меня все работает и остатки списываются как надо.
Если кто-то может улучшить данное решение, моего вопроса, жду комментариев с примерами, что где подправить или поменять :)

Таких слов как - "можно сделать лучше" , "я бы сделал по другому" или "это костыль" прошу не писать, если пишете примеры в студию  B) Изменено пользователем airdigital
Ссылка на сообщение
Поделиться на другие сайты

 

 

Да вопрос был именно про дробную часть единицы товара

 

меняем, стр. 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.

Ссылка на сообщение
Поделиться на другие сайты

Этап - 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">
Ссылка на сообщение
Поделиться на другие сайты

К замечаниям 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). Было бы намного проще...

Ссылка на сообщение
Поделиться на другие сайты

К замечаниям 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">

тут почему то редактор все скушал, чуть позже просто в файл перепишу и приложу....первый блин комом (

Изменено пользователем airdigital
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...