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