Простая корзина. Класс корзины
Для начала готовим класс корзины basket. Помещаем его прямо в __custom.php, после основного класса (ведь php позволяет объявлять несколько классов в одном файле), чтобы не заморачиваться с require. Эти методы не надо указывать в permissions.custom.php
/**
Простая корзина без наворотов
1) все данные до оформления заказа хранятся в сессии для всех пользователей.
2) Храним id товара и количество.
3) Все расчеты в рублях
4) поскольку сессия и так привязана к пользователю, за user_id не следим
5) $_SESSOIN['basket'] = array($id => $count);
6) Никаких скидок и карт!
*/
class basket extends singleton {
public static function getInstance() {
return parent::getInstance(__CLASS__);
}
protected function __construct() {
if(isset($_SESSION['basket'])){
$this->basket = $_SESSION['basket'];
}
else {
$this->basket = $_SESSION['basket'] = array();
}
}
public function getBasket(){
return $this->basket;
}
public function addItem($id){
if(array_key_exists($id, $_SESSION['basket'])){
$_SESSION['basket'][$id] = $_SESSION['basket'][$id] + 1;
}
else{
$this->basket[$id] = 1;
$_SESSION['basket'][$id] = 1;
}
}
public function removeItem($id){
if(array_key_exists($id, $_SESSION['basket'])){
unset($_SESSION['basket'][$id]);
}
else{
return false;
}
}
//Array ( [count] => 5 )
public function changeBasketItem($id, $arrItemInfo){
if(array_key_exists($id, $_SESSION['basket'])){
if(isset($arrItemInfo['count'])){
$count = (int)$arrItemInfo['count'];
if($count > 0){
$_SESSION['basket'][$id] = $count;
}
else{
unset($_SESSION['basket'][$id]);
}
}
}
}
public function emptyBasket(){
unset($_SESSION['basket']);
}
public function checkIsEmpty(){
if(count($_SESSION['basket']) > 0) return true;
else return false;
}
public function renderBasket($sTemplate){
if(!$sTemplate) $sTemplate = "default";
$h = umiHierarchy::getInstance();
//$basket = basket::getInstance();
list($sBasket, $sEmptyBasket, $sBasketItem) = def_module::loadTemplates("tpls/webforms/basket/{$sTemplate}.tpl", "basket", "basket_empty", "basket_item");
$block_array = $block_arr = array();
if($this -> checkIsEmpty()){
$s = '';
$total = 0;
foreach($this->getBasket() as $id=>$count){
if(!$el = $h -> getElement($id)) continue;
if(!$price = $el -> getValue('price')) continue;
$block_array['id'] = $id;
$block_array['count'] = $count;
$block_array['name'] = $el -> getName();
$block_array['price'] = $price;
$block_array['price_total'] = $price * $count;
$total += $block_array['price_total'];
$s .= def_module::parseTemplate($sBasketItem, $block_array);
}
$block_arr['items'] = $s;
$block_arr['order_price'] = $total;
return def_module::parseTemplate($sBasket, $block_arr);
}
else {
return def_module::parseTemplate($sEmptyBasket, $block_array);
}
}
public function renderOrder($sTemplate){
if(!$sTemplate) $sTemplate = "default";
$h = umiHierarchy::getInstance();
//$basket = basket::getInstance();
list($sBasket, $sEmptyBasket) = def_module::loadTemplates("tpls/webforms/basket/{$sTemplate}.tpl", "order", "order_empty");
$block_arr = array();
if($this -> checkIsEmpty()){
$block_arr['ordered_items'] = $this->renderOrderItems();
//данные юзера
$block_arr['comments'] = '';
$block_arr['phone'] = '';
$block_arr['email'] = '';
$block_arr['fio'] = '';
return def_module::parseTemplate($sBasket, $block_arr);
}
else {
return def_module::parseTemplate($sEmptyBasket, $block_array);
}
}
public function renderOrderItems(){
if(!$sTemplate) $sTemplate = "default";
$h = umiHierarchy::getInstance();
//$basket = basket::getInstance();
list($sBasketItem, $items_block) = def_module::loadTemplates("tpls/webforms/basket/{$sTemplate}.tpl", "order_item",'items_block');
$block_array = $block_arr = array();
if($this -> checkIsEmpty()){
$s = '';
$total = 0;
foreach($this->getBasket() as $id=>$count){
if(!$el = $h -> getElement($id)) continue;
if(!$price = $el -> getValue('price')) continue;
$block_array['id'] = $id;
$block_array['count'] = $count;
$block_array['name'] = $el -> getName();
$block_array['price'] = $price;
$block_array['price_total'] = $price * $count;
$total += $block_array['price_total'];
$s .= def_module::parseTemplate($sBasketItem, $block_array);
}
$block_arr['items'] = $s;
$block_arr['order_price'] = $total;
return def_module::parseTemplate($items_block, $block_arr);
}
else {
return def_module::parseTemplate($sEmptyBasket, array());
}
}
}
Далее пишем кастомные методы для модуля webforms, к которым и будет прямое обращение из шаблонов.