CakePHP 3: удалить и обновить массив из файла cookie

Я использую CakePHP 3.2 для написания приложения для корзины покупок.

Я использую cookie для добавления товаров в корзину.

Теперь я хочу обновить и удалить значение из корзины. так что, если пользователь нажмет на тот же продукт add to cart с другим значением quantity, существующая запись будет удалена, а новая будет добавлена ​​в корзину.

Это мой метод addToCart().

public function addToCart()
{
  $this->loadModel('Products');

  if ($this->request->is('post')) {
    $p_id = $this->request->data('product_id');
    $p_quantity = $this->request->data('qnty');

$product = $this->Products->get($p_id);

$product->quantity = $p_quantity;

if (!$product) {
  throw new NotFoundException(__('Invalid Product'));
}

  $cart = $this->Cookie->read('Cart') ? $this->Cookie->read('Cart') : [];

  $itemInCart = false;
  $itemUpdated = false;
  if ($cart != null) {
    foreach($cart as $cart_item):
      if ($cart_item['id'] == $p_id) {
        if ($cart_item['quantity'] != $p_quantity) {
          $this->Cookie->delete('Cart.'.$cart_item);    // line 148
          $cart[] = $product;
          $this->Cookie->write('Cart', $cart);
          $itemsCount = count($this->Cookie->read('Cart'));
          $this->Flash->success('Product updated in cart');
          return $this->redirect($this->referer);
        }
        $itemInCart = true;
      }
    endforeach;
  }

  if (!$itemInCart) {
    $cart[] = $product;
    $this->Cookie->write('Cart', $cart);

    $itemsCount = count($this->Cookie->read('Cart'));

    if ($itemUpdated) {
      $this->Flash->success(__('Product updated in cart'));
    } else {
      $this->Flash->success(__('Product added to cart'));
    }

    return $this->redirect($this->referer());
  } else {
    $this->Flash->success(__('Product is already in cart'));
    return $this->redirect($this->referer());
  }

  }
}

Но это дает ошибку, поскольку

Notice (8): Array to string conversion [APP/Controller/OrdersController.php, line 148]

Как я могу обновить значение количества в корзине.


person Anuj TBE    schedule 13.07.2016    source источник
comment
что в строке 148?   -  person claudios    schedule 13.07.2016
comment
Возьмем пример: у меня уже есть product_id (1) и количество (3). Теперь вы вызвали функцию addToCart() с тем же product_id. Теперь вы хотите перезаписать количество или (старое количество + текущее количество). Дай мне знать   -  person Maths RkBala    schedule 13.07.2016
comment
@claudios Я отметил строку 148 в коде.   -  person Anuj TBE    schedule 13.07.2016
comment
@MathsRkBala Я хочу перезаписать существующее количество.   -  person Anuj TBE    schedule 13.07.2016
comment
@anujsharma9196 Пожалуйста, используйте мой код и дайте мне знать. Спасибо :-)   -  person Maths RkBala    schedule 13.07.2016


Ответы (1)


Попробуйте следующее:

public function addToCart()
{
    $this->loadModel('Products');

    if ($this->request->is('post')) {
        $p_id = $this->request->data('product_id');
        $p_quantity = $this->request->data('qnty');

        $product = $this->Products->get($p_id);

        if (!$product) {
            throw new NotFoundException(__('Invalid Product'));
        }

        $product->quantity = $p_quantity;

        $cart = $this->Cookie->read('Cart') ? $this->Cookie->read('Cart') : [];

        $itemInCart = false;
        $new_cart = [];
        if ($cart != null) {
            foreach($cart as $cart_item):               
                if ($cart_item['id'] == $p_id) {                    
                    if($p_quantity == 0){
                        //Removed the item from cart and set itemInCart to true
                        $itemInCart = true;
                    }else{
                        //update the quantity of item
                        $new_cart[] = $product;
                        $itemInCart = true;
                    }                   
                }else{
                    $new_cart[] = $cart_item;
                }
            endforeach;
        }

        if ($itemInCart) {      
            $this->Cookie->write('Cart', $new_cart);
            $this->Flash->success(__('Product updated in cart'));
        } else {
            $cart[] = $product;
            $this->Cookie->write('Cart', $cart);
            $this->Flash->success(__('Product added to cart'));
        }
        return $this->redirect($this->referer);
    }
}
person Maths RkBala    schedule 13.07.2016
comment
Спасибо. Он работает нормально. Но, как упоминалось в вашем редактировании //Remove the item from cart. Как удалить товар из корзины. Я знаю, что delete сделает это, но как удалить конкретный массив. В моем вопросе я пытался $this->Cookie->delete('Cart.'.$cart_item), но это дает ошибку - person Anuj TBE; 13.07.2016
comment
Добро пожаловать. Вы можете попробовать отправить идентификатор продукта, а количество равно нулю. Затем он будет удален из корзины. Потому что в $new_cart я не добавил конкретный товар. - person Maths RkBala; 13.07.2016
comment
Если вы удалите всю корзину, вы будете использовать $this-›Cookie-›delete('Cart'). Почему у вас ошибка означает «Корзина». $cart_item принимает переменную, и более того, мы не используем переменную, мы будем использовать только корзину - person Maths RkBala; 13.07.2016
comment
Удаление всей корзины приведет к удалению всех товаров из корзины. Я хочу удалить только определенный элемент. Звучит неплохо, если установить количество на 0 и перейти к addToCart(). Я попробую и дам вам знать, сработало это или нет. Спасибо. - person Anuj TBE; 13.07.2016
comment
@anujsharma9196 Конечно, дайте мне знать. Добро пожаловать :-) - person Maths RkBala; 13.07.2016
comment
Это не удаление товара из корзины, а обновление той же страницы со всеми товарами, как есть. - person Anuj TBE; 14.07.2016
comment
Вы отправляете product_id и количество как 0 - person Maths RkBala; 14.07.2016
comment
Давайте продолжим обсуждение в чате. - person Anuj TBE; 14.07.2016
comment
но это не удаление записи. Вместо этого добавьте новую запись со всем количеством и ценой как 0. А также предыдущая запись все еще существует в файле cookie. - person Anuj TBE; 20.07.2016
comment
решил это. Недд, чтобы добавить $itemInCart = true в if($p_quantity == 0) - person Anuj TBE; 20.07.2016
comment
да. Я пропустил.. Спасибо - person Maths RkBala; 20.07.2016