Антон Р. 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.