Дайте десятичное количество в корзину класса в php - PullRequest
0 голосов
/ 21 февраля 2020

Я использую этот класс корзины на своей странице.

Моя проблема в том, что теперь с этим классом я не могу передать десятичное количество из продукта в корзину.

Если минимальное количество, которое я могу заказать, составляет 15,78 м2, программа добавит его в корзину, но значение количества 15,78 будет «преобразовано» в 1.

Как я могу изменить функцию добавления в классе для этого? Теперь код является оригинальным, я не изменил его.

public function add($id, $quantity = 1, $attributes = array())
{
    $quantity = (preg_match('/^\d+$/', $quantity)) ? $quantity : 1;
    $attributes = (is_array($attributes)) ? array_filter($attributes) : $attributes = array();
    $hash = md5(json_encode($attributes));

    if (count($this->items) >= $this->cartMaxItem && $this->cartMaxItem != 0) 
    {
        return false;
    }

    if (isset($this->items[$id]))
    {
        foreach ($this->items[$id] as $index => $item) 
        {
            if ($item['hash'] == $hash) 
            {
                $this->items[$id][$index]['quantity'] += $quantity;
                $this->items[$id][$index]['quantity'] = ($this->itemMaxQuantity < $this->items[$id][$index]['quantity'] && $this->itemMaxQuantity != 0) ? $this->itemMaxQuantity : $this->items[$id][$index]['quantity'];

                $this->write();
                return true;
            }
        }
    }

    $this->items[$id][] = array
    (
        'id'         => $id,
        'quantity'   => ($quantity > $this->itemMaxQuantity && $this->itemMaxQuantity != 0) ? $this->itemMaxQuantity : $quantity,
        'hash'       => $hash,
        'attributes' => $attributes,
    );

    $this->write();
    return true;
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Эта строка (preg_match('/^\d+$/', $quantity)) ? $quantity : 1 является троичным оператором, который сопоставляет заданное количество с шаблоном регулярного выражения, который говорит: «Если заданное количество является любой последовательностью, по крайней мере, целого числа или более (то есть 1 is true, 432 is true, 84835 is true, 2 is true, 2.78 is false), затем передайте его как есть. Если данное количество не соответствует шаблону регулярного выражения (т.е. 2.78 which is false), тогда присвойте значение 1 этой переменной ".

В вашем случае вы можете либо создать шаблон регулярного выражения, например /^\d+\.\d+$/, который будет принимать все виды чисел, разделенных точкой (то есть 2.78 is true, 22.78 is true, 84728774.87923587 is true), либо вы можете свести шаблон регулярного выражения вверх по вашему желанию десятичных знаков, как это /\d+\.\d{2,3}/. Этот шаблон принимает только 2 or 3 digits после точки, что означает, что числа как 2.78, 22.789 or 287398724.32 are accepted, но числа как 2.8 or 2.9084 are NOT accepted. Это все для регулярных выражений.

После исправления шаблона регулярных выражений вы всегда можете использовать метод типизации для своего результата, например $this->items[$id][$index]['quantity'] += (float)$quantity;, чтобы добавить его к вашему итогу.

Убедитесь, что ваши количества всегда рассматриваются как числа с плавающей точкой, даже если вы используете целые числа. Например, количество 1 должно быть 1.00.

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

Надеюсь, это поможет!

0 голосов
/ 21 февраля 2020

Если я правильно прочитал документацию, вы добавляете товар и количество в корзину и при необходимости добавляете дополнительную информацию. Эта информация может быть вашей 15,78 м2. Таким образом, клиент заказал 1x 15,78 м2 из чего-то с идентификатором в вашем Магазине.

«cartMaxItem» и «itemMaxQuantity» относятся к типу данных int, так что вы можете изменить это или изменить логин магазина c на продать не м ^ 2, а см ^ 2 и указать сумму см ^ 2, которую покупатель может купить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...