Как сделать добавление только 1 товара и не более

Тема в разделе "Общие вопросы", создана пользователем svarca, 15 ноя 2021.

  1. svarca

    svarca Новичок

    Сообщения:
    18
    Симпатии:
    1
    Добрый день. Нужно чтобы в корзину можно было добавить только 1 одинаковый товар. То есть чтобы было перчатки красные 1 шт, ботинки черные 1 шт. И не было возможности добавить перчатки красные 3 шт.
    В файле product.twig я уже поправил
    строчку <input type="text" name="quantity" value="{{ minimum }}" size="2" id="input-quantity" class="form-control" />
    заменил на строчку
    <input type="hidden" name="quantity" value="1" id="input-quantity" class="form-control" />

    теперь при нажатии кнопки добавляется только 1 товар.
    Но если нажать кнопку несколько раз, то товар плюсуется.

    Подскажите пожалуйста. В каком файле происходит плюсовка одинакового товара, когда кнопку нажимаем добавить, и что там надо поменять, чтобы он не прибавлялся?
     
    Последнее редактирование: 15 ноя 2021
  2. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    сначало все попадает в данный контроллер.
    \catalog\controller\checkout\cart.php
    PHP:
    public function add() {
    тут можно проверить с каким id товар добавляется и если уже есть такой в корзине, то записать ошибку $json['error']
    Примеры там же.

    А узнать какие товары есть в корзине, примеры есть выше по коду..
    PHP:
                $products $this->cart->getProducts();

                foreach (
    $products as $product) {
     
    svarca нравится это.
  3. svarca

    svarca Новичок

    Сообщения:
    18
    Симпатии:
    1
    Большое спасибо за ответ
    да действительно помогло
    добавил такой код
    $products = $this->cart->getProducts();
    foreach ($products as $product) {
    if ($product['product_id'] == $product_id) $json['error']['recurring'] = $this->language->get('error_recurring_required');
    }
    и перестало добавлять более 1.
    Но у меня в товаре есть особенность которую сразу не указал.
    А именно наличие для каждого товара
    Available Options
    и один товар с одним ID например перчатки, но с разными опциями
    например:
    перчатки красные
    перчатки серые
    должен добавляться как разный товар
    но перчатки красные не более 1 шт
    перчатки серые не более 1 шт.

    а так как у перчатки - один ID
    то уже не добавляются перчатки с разными опциями.
    Как еще к проверке по ID добавить проверку по опциям? и если и они уже совпадают то записывать ерор.
     
  4. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    посмотрите там же пример начиная с
    PHP:
    foreach ($product['option'] as $option) {
    т.е нужно например в цикле найти добавляемый товар , и посмотреть на его опции и сравнить значение. Это в простейшем варианте.
     
  5. svarca

    svarca Новичок

    Сообщения:
    18
    Симпатии:
    1
    Появилось время допилить проблему. Выложу здесь может кому понадобится.
    в файле \catalog\controller\checkout\cart.php

    после строк ----
    Код:
    foreach ($product_options as $product_option) {
                    if ($product_option['required'] && empty($option[$product_option['product_option_id']])) {
                        $json['error']['option'][$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
                    }
                  
                }
    
    вставил следующий код ---
    
    $products = $this->cart->getProducts();
                 $yes = 1;
                          
               foreach ($products as $product)
            {
                if ($product['product_id'] == $product_id) {   $yes = 0;
    
                    foreach ($product_options as $product_option) {
                      
                        foreach ($product['option'] as $option_cart) {
                          
                           if($product_option['product_option_id'] == $option_cart['product_option_id']) {  
                            
                              if(!isset($option[$product_option['product_option_id']])) {
                            
                                $option[$product_option['product_option_id']] = "";
                              
                                }
                                        
                              if(!isset($option_cart['value'])) {
                            
                               $option_cart['value'] = "";
                              
                               }    
                              
                               if($option[$product_option['product_option_id']] != $option_cart['value']) $yes = 1;
                        
                                 }
                              }  
                          }
                      }  
                    }  
                      
                if($yes == 0)   $json['error']['recurring'] = $this->language->get('error_recurring_required');
    
    Вроде все работает. Товар с одинаковым ID добавляет в корзину повторно только если у него отличается хотя бы одна опция. Если опции одинаковые товар повторно не добавляется.

    Возможно сделал не оптимально, поправте если что)
     
    Последнее редактирование модератором: 14 мар 2022
  6. svarca

    svarca Новичок

    Сообщения:
    18
    Симпатии:
    1
    Подниму тему. Появилась еще одна проблема. Если не залогиненный пользователь набирает товара в корзину. А затем он логинится, а у него например уже был такой товар в корзине. В данный момент товары старой и новой корзины складываются при входе пользователя. Подскажите в каком контролере это происходит? как исключить повторное добавление одинакового товара при входе пользователя?
     
  7. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    посмотрите конструктор библиотеки cart
     
    svarca нравится это.
  8. svarca

    svarca Новичок

    Сообщения:
    18
    Симпатии:
    1
    Большое спасибо за подсказку.
    вопрос решил
    в файле system/library/cart/cart.php
    есть функция public function add(
    в ней закоментировал строку // $this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = (quantity + " . (int)$quantity . ") WHERE ...
    она отвечает за увеличение quantity при добавлении одинакового товара
    И проблема ушла, больше 1 одинакового товара не добавляется, quantity всегда 1 и не увеличивается если складываются корзины залогиненного и не залогиненного пользователя.