Приветствую Форумчане! Какие есть идеи по реализации добавление в корзину только на одну позицию товара (количество данного товара может быть любое).
При добавлении товара в корзину проверять количество уникальных товаров там и не добавлять, если товар есть и он другой.
Какой переменной поставить условие думаю разберусь, а вот как прописать запрет на добавление последующих, вот в чём вопрос.
В 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']= "...текст ошибки..." И все.
Мысль очень интересная, спасибо, но чего-то голова уже не варит, целый день сегодня кодю, можно на примере? --- Добавлено, 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)); }
я бы по след. алгоритму сделал: 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, только теоретически )
Как писал 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'); }
Практически идеально. Только здесь (раз уж человек сразу не сообразил как это все делается) наверно стоит уточнить, что обработку ошибки нужно делать в функции AddTo Cart --- Добавлено, 23 апр 2017 --- А не проще $tovar = count($products); ? Я не докапываюсь, просто может есть какие-то нюансы? А здесь не учитывается, что добавляемый товар может быть тот же, и тогда нужно будет складывать количество.
Очень даже сообразил)), отдельное спасибо за предусмотрительное беспокойство Хорошее уточнение. Отдельное спасибо ISomeInterface за детальное разъяснение