Не удается обновить количество в десятичных точках в пакете корзины DarrylDeCode - PullRequest
0 голосов
/ 04 августа 2020

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

количество товаров может быть в «кг» и может быть 1,0, 1,25, 1,50 и т. д.

PS: Я использую Laravel DarrylDecode Поставщик услуг корзины

Вот код функции обновления корзины, которую я написал и отлично работает для недесятичных количественных чисел:

public function update(Request $request)
{
    $row = count($request->id);
    for ($i = 0; $i < $row; $i++) {
        Cart::update($request->id[$i], [
            'quantity' => array(
                'relative' => false,
                'value' => $request->quantity[$i],
            ),
        ]);
    }
}

Вот код функции обновления предоставленный Darryldecode. Я нашел его по следующему пути: Vendor / darryldecode / Cart / Cart. php

public function update($id, $data)
{
    if ($this->fireEvent('updating', $data) === false) {
        return false;
    }

    $cart = $this->getContent();
    $item = $cart->pull($id);

    foreach ($data as $key => $value) {
        // if the key is currently "quantity" we will need to check if an arithmetic
        // symbol is present so we can decide if the update of quantity is being added
        // or being reduced.
        if ($key == 'quantity') {
            // we will check if quantity value provided is array,
            // if it is, we will need to check if a key "relative" is set
            // and we will evaluate its value if true or false,
            // this tells us how to treat the quantity value if it should be updated
            // relatively to its current quantity value or just totally replace the value
            if (is_array($value)) {
                if (isset($value['relative'])) {
                    if ((bool)$value['relative']) {
                        $item = $this->updateQuantityRelative($item, $key, $value['value']);
                    } else {
                        $item = $this->updateQuantityNotRelative($item, $key, $value['value']);
                    }
                }
            } else {
                $item = $this->updateQuantityRelative($item, $key, $value);
            }
        } elseif ($key == 'attributes') {
            $item[$key] = new ItemAttributeCollection($value);
        } else {
            $item[$key] = $value;
        }
    }

    $cart->put($id, $item);
    $this->save($cart);
    $this->fireEvent('updated', $item);
    
    return true;
}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

1 - в файле конфигурации darryldecode/laravelshoppingcart вам необходимо изменить значение SHOPPING_FORMAT_VALUES на true, чтобы включить format_numbers

2- изменить SHOPPING_DECIMALS на нужное количество десятичных знаков.

по умолчанию SHOPPING_DECIMALS установлено на 0.

, но для лучшей практики вы должны использовать наименьшую единицу по умолчанию для суммы feilds (деньги, количество, зарплата).

в вашем коде вы должны использовать 1000 вместо 1 для KG и вычислить его в своем коде, чтобы отобразить и сохранить его так, как вам нравится.

0 голосов
/ 04 августа 2020

Взгляните на исходный код этого пакета (https://github.com/darryldecode/laravelshoppingcart/blob/23fa7ef44f404d97131d73701a5dc6c37361d335/src/Darryldecode/Cart/Cart.php#L815):

protected function updateQuantityNotRelative($item, $key, $value)
{
    $item[$key] = (int)$value;

    return $item;
}

Это функция, которую вы используете при установке 'relative' => false,. Он всегда устанавливает значение int.

С relative => true он использует тот же подход с подсказкой типа (int):

protected function updateQuantityRelative($item, $key, $value)
{
    if (preg_match('/\-/', $value) == 1) {
        $value = (int)str_replace('-', '', $value);

        // we will not allowed to reduced quantity to 0, so if the given value
        // would result to item quantity of 0, we will not do it.
        if (($item[$key] - $value) > 0) {
            $item[$key] -= $value;
        }
    } elseif (preg_match('/\+/', $value) == 1) {
        $item[$key] += (int)str_replace('+', '', $value);
    } else {
        $item[$key] += (int)$value;
    }

    return $item;
}

Я думаю, этот пакет по дизайну не соответствует Не допускаются нецелые количества. В качестве альтернативы вы можете разработать свое приложение для использования grams (g) вместо kilograms (kg), и они будут использовать целое число, например 1,5 кг = 1500 г, или использовать другой пакет.

...