Простая корзина. Класс корзины

Для начала готовим класс корзины 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, к которым и будет прямое обращение из шаблонов.



=================
2011-12-25