我有一个功能可以改变产品的数量并将其存储在会话中。
public static function updateProduct($product_code, $newQty)
{
foreach ($_SESSION["products"] as $cart_itm) //loop through session array
{
if($cart_itm["code"] == $product_code) //the item exist in array
{
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$newQty);
}
else
{
//item doesn't exist in the list, just retrieve old info and prepare array for session var
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"]);
}
}
//found user item in array list, and increased the quantity
$_SESSION["products"] = $product;
return;
}
但如果阵列中有两个或更多产品,则该功能仅适用于最后添加的产品。 有人有想法吗?
PS:将产品添加到购物车的功能正常。但是没有任何重大差异。
评论代码:
$cart_items = 0;
foreach ($_SESSION["products"] as $cart_itm)
{
echo '<input type="hidden" name="product_code" value="'.$product_code.'" />';
$cart_items ++;
}
if(isset($_SESSION["products"]))
{
echo '<form method="post" name="updateProduct">';
echo '<ul>';
$cart_items = 0;
foreach ($_SESSION["products"] as $cart_itm)
{
$product_code = $cart_itm["code"];
// get the product_name
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('product_name'))
->from($db->quoteName('#__osmaf_products'))
->where($db->quoteName('product_code') . ' = '. $db->quote($product_code));
$db->setQuery($query);
$result = $db->loadRow();
echo '<li class="cart-itm">';
echo '<h4>'.$result['0'].' (Artikelnr.:'.$product_code.')</h4>';
echo '<label style="display:inline">Menge: </label><input type="number" style="width:50px;margin-top:9px" name="newqty" value="'.$cart_itm["qty"].'" />';
echo ' <input type="submit" class="btn btn-primary" name="updateProduct" value="↻" />';
echo '<input type="hidden" name="product_code" value="'.$cart_itm["code"].'" />';
echo '</li>';
$cart_items ++;
}
}
当我现在每次发送表单时,即使我想要更新哪个产品,最后一个产品的姓氏和数量也会发送到该功能。
答案 0 :(得分:0)
我改变了你的代码
public static function updateProduct($product_code, $newQty)
{
foreach ($_SESSION["products"] as $cart_item_id => $cart_itm) {
if($cart_itm["code"] == $product_code) {
$_SESSION["products"][$cart_item_id]["qty"] = $newQty;
}
}
}
试试吧。
答案 1 :(得分:0)
我认为通过这种方式,您不会在$ product数组中添加项目,但每次重新启动它时。我建议改为使用array_push。
答案 2 :(得分:0)
为什么不简单地更新数组,而不是复制所有内容?
请注意&
$cart_item
将public static function updateProduct($product_code, $newQty)
{
foreach ($_SESSION["products"] as &$cart_itm) //loop through session array, but as reference
{
if($cart_itm["code"] == $product_code) //the item exist in array
{
$cart_item["qty"] = $newQty;
//assuming $product_code unique, so we are done.
return;
}
}
}
作为参考而非另一个副本。
{{1}}
答案 3 :(得分:0)
正如评论中所讨论的那样,您将产品代码存储在具有相同名称的隐藏循环中(非数组)。而且,$product_code
未定义。即使之前定义,也会存储相同的值。因此,您必须将所有产品代码存储为数组,如下所示
foreach ($_SESSION["products"] as $cart_itm)
{
echo '<input type="hidden" name="product_code[]" value="'.$cart_itm["code"].'" />';
$cart_items ++;
}