Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Уважаемые коллеги, помогите, пожалуйста, разобраться с такой проблемой.
Есть страница товара 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, чтобы они верно располагались в корзине, а потом и в заказе?
Большое спасибо!

Надіслати
Поділитися на інших сайтах


Вариант 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();

 

 

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

Надіслати
Поділитися на інших сайтах

Скажите, а в скрипте 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();
      }

?

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.