dv1zhok
@dv1zhok
Freelancer

Как вывести опции товара в корзине?

Доброго времени суток! Появилась необходимость вывода опций товара на странице корзины.
Т.е. если товар был добавлен, к примеру с опцией "Размер XL", то в корзине выводить выбор опций, такой же как в карточке товара, но у же с выбранной опцией добавленного товара.

Как должно это выглядеть:
5f457713cc297997395241.jpeg
Так же что бы при смене опций происходило обновление данных.

Может быть есть готовое решение для такой задачи? Имею ввиду модуль.

Или же кто может подсказать ход действий? (готового кода не прошу, но если таковой есть, то здорово)
  • Вопрос задан
  • 909 просмотров
Решения вопроса 1
Benzin102
@Benzin102
Shitcoder
1. Опции изначально выводятся в корзине, посмотри дефолтный шаблон, скопируй.
2. В зависимости от версии ОС манипуляции опциями на корзине по разному надо реализовывать. Так же от уже установленных модулей зависит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dv1zhok
@dv1zhok Автор вопроса
Freelancer
Антон Р. Pashok Doom Спасибо за советы!
Получилось реализовать сделав следующее:
1. Вносим изменения в контроллер /checkout/cart.php:
Перед строкой:
if ($this->cart->hasProducts() || !empty($this->session->data['vouchers'])) {

Добавляем:
$this->load->model('catalog/product');

Далее после строки:
$option_data = array();
Добавляем код:
$product_options = array();
                $product_info = $this->model_catalog_product->getProduct($product['product_id']);

                foreach ($this->model_catalog_product->getProductOptions($product['product_id']) as $option) {
                    $product_option_value_data = array();

                    foreach ($option['product_option_value'] as $option_value) {
                        if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
                            if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
                                $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax') ? 'P' : false), $this->session->data['currency']);
                            } else {
                                $price = false;
                            }

                            $product_option_value_data[] = array(
                                'product_option_value_id' => $option_value['product_option_value_id'],
                                'option_value_id' => $option_value['option_value_id'],
                                'name' => $option_value['name'],
                                'image' => $option_value['image'] ? $this->model_tool_image->resize($option_value['image'], 16, 16) : '',
                                'price' => $price,
                                'price_raw' => round($option_value['price']),
                                'price_prefix' => $option_value['price_prefix']
                            );
                        }
                    }

                    $product_options[] = array(
                        'product_option_id' => $option['product_option_id'],
                        'product_option_value' => $product_option_value_data,
                        'option_id' => $option['option_id'],
                        'name' => $option['name'],
                        'type' => $option['type'],
                        'value' => $option['value'],
                        'required' => $option['required']
                    );
                }


В массив:
$data['products'][] = array(

Добавляем:
'options' => $product_options,

Находим строки:
foreach ($this->request->post['quantity'] as $key => $value) {
  $this->cart->update($key, $value);
}


Заменяем на:
$this->cart->update($this->request->post['key'], $this->request->post['quantity'], $this->request->post['option']);


Во вьюхе /checkout/cart.tpl выводим опции так же, как они выводятся на странице товара.

Далее нужно отредактировать JS файл, отвечающий за обновление данных корзины, а конкретно функцию update, что бы выглядела следующим образом:
'update': function(key, quantity, option) {
        $.ajax({
            url: 'index.php?route=checkout/cart/edit',
            type: 'post',
            data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1) + '&option=' + option,
            dataType: 'json',
            beforeSend: function() {
                $('#cart > button').button('loading');
            },
            complete: function() {
                $('#cart > button').button('reset');
            },
            success: function(json) {
                // Need to set timeout otherwise it wont update the total
                setTimeout(function () {
                    $('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
                }, 100);

                if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
                    location = 'index.php?route=checkout/cart';
                } else {
                    $('#cart > ul').load('index.php?route=common/cart/info ul li');
                }
            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
            }
        });
    },

Отредактировать JS код, передающий параметры функции cart.update, что бы так же передавались опции.

И отредактировать запрос в базу, (файл system/library/cart/cart.php) отвечающий за обновление данных в корзине. Изначально он выглядит так:
public function update($cart_id, $quantity) {
		$this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = '" . (int)$quantity . "' WHERE cart_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
	}

Меняем на:
public function update($cart_id, $quantity, $option) {
		$this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = '" . (int)$quantity . "', `option` = '" . $this->db->escape(json_encode($option)) . "' WHERE cart_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
	}


Этого достаточно для вывода и обновлений опций товара в таблице корзины вашей базы данных.

Для обновления корзины нужно писать еще код, но т.к. у меня все кастомное, то он не подойдет к стандартным файлам opencart/ocstore.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽