vadshesh

Добавление свойств товара в корзину

Рекомендуемые сообщения

vadshesh    0

Уважаемые коллеги, помогите, пожалуйста, разобраться с такой проблемой.
Есть страница товара http://рыболовные-мушки.рф/Рыболовная-мушка-"Палмер-
Синель"-p3.html. Там есть селекты цвета и размера, которые не добавляются
вместе с товаром в корзину. В хтмл они описаны так:

<select name="option[3]" data-id="3" onchange="changeChoice()"class="serequired">
	<option value=""> --- Выберите --- </option>
    <option value="27">10 Черный / Гризли</option>
	..........................
</select>

и 

<select name="option[4]" data-id="4" onchange="changeChoice()"class="serequired">
	<option value=""> --- Выберите --- </option>
    <option value="30">10</option>
    <option value="32">12</option>
    <option value="31">14</option>
</select>

Кнопка "Купить":

<input type="button" value="Купить" id="button-cart" class="button"onclick="addToCart('3');">

В common.js

function addToCart(product_id, quantity) {
    quantity = typeof(quantity) != 'undefined' ? quantity : 1;
    console.log('click cart');

    $('.vserror').remove();
    
    p=0;
    $(".serequired").each(function()
    {
        if($(this).val()=='')
        {
            b=$(this).prev().prev().html();
            $(this).after('<div class="vserror">Поле '+b+'должно быть заполнено!</div>');
            p=1;
        }

    })
    
    if(p!=0)return false;
    

    $.ajax({
        url: 'index.php?route=checkout/cart/add',
        type: 'post',
        data: 'product_id=' + product_id + '&quantity=' + quantity,
        dataType: 'json',
        success: function(json) {
            $('.success,.succesv, .warning, .attention, .information, .error').remove();
            
            if(json.error != null && json.error.option != null)
            {
                for(var ii in json.error.option)
                {
                    c="*[name='option["+ii+"]']";
                    b=".option[id='option-"+ii+"']";
                    if($(c).val()=='')$(b).after('<div class="vserror">'+json.error.option[ii]+'</div>');
                }
            }
            else
            {
            
            if (json['redirect']) {
                location = json['redirect'];
            }
            
            if (json['success']) {
                
                $('#notification').html('<div class="succesv">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');
                
                //$('.success').show('slow');
                
                $('#cart-total').html(json['total']);
                $("#cartcons").html(json.totaltop);
                
//                $('html, body').animate({ scrollTop: 0 }, 'slow'); 
            }    
                
        }
        }
    });
}

А где же здесь передача этих опций? Причем в чистом двиге та же самая
ерунда... Но идем в контроллер checkout/cart.php function add(). Тут
написано: 

            if (isset($this->request->post['option'])) {
                $option = array_filter($this->request->post['option']);
            } else {
                $option = array();    
            }

т.е. опций должны "поститься" аяксом. Но в каком виде? 
Ниже по коду написано:

$this->cart->add($this->request->post['product_id'], $quantity, $option, $profile_id);

А сама эта публичная функция описана так:

public function add($product_id, $qty = 1, $option, $profile_id ='') {
        $key = (int) $product_id . ':';
        
        if ($option) {
            $key .= base64_encode(serialize($option)) . ':';
        }  else {
            $key .= ':';
        }
        
        if ($profile_id) {
            $key .= (int) $profile_id;
        }

        if ((int) $qty && ((int) $qty > 0)) {
            if (!isset($this->session->data['cart'][$key])) {
                $this->session->data['cart'][$key] = (int) $qty;
            } else {
                $this->session->data['cart'][$key] += (int) $qty;
            }
        }

        $this->data = array();
      }

Так вот вопрос: в каком виде я должен "аяксить" опции в common.js в addToCart, чтобы они верно располагались в корзине, а потом и в заказе?
Большое спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
halfhope    163

Вариант 1. Используется в OpenCart

$('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea');

Так можно собрать содержимое полей всех опций. Еще в приведенном коде используется обертка в #product, чтобы выборка не пересекалась с другими полями, которые могут использоваться на странице.

Приведу полный код из дефолтного шаблона OpenCart версии 2.1.0.1, в нем quantity передается вместе с опциями:

HTML:

<button type="button" id="button-cart" class="btn btn-primary btn-lg btn-block">Купить</button>

JS:

$('#button-cart').on('click', function() {
	$.ajax({
		url: 'index.php?route=checkout/cart/add',
		type: 'post',
		data: $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea'),
		dataType: 'json',
		beforeSend: function() {
			//
		},
		complete: function() {
			//
		},
		success: function(json) {
			//
		},
        error: function(xhr, ajaxOptions, thrownError) {
			//
        }
	});
});

Вариант 2. Сериализация формы.

Вместо громоздкой конструкции по выборке всех полей формы можно выбрать все сразу:

 $(this).serialize();

 

 

Порядок опций определяется их сортировкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vadshesh    0

Забыл добавить, что версия 1.5.6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vadshesh    0

Скажите, а в скрипте system/library/cart.php (в вашей версии) опции записываются так:

      public function add($product_id, $qty = 1, $option, $profile_id = '') {
        $key = (int) $product_id . ':';
        
        if ($option) {
            $key .= base64_encode(serialize($option)) . ':';
        }  else {
            $key .= ':';
        }
        
        if ($profile_id) {
            $key .= (int) $profile_id;
        }

        if ((int) $qty && ((int) $qty > 0)) {
            if (!isset($this->session->data['cart'][$key])) {
                $this->session->data['cart'][$key] = (int) $qty;
            } else {
                $this->session->data['cart'][$key] += (int) $qty;
            }
        }

        $this->data = array();
      }

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
halfhope    163

нет, в той версии, что у меня данные корзины хранятся в БД, а не в сессии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу