Написал простую библиотеку для реализации корзины товаров на сайте, хранящейся в сессии. Она состоит из двух классов: объекта корзины (что-то типа пачки или палета из одного товара или нескольких таких же) и собственно корзины. Скачать zip-архивом.
Сама библиотека - cart.php:
<?php // класс объекта корзины Class CartItem { public $id; // идентификатор товара public $price=0; // цена товара public $qty=1; // кол-во товара для добавления в корзину public $subtotal = 0; // сумма за товар с учетом его кол-ва /* благодаря конструктору, можно не только по отдельности задавать свойства объекта, но и так: new CartItem(345601,500,2) */ public function __construct($id=NULL,$price=0,$qty=1) { if(isset($id)) { $this->id=$id; $this->price=$price; $this->qty=!$qty?1:$qty; $this->subtotal(); } } function subtotal() { $this->subtotal = $this->price*$this->qty; return $this->subtotal; } } // класс корзины покупок, хранящейся в сессии Class Cart { protected $items=array(); // добавляем товар в корзину. Если в ней уже есть товар с таким же id, просто меняем его количество function add(CartItem $cartItem) { if(isset($this->items[$cartItem->id])) { $cartItem->qty += $this->items[$cartItem->id]->qty; } $this->edit($cartItem); } // редактируем товар в корзине, либо добавляем новый (кол-во не суммируется, для суммирования используется метод add(CartItem $cartItem)) function edit(CartItem $cartItem) { $cartItem->subtotal(); $this->items[$cartItem->id] = $cartItem; } function delete($id) { unset($this->items[$id]); } function emptyCart() { $this->items=array(); } // считаем, сколько всего товаров в корзине function qty() { $qty = 0; foreach($this->get() as $cartItem) $qty += $cartItem->qty; return $qty; } function total() { $total = 0; foreach($this->get() as $cartItem) $total += $cartItem->subtotal; return $total; } // возвращаем либо один товар по идентификатору, либо все function get($id=NULL) { if(isset($id)) return $this->items[$id]; else return $this->items; } } ?>
Демо-файл для тестов - cartdemo.php:
<? // подключаем класс, запускаем сессию require_once "cart.php"; session_start(); // ставим указатель на хранилище $cart =& $_SESSION['cart']; // если хранилище $_SESSION['cart'] не создано, создаем if(!is_object($cart)) $cart = new Cart; // добавляем товары в корзину $cart->add(new CartItem(601,500)); $cart->add(new CartItem(454301,2300,2)); $cart->add(new CartItem(34,1500,3)); // а ниже пример для списка товаров $products[] = array('product_id'=>666,'product_price'=>200,'qty'=>7); $products[] = array('product_id'=>999,'product_price'=>300); foreach($products as $product) { $cartItem = new CartItem; $cartItem->id = $product['product_id']; $cartItem->price = $product['product_price']; $cartItem->qty = isset($product['qty'])?$product['qty']:1; /* либо $cartItem = new CartItem( $product['product_id'],$product['product_price'],isset($product['qty'])?$product['qty']:1 ); */ $cart->add($cartItem); } /* а так можно отредактировать $cart->edit(new CartItem(666,10,1)); или даже удалить $cart->delete(666); */ ?> <table border="1"> <tr> <th>ID товара</th><th>Цена</th><th>Кол-во</th><th>Сумма</th> <?foreach($cart->get() as $product):?> <tr> <td><?= $product->id;?></td> <td><?= $product->price;?></td> <td><?= $product->qty;?></td> <td><?= $product->subtotal?></td> </tr> <?endforeach;?> </tr> <tr> <td colspan="3">Всего товаров:</td> <td><?= $cart->qty();?></td> </tr> <tr> <td colspan="3">На сумму:</td> <td><?= $cart->total();?></td> </tr> </table>