Ограничение на одну позицию товара в козине Opencart 1.5.x

Тема в разделе "OpenCart", создана пользователем yuzi, 21 апр 2017.

  1. yuzi

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Приветствую Форумчане! Какие есть идеи по реализации добавление в корзину только на одну позицию товара (количество данного товара может быть любое).
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    При добавлении товара в корзину проверять количество уникальных товаров там и не добавлять, если товар есть и он другой.
     
    yuzi нравится это.
  3. yuzi

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Какой переменной поставить условие думаю разберусь, а вот как прописать запрет на добавление последующих, вот в чём вопрос.
     
  4. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    В catalog/controller/checkout/cart.php есть функция add.
    В ней, до строки $product_info = $this->model_catalog_product->getProduct($product_id); нужно сделать проверку на наличие в корзине товаров.
    Сначала получаешь список товаров корзины $this->cart->getProducts();
    Потом сверяешь список product_id товаров корзины с $this->request->post['product_id'];
    Если product_id не совпадает создаешь ошибку $json['error']= "...текст ошибки..."
    И все.
     
    yuzi нравится это.
  5. yuzi

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Мысль очень интересная, спасибо, но чего-то голова уже не варит, целый день сегодня кодю, можно на примере?
    --- Добавлено, 21 апр 2017 ---
    Код:
        public function add() {
            $this->language->load('checkout/cart');
    
            $json = array();
    
            if (isset($this->request->post['product_id'])) {
                $product_id = $this->request->post['product_id'];
            } else {
                $product_id = 0;
            }
    
            $this->load->model('catalog/product');
    
            $product_info = $this->model_catalog_product->getProduct($product_id);
    
    
            if ($product_info) {
                if (isset($this->request->post['quantity'])) {
                    $quantity = $this->request->post['quantity'];
                } else {
                    $quantity = 1;
                }
    
                if (isset($this->request->post['option'])) {
                    $option = array_filter($this->request->post['option']);
                } else {
                    $option = array();
                }
    
                $product_options = $this->model_catalog_product->getProductOptions($this->request->post['product_id']);
    
                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']);
                    }
                }
    
                if (!$json) {
                    $this->cart->add($this->request->post['product_id'], $quantity, $option);
    
                    $json['success'] = sprintf($this->language->get('text_success'), $product_info['name'], $this->url->link('checkout/cart'));
    
                    unset($this->session->data['shipping_method']);
                    unset($this->session->data['shipping_methods']);
                    unset($this->session->data['payment_method']);
                    unset($this->session->data['payment_methods']);
    
                    // Totals
                    $this->load->model('setting/extension');
    
                    $total_data = array();
                    $total = 0;
                    $taxes = $this->cart->getTaxes();
    
                    // Display prices
                    if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
                        $sort_order = array();
    
                        $results = $this->model_setting_extension->getExtensions('total');
    
                        foreach ($results as $key => $value) {
                            $sort_order[$key] = $this->config->get($value['code'] . '_sort_order');
                        }
    
                        array_multisort($sort_order, SORT_ASC, $results);
    
                        foreach ($results as $result) {
                            if ($this->config->get($result['code'] . '_status')) {
                                $this->load->model('total/' . $result['code']);
    
                                $this->{'model_total_' . $result['code']}->getTotal($total_data, $total, $taxes);
                            }
    
                            $sort_order = array();
    
                            foreach ($total_data as $key => $value) {
                                $sort_order[$key] = $value['sort_order'];
                            }
    
                            array_multisort($sort_order, SORT_ASC, $total_data);
                        }
                    }
    
                    $json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));
                } else {
                    $json['redirect'] = str_replace('&', '&', $this->url->link('product/product', 'product_id=' . $this->request->post['product_id']));
                }
            }
    
            $this->response->setOutput(json_encode($json));
        }
     
  6. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    я бы по след. алгоритму сделал:
    0. редактирование файла system\library\cart.php, тоесть в него, добавил функцию:
    Код:
    public function vsevoTovara() {
            $tovar = 0;          
            $products = $this->getProducts();          
            foreach ($products as $product) {
                $tovar ++;
            }
            return $tovar;
    }
    1. в нужном месте (или там где у тебя addToCart срабатывает) реализовал проверку:
    Код:
    if ($this->cart->vsevoTovara() > 1) {
            $json['kolvo_error'] = $this->language->get('text_kolvo_error');
    } else {
            $this->cart->add($this->request->post['product_id'], $quantity, $option);
    }
    p.s. не вчитывался, но почти то же написал Master2KAZ, только теоретически )
     
  7. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    106
    Симпатии:
    76
    Как писал Master2KAZ в метод add() класса ControllerCheckoutCart (catalog/controller/checkout/cart.php)
    После:
    PHP:
    if (isset($this->request->post['product_id'])) {
        
    $product_id $this->request->post['product_id'];
    } else {
        
    $product_id 0;
    }
    Вставь проверку:
    PHP:
    if($this->cart->hasProducts()){
        foreach (
    $this->session->data['cart'] as $key => $quantity) {
             
    $product explode(':'$key);
             if(
    $product_id != $product[0]){
                   
    $json['error'] = $this->language->get('error_adding');
                   
    $this->response->setOutput(json_encode($json));
                   return;
             }
        }
    }
    В языковый файл соответствующую переменную:
    PHP:
    $_['error_adding'] = 'Вы не можете добавить в корзину два разных товара!';
    Ну и в common.js обработку ошибки добавления:
    Код:
    if (json['error']) {
           $('#notification').html('<div class="warning" style="display: none;">' + json['error'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');
           $('.warning').fadeIn('slow');
           $('html, body').animate({ scrollTop: 0 }, 'slow');
    }
    
     
    Последнее редактирование: 22 апр 2017
    Master2KAZ и yuzi нравится это.
  8. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Практически идеально. Только здесь (раз уж человек сразу не сообразил как это все делается) наверно стоит уточнить, что обработку ошибки нужно делать в функции AddTo Cart :Biggrin:
    --- Добавлено, 23 апр 2017 ---
    А не проще $tovar = count($products); ? Я не докапываюсь, просто может есть какие-то нюансы?

    А здесь не учитывается, что добавляемый товар может быть тот же, и тогда нужно будет складывать количество.
     
    Baco, yuzi и $iD нравится это.
  9. yuzi

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Очень даже сообразил)), отдельное спасибо за предусмотрительное беспокойство :Good:

    Хорошее уточнение.

    Отдельное спасибо ISomeInterface за детальное разъяснение :Ok: