Hi,
I wonder if someone with a lot more Modx-fu could have a look at this and see if they can get it to work
it’s a very basic shopping cart script based on wfcart, it’s almost working, but it looks like the sessions aren’t being kept
just paste the code into a snippet and call it from a document, you’ll see what I mean
the immediate item is put in the basket (it puts the lotion in the basket...

but won’t recognise another... it’s got to be a session thing...
thanks for any help, if I can get basic functionality, I can work it up into a very simple repository item (and yes I know the codes messy, I’ll clean it up, promise)
oh and it works just fine outside of modx, in a plain old PHP file, this is an idea of what I’m trying to do www.bnionline.co.uk/test.php (the array outputs at the top and the bottom are just to show what goes wrong when brought into modx)
and there might be the( action="") that needs setting to your doc alias, I’ve commented it with some *****’s
cheers for any help
Gary
<?php
session_start();
$cart =& $_SESSION['wfcart']; // point $cart to session cart.
if(!is_object($cart)) $cart = new wfCart(); // if $cart ( $_SESSION['cart'] ) isn't an object, make a new cart
echo'<br><br><br>'; print_r($_SESSION['wfcart']);
$products = array();
$products[1] = array("id"=>1,"name"=>"Grey Name Badge","price"=>1.00);
$products[2] = array("id"=>2,"name"=>"Blue Name Badge","price"=>1.00);
$products[3] = array("id"=>3,"name"=>"Black Name Badge","price"=>1.00);
$products[31] = array("id"=>31,"name"=>"Drinks Coasters (box of 4)","price"=>9);
$products[32] = array("id"=>32,"name"=>"Mouse mats (5)","price"=>15);
$products[33] = array("id"=>33,"name"=>"Silver card wallets (10)","price"=>27.50);
$products[34] = array("id"=>34,"name"=>"Set of 3 books","price"=>33.00);
//start of code
// check to see if any items are being added
if($_POST['add']) {
$product = $products[$_POST['id']];
$cart->add_item($product['id'],$_POST['qty'],$product['price'],$product['name']);
}
if($_POST['remove']) {
$rid = intval($_POST['id']);
$cart->del_item($rid);
}
if($_POST['email']) {
// make email
if($cart->itemcount > 0) {
$message = "order form";
$subject = $message;
$emailfrom = "[email protected]";
$emailto = "[email protected]";
$message .= "\n\r\n\r";
foreach($cart->get_contents() as $item) {
$message .= $item['qty']." @ ";
$message .= number_format($item['price'],2)." - ";
$message .= $item['info']." = ";
$message .= "£".number_format($item['subtotal'],2)."\n\r";
}
$message .= "---------------------\n\r";
$message .= "Total: £".number_format($cart->total,2);
} else {
$message .= "No items in cart";
}
mail($emailto,$subject,$message,
"From: ".$emailfrom."\r\n"."Reply-To: ".$emailfrom);
mail($emailto,"Copy of ".$subject,$message,
"From: ".$emailfrom."\r\n"."Reply-To: ".$emailfrom);
$cart->empty_cart();
echo"<h3>Thankyou your order has been submitted</h3>";
}
// spit some forms
// You can have many different types of forms, such as many quantity boxes
// and an "add to cart" button at the bottom which adds all items
// but for the purposes of this demo we will handle one item at a time.
echo "<table width='100%'>";
foreach($products as $p) {
$pricetext = "";
if($p['price']<>0) $pricetext = "£".number_format($p['price'],2);
echo "<tr><td><form method='post' action=''>"; // ****note this might need changing to your document alias to get it to work
echo "<input type='hidden' name='id' value='".$p['id']."'/>";
echo "".$p['name'].'</td><td>'.$pricetext."</td><td> ";
echo "<input type='text' name='qty' size='5' value='1'></td><td><input type='submit' value='Add to order' name='add'>";
echo "</form></td></tr>";
}
echo "</table>";
echo "<h3>Items in cart</h3>";
if($cart->itemcount > 0) {
echo "<table>";
foreach($cart->get_contents() as $item) {
echo "<tr><td>";
echo $item['qty']." @ ";
echo " £".number_format($item['price'],2)."</td><td>";
echo $item['info']."</td><td>";
echo "Subtotal :£".number_format($item['subtotal'],2)."</td><td>";
echo "<form method=post><input type='hidden' name='id' value='".$item['id']."'/><input type='submit' name='remove' value='Remove'/></form></td></tr>";
}
echo "<tr><td> </td><td> </td><td>";
echo "<b>Total: £".number_format($cart->total,2);
echo "</b></td><td> </td></table>";
echo "<form method=post><input type='submit' name='email' value='Submit Order by Email'/></form></td></tr>";
} else {
echo "No items in cart";
}
echo'<br><br><br>'; print_r($_SESSION['wfcart']);
class wfCart {
var $total = 0;
var $itemcount = 0;
var $items = array();
var $itemprices = array();
var $itemqtys = array();
var $iteminfo = array();
function cart() {} // constructor function
function get_contents()
{ // gets cart contents
$items = array();
foreach($this->items as $tmp_item)
{
$item = FALSE;
$item['id'] = $tmp_item;
$item['qty'] = $this->itemqtys[$tmp_item];
$item['price'] = $this->itemprices[$tmp_item];
$item['info'] = $this->iteminfo[$tmp_item];
$item['subtotal'] = $item['qty'] * $item['price'];
$items[] = $item;
}
return $items;
} // end of get_contents
function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE)
{ // adds an item to cart
if(!$price)
{
$price = 0.00;
}
if(!$info)
{
$info = wf_get_info($itemid);
}
if($this->itemqtys[$itemid] > 0)
{ // the item is already in the cart..
// so we'll just increase the quantity
$this->itemqtys[$itemid] = $qty + $this->itemqtys[$itemid];
$this->_update_total();
} else {
$this->items[]=$itemid;
$this->itemqtys[$itemid] = $qty;
$this->itemprices[$itemid] = $price;
$this->iteminfo[$itemid] = $info;
}
$this->_update_total();
} // end of add_item
function edit_item($itemid,$qty)
{ // changes an items quantity
if($qty < 1) {
$this->del_item($itemid);
} else {
$this->itemqtys[$itemid] = $qty;
// uncomment this line if using
// the wf_get_price function
// $this->itemprices[$itemid] = wf_get_price($itemid,$qty);
}
$this->_update_total();
} // end of edit_item
function del_item($itemid)
{ // removes an item from cart
$ti = array();
$this->itemqtys[$itemid] = 0;
foreach($this->items as $item)
{
if($item != $itemid)
{
$ti[] = $item;
}
}
$this->items = $ti;
$this->_update_total();
} //end of del_item
function empty_cart()
{ // empties / resets the cart
$this->total = 0;
$this->itemcount = 0;
$this->items = array();
$this->itemprices = array();
$this->itemqtys = array();
$this->iteminfo = array();
} // end of empty cart
function _update_total()
{ // internal function to update the total in the cart
$this->itemcount = 0;
$this->total = 0;
if(sizeof($this->items > 0))
{
foreach($this->items as $item) {
$this->total = $this->total + ($this->itemprices[$item] * $this->itemqtys[$item]);
$this->itemcount++;
}
}
} // end of update_total
}
?>
admin: change to code tags (from quote tags)