First of all yes I did check other options, questions and answers but sadly those didn't work for me.
So I'm currently working on a small project including a shopping cart system. The shopping cart system is created by a PHP session and everything works fine. Products can be added, rows can be deleted and the cart can be cleared completely.
Now I would like to add some functions like counting the items in the cart, calculating the total price and VAT prices. Since the session is stored as a JSON object I'm able to use angularjs and $http.get() to read the JSON cart object and redefine the data so it's usable in an ng-repeat for the view.
So when the visitor clicks on the "add to cart" button the following code is creating the session:
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;
}
So my first attempt was to add the following to the section "add the item to the array"
$arr = json_decode($_SESSION['cart']['cartItems'][$product_id], true);
$total_items['total_items'] = count($_SESSION['cart']);
array_push($arr['cartItems'], $total_items);
But sadly this didn't work. I also tried adding this to the getCart section.
session_start();
$json = json_encode($_SESSION['cart']["cartItems"]);
echo($json);
Sadly also without any result.
So my question is how am I able to add the total_items calculation to the array. And how am I able to calculate the total price, VAT prices etc?
PS: the JSON outcome of one product:
{"16":{"id":"16","name":"TestDatumProduct","price":1000,"size":"M","quantity":"4","total_product_price":4000,"total_items":0}}
UPDATE
So an update to combine the progress of the last few days:
So currently my code is based on the answer of @devionNL since i like the action method and the answer of @FranciscoRodríguez was barely an answer since he only adviced me about the counting method, (didn't work)
So using the action examples from @devionNL i've made some small changes and came up with the following code.
<?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);
So adding to the cart, and calculating the cartItems is working as expected. But i still can't find the way of removing a row. inside the cart. Next to that i'm still struggling with getting the total price of the cart. The JSON outcome is as following:
{"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}}
The full cart in JSON would then be:
{"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}}}
So my questions are?
1. How am i able to delete a single row (ID == "", Then delete)
2. How am i able to calculate the full price of the cart?
3. For placing the order inside the dabatase, how would i be able to select each row? (id, name, etc). I was thinking in the way of using a foreach() statement?
If there are any questions please ask them in the comments.
As always, Thanks in advance!