Написал простую библиотеку для реализации корзины товаров на сайте, хранящейся в сессии. Она состоит из двух классов: объекта корзины (что-то типа пачки или палета из одного товара или нескольких таких же) и собственно корзины. Скачать 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>