这是我在这里的第一个问题,所以任何帮助将不胜感激。我发现了大量相关信息,但没有任何内容完全适合该法案。
我正在尝试通过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>'
同样,它正在添加产品,但没有任何选项。我已经尝试了默认主题并在本地安装了网站来测试它但仍然没有。还有什么可以尝试的吗?
答案 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} }})。