Encoderast
@Encoderast
frontend пытается что-то делать в backend

Как удалить одну единицу товара в корзине?

Всем привет!

Есть корзина:
<?php foreach($session['cart'] as $id => $item):?>
                <tr>
                    <td><?= \yii\helpers\Html::img($item['img'], ['alt' => $item['name'], 'height' => 50]) ?></td>
                    <td><?= $item['name']?></td>
                    <td><?= $item['qty']?><span data-id="<?= $id ?>" type="submit" class="add-to-cart"><span class="button__inc">+</span></span></td>
                    <td><?= $item['price']?></td>
                    <td><span data-id="<?= $id?>" class="glyphicon glyphicon-remove text-danger del-item" aria-hidden="true"></span></td>
                </tr>
            <?php endforeach?>


Есть js добавления

$('.add-to-cart').on('click', function (e) {
        e.preventDefault();
        var id = $(this).data('id'),
            qty = $(this).prev('.js-qty').val();
        $.ajax({
            url: '/cart/add',
            data: {id: id, qty: qty},
            type: 'GET',
            success: function(res){
                if(!res) alert('Ошибка!');
                showCart(res);
            },
            error: function(){
                alert('Error!');
            }
        });
    });


Добавление если уже в корзине
$('#cart .modal-body').on('click', '.add-to-cart', function () {
        var id = $(this).data('id'),
            qty = $(this).prev('.js-qty').val();
        $.ajax({
            url: '/cart/add',
            data: {id: id, qty: qty},
            type: 'GET',
            success: function(res){
                if(!res) alert('Ошибка!');
                showCart(res);
            },
            error: function(){
                alert('Error!');
            }
        });
    });


Полностью удаление позиции
$('#cart .modal-body').on('click', '.del-item', function(){
        var id = $(this).data('id');
        $.ajax({
            url: '/cart/del-item',
            data: {id: id},
            type: 'GET',
            success: function(res){
                if(!res) alert('Ошибка!');
                showCart(res);
            },
            error: function(){
                alert('Error!');
            }
        });
    });


И также контроллеры
Жмяк
public function actionAdd(){
        $id = Yii::$app->request->get('id');
        $qty = (int)Yii::$app->request->get('qty');
        $qty = !$qty ? 1 : $qty;

        $product = Product::findOne($id);
        if(empty($product)) return false;
        $session =Yii::$app->session;
        $session->open();
        $cart = new Cart();
        $cart->addToCart($product, $qty);
        if( !Yii::$app->request->isAjax ){
            return $this->redirect(Yii::$app->request->referrer);
        }
        $this->layout = false;
        return $this->render('cart-modal', compact('session'));
    }

    public function actionClear(){
        $session =Yii::$app->session;
        $session->open();
        $session->remove('cart');
        $session->remove('cart.qty');
        $session->remove('cart.sum');
        $this->layout = false;
        return $this->render('cart-modal', compact('session'));
    }

    public function actionDelItem(){
        $id = Yii::$app->request->get('id');
        $session =Yii::$app->session;
        $session->open();
        $cart = new Cart();
        $cart->recalc($id);
        $this->layout = false;
        return $this->render('cart-modal', compact('session'));
    }

Модель удаления полностью всей позиции
public function recalcp($id){
        if(!isset($_SESSION['cart'][$id])) return false;
        $qtyMinus = $_SESSION['cart'][$id]['qty'];
        $sumMinus = $_SESSION['cart'][$id]['qty'] * $_SESSION['cart'][$id]['price'];
        $_SESSION['cart.qty'] -= $qtyMinus;
        $_SESSION['cart.sum'] -= $sumMinus;
        unset($_SESSION['cart'][$id]);
    }



Как сделать так, чтоб при количестве в 4 штуки удалить 1 единицу, а не всю позицию?
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
Exploding
@Exploding
wtf?
Может хватит уже этих "плюсиков" и "черточек" возле инпутов? Есть же нормальный spinEdit в виде input type="number", где можно как свободно указать необходимое кол-во, так и наклацать мышкой, при этом в параметрах поля можно задать мин и макс значения, шаг и это все будет корректно обрабатывать браузер, а вам остается только при событии blur передать значение в функцию типа: updateItemCart(id, qty)
Вот интересно было бы на вас посмотреть, если бы вам в магазине с подобной реализацией корзины, понадобилось добавить в нее, например 1500 п/м кабеля, который продается от 1 м/п.

data-id="<?= $id?>" - я бы повесил на tr, как на главный контейнер позиции, и было бы проще искать дочерние элементы.

и убрать type="submit" со span-a, тогда и preventDefault не понадобится, да и формы то нет там никакой, а значит и код еще валиднее станет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы