我正在创建一个简单的添加到购物车功能,当用户成功将他们的产品添加到购物车时,他们可以使用购物车页面中的选择选项查看他们的购物车并更新数量,但似乎我只能更新第一个产品已被添加到购物车,如果我添加第二个产品,我无法更新第二个产品
cart.php
<?php
if(isset($_COOKIE["shopping_cart"]))
{
$total = 0;
$cookie_data = stripslashes($_COOKIE['shopping_cart']);
$cart_data = json_decode($cookie_data, true);
?>
<?php
foreach($cart_data as $keys => $values)
{
?>
<form id="myForm">
<input type="hidden" name="hidden_id" value="<?php echo $values["item_id"];?>">
<select name="qty" id="qty" class="form-control">
<option style="display:none;" selected><?php echo $values["item_quantity"];?></option>
<?php
for($i=1; $i<=$values["item_qty"]; $i++)
{
?>
<option value="<?php echo $i;?>"><?php echo $i;?></option>
<?php
}
?>
</select>
</form>
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#qty").change(function(){
var url = "<?php echo URLROOT; ?>"
var form = $( '#myForm' ).serialize();
$.ajax({
type: "POST",
url: url + '/shops/cookiesave',
data: form,
beforeSend: function() {
//do something here like load a loading spinner etc.
},
})
.done(function() {
window.location.reload(true);
})
});
});
</script>
我已将URLROOT定义为define('URLROOT', 'http://localhost/vlake');
饼干功能
public function cookiesave(){
$cookie_data = stripslashes($_COOKIE['shopping_cart']);
$cart_data = json_decode($cookie_data, true);
foreach($cart_data as $keys => $values)
{
if($cart_data[$keys]["item_id"] == $_POST["hidden_id"])
{
$cart_data[$keys]["item_quantity"] = $_POST["qty"];
}
}
$item_data = json_encode($cart_data);
setcookie('shopping_cart', $item_data, time() + (86400 * 30) ,'/');
}
$("#qty")
将只识别具有该ID的第一个元素。所以它只是不处理任何其他事件。拥有相同ID的多个元素在HTML中无效 - 毕竟,如果ID不能唯一标识某些内容,那么根据定义,它不是ID!所以JavaScript / jQuery将在第一个之后忽略任何重复。你也会遇到与$( '#myForm' )
相同的问题。
您需要使用类来标识<select>
,然后遍历DOM以查找父表单:
<form>
<input type="hidden" name="hidden_id" value="<?php echo $values["item_id"];?>">
<select name="qty" class="qty" class="form-control">
<option style="display:none;" selected><?php echo $values["item_quantity"];?></option>
<?php
for($i=1; $i<=$values["item_qty"]; $i++)
{
?>
<option value="<?php echo $i;?>"><?php echo $i;?></option>
<?php
}
?>
</select>
</form>
......而且......
$(".qty").change(function(){
var url = "<?php echo URLROOT; ?>"
var form = $(this).closest("form").serialize();
$.ajax({
type: "POST",
url: url + '/shops/cookiesave',
data: form,
beforeSend: function() {
//do something here like load a loading spinner etc.
},
})
.done(function() {
window.location.reload(true);
})
});
注:就像一个设计点......我注意到你在AJAX完成后立即重新加载页面。 AJAX的重点是允许您在不重新加载的情况下保持在同一页面上。为避免这种不必要的HTTP请求重复,您也可以
a)忘记使用AJAX,只需做一个正常的回发来更新数量,或者
b)当AJAX完成时,只需使用一点JavaScript来更新cookie客户端。