通过AJAX和<form> |将产品选项添加到购物车Opencart的</FORM>

时间:2014-07-09 17:10:24

标签: php jquery ajax opencart

这是我在这里的第一个问题,所以任何帮助将不胜感激。我发现了大量相关信息,但没有任何内容完全适合该法案。

我正在尝试通过HTML表单和AJAX将带有各种选项的产品添加到购物车中。添加产品本身是第一个障碍,但它现在似乎是一个空洞的胜利。

我的表单如下所示:(列表中有更多产品,但我已经编辑以节省空间)

<form action="http://[site_url].com/index.php?route=checkout/cart/add/" id="quickQuoteForm" method="post">
<h3>Select your course</h3>
<div class="quickPriceRow1 row1">
  <label>Choose a course</label>
  <select class="quickPriceSelect" name="product_id" rel="1">
    <option selected="selected" value="">Please choose...</option>
    <option name="product_id" value="50">Intensive General English - 15 hours per week</option>
    <option name="product_id" value="51">Intensive General English Course + Consolidation English/Exam Preparation Workshops (20 hours per week)</option>
  </select>

然后,包含在相同的表单中,我有这样的产品选项:

<label>Choose a start date</label>
<select name="start_date" class="quickPriceSelect2" rel="2" id="start_date">
    <option value="" selected="selected">Please choose...</option>

    <option name="option[5]" value="49">Monday July 28</option>
    <option name="option[5]" value="50">Monday August 04</option>
    <option name="option[5]" value="51">Monday August 11</option>
    <option name="option[5]" value="52">Monday August 18</option>
          etc...
 </select>

现在,我不是100%我有“name = ...”,但我已经尝试了'name =“选项[5]”'和'name =“option_id [5]” '没有变化。 [5]我从'option_description'表和'option_id'列中获取了'option_value_description'表和'option_value_id'列中的值=“50”。

感谢这个帖子How do I add a product to OpenCart from an external site?(并且稍微修补一下)我已经将产品添加到购物车没有问题,但选项完全让我感到困惑。

我的jQuery是:

$(document).ready(function() {
    $('#quickQuoteForm button').click(function(e) {
        e.preventDefault(); // prevent the form from submitting

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: 'http://[site_url].com/index.php?route=checkout/cart/add/',
            data: 'product_id=' + $('.quickPriceSelect').val() + '&quantity=1' + '&product_option_id=' + $('.quickPriceSelect2').val() + '&product_option_id=' + $('.quickPriceSelect3').val(),
            success: function(json) {
                window.location = 'http://[site_url].com/index.php?route=checkout/cart';
            }
        });
    });
});

如果有人能指出我正确的方向,这将是一个巨大的帮助,谢谢。

##更新##

好的,所以我没有继续使用它,但我已经改变了我的JS以匹配我在product.tpl文件中找到的(默认和我正在使用的主题; Acceptus)。我现在有:

<script>
$('#button-cart').bind('click', function() {
    $.ajax({
        url: 'index.php?route=checkout/cart/add',
        type: 'post',
        data: $('select[name="product_id"], select[name="option[5]"], select[name="option[13]"]'),
        dataType: 'json',
        success: function(json) {
            $('.success, .warning, .attention, information, .error').remove();

            if (json['error']) {
            if (json['error']['option']) {
                for (i in json['error']['option']) {
                    $('#option-' + i).after('<span class="error">' + json['error']['option'][i] +     </span>');
            }
        }
    } 

    if (json['success']) {
        $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/acceptus/image/icons/remove/close.png" alt="" class="close" /></div>');

        $('.success').fadeIn('slow');

        $('#cart-total').html(json['total']);

        $('html, body').animate({ scrollTop: 0 }, 'slow'); 
    }   

        if (json['success']) {
            window.location = 'http://studioamanchester.com/index.php?route=checkout/cart';
        }
    }
});
});
</script>'

同样,它正在添加产品,但没有任何选项。我已经尝试了默认主题并在本地安装了网站来测试它但仍然没有。还有什么可以尝试的吗?

2 个答案:

答案 0 :(得分:1)

正如您所看到的,当您尝试将变量作为POST变量发送时,您将变量作为查询字符串发送。这是服务期望您发送的内容:

Request URL:http://studioamanchester.com/index.php?route=checkout/cart/add/
Request Method:POST

Query String Parametersview sourceview URL encoded
route:checkout/cart/add/

Form Dataview sourceview URL encoded
product_id:51
quantity:1
product_option_id:56
product_option_id:95

试试这个(不确定具有相同名称的两个属性,但看看它是否有效):

$(document).ready(function() {
    $('#quickQuoteForm button').click(function(e) {
        e.preventDefault(); // prevent the form from submitting

        var obj = { 
            product_id : $('.quickPriceSelect').val(), 
            quantity : "1", 
            product_option_id : $('.quickPriceSelect2').val(), 
            product_option_id : $('.quickPriceSelect3').val() 
        };

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: 'http://[site_url].com/index.php?route=checkout/cart/add/',
            data: JSON.stringify(obj),
            success: function(json) {
                window.location = 'http://[site_url].com/index.php?route=checkout/cart';
            }
        });
    });
});

答案 1 :(得分:0)

查看您的JS代码,我可以在AJAX请求中看到一些错误:

    $.ajax({
        type: 'POST',
        dataType: 'json',
        url: 'http://[site_url].com/index.php?route=checkout/cart/add/',
//                  there should be no slash at the end of route  ---^
        data: 'product_id=' + $('.quickPriceSelect').val() + '&quantity=1' + '&product_option_id=' + $('.quickPriceSelect2').val() + '&product_option_id=' + $('.quickPriceSelect3').val(),
// if you send more 'product_option_id' properties, all of them will be overwritten by the last value in the end...
        success: function(json) {
            window.location = 'http://[site_url].com/index.php?route=checkout/cart';
        }
    });

我们错过了您的控制器代码,但我们希望您没有更改它。在这种情况下,POST数据完全不正确,因为购物车控制器需要在option数组中接收产品选项,其中option_id为关键字,production_option_value为值。

请求应该包含这样的POST数据:

option[208]     test
option[209]     adsgsdadas
option[217]     3
option[219]     2011-02-20
option[220]     2011-02-20 22:25
option[221]     22:25
option[222]     
option[223][]   10
product_id      42
quantity        2

由于您正在完全更改发送到服务器的POST,因此您认为不可能这样做是可以理解的。您现在应该集中精力修复代码,以便以这种方式发送AJAX POST请求(从默认的product.tpl模板复制),而不是重新发明轮子:

$.ajax({
    url: 'index.php?route=checkout/cart/add',
    type: 'post',
    data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
    dataType: 'json',
    success: function(json) {
        $('.success, .warning, .attention, information, .error').remove();

        if (json['error']) {
            if (json['error']['option']) {
                for (i in json['error']['option']) {
                    $('#option-' + i).after('<span class="error">' + json['error']['option'][i] + '</span>');
                }
            }
        } 

        if (json['success']) {
            $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');

            $('.success').fadeIn('slow');

            $('#cart-total').html(json['total']);

            $('html, body').animate({ scrollTop: 0 }, 'slow'); 
        }   
    }
});

包含data的行包含所有内容 - 只需找到给定div中的任何表单字段并将其name:value打包到POST(而选项的名称为{{1} }})。