微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 编辑JSON文件

首先是的,我确实检查了其他选项,问题和答案,但遗憾的是那些对我不起作用.

所以我目前正在开发一个包括购物车系统的小项目.
购物车系统是由PHP会话创建的,一切正常.可以添加产品,删除行,并可以完全清除购物车.

现在我想添加一些功能,比如计算购物车中的商品,计算总价和增值税价格.由于会话存储为JSON对象,因此我可以使用angularjs和$http.get()来读取JSON购物车对象并重新定义数据,以便在视图的ng-repeat中使用它.

因此,当访问者点击“添加到购物车”按钮时,以下代码正在创建会话:

session_start();

$product_id = $_REQUEST['product_id'];
$product_name = $_REQUEST['product_name'];
$product_price = round($_REQUEST['product_price'], 2);
$product_size = $_REQUEST['product_size'];
$product_quantity = $_REQUEST['product_quantity'];
$total_product_price = $product_price*$product_quantity;
round($total_product_price, 2);
// Add new item to session
$cartProduct = array(
    "id" => $product_id,
    "name" => $product_name,
    "price" => $product_price,
    "size" => $product_size,
    "quantity" => $product_quantity,
    "total_product_price" => $total_product_price,
    "total_items" => 0
);

/*
 * check if the 'cart' session array was created
 * if it is NOT, create the 'cart' session array
 */
if(empty($_SESSION['cart']["cartItems"])){
    $_SESSION['cart']["cartItems"] = array();
}

// check if the item is in the array, if it is, do not add
if(array_key_exists($product_id and $product_size, $_SESSION['cart'])){
    // redirect to product list and tell the user it was added to cart
    echo "<script> alert('Dit product staat al in de winkelwagen')</script>])";
}

// else, add the item to the array
else{
    $_SESSION['cart']["cartItems"][$product_id]=$cartProduct;
}

所以我的第一次尝试是将以下内容添加到“将项添加到数组”部分

    $arr = json_decode($_SESSION['cart']['cartItems'][$product_id], true);
    $total_items['total_items'] = count($_SESSION['cart']);
    array_push($arr['cartItems'], $total_items);

但遗憾的是,这没有用.我也尝试将其添加到getCart部分.

session_start();

$json = json_encode($_SESSION['cart']["cartItems"]);
echo($json);

可悲的是也没有任何结果.

所以我的问题是如何将total_items计算添加到数组中.我如何计算总价,增值税价格等?

PS:一种产品的JSON结果:

{"16":{"id":"16","name":"TestDatumProduct","price":1000,"size":"M","quantity":"4","total_product_price":4000,"total_items":0}}

UPDATE

所以结合最近几天的进展的更新:

所以目前我的代码基于@devionNL的答案,因为我喜欢动作方法,@FranciscoRodríguez的答案几乎没有答案,因为他只向我提出了计数方法的建议,(没有用)

因此,使用@devionNL中的动作示例,我做了一些小的更改,并提出了以下代码.

<?PHP
session_start();
$cartItemID = $_REQUEST['cartItem_id'];
$product_id = $_REQUEST['product_id'];
$product_name = $_REQUEST['product_name'];
$product_price = round($_REQUEST['product_price'], 2);
$product_size = $_REQUEST['product_size'];
$product_quantity = $_REQUEST['product_quantity'];
$total_product_price = $product_price*$product_quantity;
round($total_product_price, 2);

// Add new item to session
$cartProduct = array(
    "id" => $product_id,
    "name" => $product_name,
    "price" => $product_price,
    "size" => $product_size,
    "quantity" => $product_quantity,
    "total_product_price" => $total_product_price
);

// If the session is empty create an empty array
if(empty($_SESSION['cart']["cartItems"])){
    $_SESSION['cart']["cartItems"] = array();
}

// Add to cart
if ($_REQUEST['action'] == 'addToCart')
{
    if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
    {
        $_SESSION['cart']['cartItems']['totalItems']++;
    }
    else
    {
        $_SESSION['cart']['cartItems']['totalItems']++;
        array_push($_SESSION['cart']['cartItems'], $cartProduct );
    }
}

// RemoveRow
else if ($_REQUEST['action'] == 'removeRow') // If you want a delete action
{
    if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
    {
        if ($_SESSION['cart']['cartItems']['totalItems'] > 1)
        {
            foreach ($cartDecode as $key => $cartItem)
            {
                // IF THE TITLE MATCHES THE SIGNAL STRING
                if ($cartItem->{"id"} == $cartItemID)
                {
                    // REMOVE THIS OBJECT
                    unset($cartDecode[$key]);
                }

            }
            $_SESSION['cart']['cartItems']['totalItems']--; // Deduct by 1.
        }
    else
        {
            $_SESSION['cart']['cartItems'] = $cartProduct;
        }
    }

    $_SESSION['cart']['cartItems']['totalPrice'] = array_sum(array_map(function($item) {
        return $item['price'] * $item['totalItems'];
    },
        $_SESSION['cart']['cartItems']));

}
$cart = json_encode($_SESSION['cart']['cartItems']);
echo ($cart);

因此添加到购物车,并计算cartItems正如预期的那样工作.但我仍然找不到删除行的方法.在车内.接下来,我仍然在努力获得购物车的总价. JSON结果如下:

{"totalItems":2,"0":{"id":"7","name":"bedrukt jurkje van chiffon","price":20.5,"size":"M","quantity":"3","total_product_price":61.5},"1":{"id":"5","name":"bedrukte Zomerjurk","price":30.5,"size":"M","quantity":"3","total_product_price":91.5}}

然后,JSON中的完整购物车将是:

{"cartItems":{"totalItems":2,"0":{"id":"7","name":"bedrukt jurkje van chiffon","price":20.5,"size":"M","quantity":"3","total_product_price":61.5},"1":{"id":"5","name":"bedrukte Zomerjurk","price":30.5,"size":"M","quantity":"3","total_product_price":91.5}}}

所以我的问题是?
1.我怎么能删除一行(ID ==“”,然后删除)
2.我如何计算购物车的全价?
3.为了将订单放在dabatase中,我如何能够选择每一行? (id,name等).我在考虑使用foreach()语句?

如果有任何问题,请在评论中询问.

一如既往,提前致谢!

解决方法:

最好的方法是将您的产品信息存储在数据库中,而不是让客户端将所有信息发送到服务器,因为您最初无法验证客户端是否说实话(阅读:永远不要信任客户端输入).

基本上客户端应该发送的只是添加/删除和它想要添加的productId,然后您可以返回完整的对象与价格等,但客户端不应该能够“更新”该价格.

这假设$product_id包含要添加删除的产品.

session_start();

// If the cart or cartItems isn't set, create empty
if (empty($_SESSION['cart']) || empty($_SESSION['cart']['cartItems']))
{
   $_SESSION['cart'] = array();
   $_SESSION['cart']['cartItems'] = array();
   $_SESSION['cart']['totalPrice'] = 0;
   $_SESSION['cart']['totalItems'] = 0;
}

// Search the cartItems for the column named productId that matches the $product_id. This can return null, so always verify with !empty.

$arrayKeyId = array_search($product_id, array_column($_SESSION['cart']['cartItems'], 'productId'));

if ($_REQUEST['action'] == 'add')
{
  if (!empty($arrayKeyId)) // If it isn't empty, append to  the quantity
     $_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems']++;
  else // It's new: Add it to the array
     $_SESSION['cart']['cartItems'][] = $cartProduct;
}
else if ($_REQUEST['action'] == 'delete') // If you want a delete action
{
  if (!empty($arrayKeyId))
  {
   // If more than 1 quantity, lower by 1 
   if ($_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems'] > 1)
       $_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems']--;
   else // Or if there was only 1, remove the item fully. 
      unset($_SESSION['cart']['cartItems'][$arrayKeyId]);
  }
}

// Total price based on item count times their price.
$_SESSION['cart']['totalPrice'] = array_sum(array_map(function($item) { 
    return $item['price'] * $item['totalItems']; 
}, $_SESSION['cart']['cartItems']));

// Total items based on the total amount of cartItems (without their quantity)
$_SESSION['cart']['totalItems'] = count($_SESSION['cart']['cartItems']);


echo json_encode($_SESSION['cart']['cartItems']);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐