我正在使用Codeigniter构建基于ajax的购物车,并且添加/删除功能完美运行。我现在正在尝试添加一个用于添加多个项目的选项,但无法使其工作。
这是我正在使用的标记。我不确定它是不是最好的设计,但它正在使用非ajax函数,所以我想它应该没问题。
<form action="cart/add_multiple" method="post" accept-charset="utf-8">
<input type="hidden" name="items[0][id]" value="3571310" />
<input type="hidden" name="items[0][qty]" value="1" />
<input type="hidden" name="items[0][price]" value="59.00" />
<input type="hidden" name="items[0][name]" value="London" />
<input type="hidden" name="items[0][heb_name]" value="לונדון" />
<input type="hidden" name="items[0][full_price]" value="59.00" />
<input type="hidden" name="items[0][discount_price]" value="59.00" />
<input type="hidden" name="items[1][id]" value="7397903" />
<input type="hidden" name="items[1][qty]" value="1" />
<input type="hidden" name="items[1][price]" value="29.00" />
<input type="hidden" name="items[1][name]" value="London Triple" />
<input type="hidden" name="items[1][heb_name]" value="לונדון טריפל" />
<input type="hidden" name="items[1][full_price]" value="29.00" />
<input type="hidden" name="items[1][discount_price]" value="29.00" />
<input type="submit" name="add_multi" value="add to cart" /></form>
ajax脚本如下:
$(document).ready(function() {
$(document).on("submit", "div#winning_combo_small form", function () { //catches every click on the submit button of the "add to cart" form
var items = $(this).serialize();
alert(items);
$.post(base_url + "cart/add_multiple", {items: items, ajax: '1' },
function(data){
if (data =='true')
{ // Interact with returned data
$.get(base_url + "cart", function(cart){ // Get the contents of the url cart/show_cart
$("#cart_sidebar").html(cart);
})
$.get(base_url + "cart/count_items", function(items){
$("#cart_items").html(items);
})
}
});
return false;
})
});
但它不起作用,因为add_multiple
函数将数据作为字符串而不是数组接收。我是否必须以某种方式解码数据以将其转换为数组?希伯来字符是否妨碍了所有人?
我应该说,当以常规方式发布表单时,如果没有ajax,则将项目添加到购物车中并且一切正常。那么常规帖子和ajax帖子有什么区别?
答案 0 :(得分:0)
嗯,我得到了它的工作,虽然我不确定它是否是最优雅的方式。
这就是我的所作所为:
在ajax脚本中,我将var items = $(this).serialize();
更改为var items = $(this).serializeArray();
。我现在得到一个数组而不是一个字符串,但它不是我需要插入购物车的格式。因此,我循环使用此数组以创建所需格式的数组,并使用该新数组插入购物车。
这是购物车控制器下的add_multiple功能:
function add_multiple()
{
$items = $this->input->post('items');
$ajax = $this->input->post('ajax');
// Check if user has javascript enabled
if($ajax != '1'){
$this->cart->insert($items); //if posted the regular non-ajax way, the fields will be in an array in the correct format
echo 'false';
redirect('cart'); // If javascript is not enabled, reload the page with new data
}else{
$i = 0;
foreach($items as $key=>$form_field)
{
$field_name = $form_field['name'];
$from_char = strrpos($field_name, '[') +1 ;
$length = strlen($field_name)-$from_char-1;
$field = substr($field_name,$from_char,$length);
$data[$i][$field] = $form_field['value'];
if ($field == "discount_price") $i+=1; // I know 'discount price' is always the last field
}
$this->cart->insert($data);
echo 'true'; // If javascript is enabled, return true, so the cart gets updated
}
}