oxuserbasket.php

Go to the documentation of this file.
00001 <?php
00002 
00009 class oxUserBasket extends oxBase
00010 {
00011 
00017     protected $_aSkipSaveFields = array('oxcreate');
00018 
00024     protected $_sClassName = 'oxUserbasket';
00025 
00031     protected $_aBasketItems = null;
00032 
00038     protected $_blNewBasket = false;
00039 
00045     public function __construct()
00046     {
00047         parent::__construct();
00048         $this->init( 'oxuserbaskets' );
00049     }
00050 
00056     protected function _insert()
00057     {
00058         // marking basket as not new any more
00059         $this->_blNewBasket = false;
00060 
00061         if ( !isset( $this->oxuserbaskets__oxpublic->value ) ) {
00062             $this->oxuserbaskets__oxpublic = new oxField(1, oxField::T_RAW);
00063         }
00064 
00065         $iTime = oxUtilsDate::getInstance()->getTime();
00066         $this->oxuserbaskets__oxcreate = new oxField( $iTime );
00067         $this->oxuserbaskets__oxupdate = new oxField( $iTime );
00068 
00069         return parent::_insert();
00070     }
00071 
00078     public function setIsNewBasket()
00079     {
00080         $this->_blNewBasket = true;
00081         $iTime = oxUtilsDate::getInstance()->getTime();
00082         $this->oxuserbaskets__oxcreate = new oxField( $iTime );
00083         $this->oxuserbaskets__oxupdate = new oxField( $iTime );
00084     }
00085 
00091     public function isNewBasket()
00092     {
00093         return $this->_blNewBasket;
00094     }
00095 
00101     public function isEmpty()
00102     {
00103         if ( $this->isNewBasket() || $this->getItemCount() < 1 ) {
00104             return true;
00105         }
00106 
00107         return false;
00108     }
00109 
00115     public function getArticles()
00116     {
00117         $aRes = array();
00118         $aItems = $this->getItems();
00119         if ( is_array( $aItems ) ) {
00120             foreach ( $aItems as $sId => $oItem ) {
00121                 $oArticle = $oItem->getArticle( $sId );
00122                 $aRes[$this->_getItemKey($oArticle->getId(), $oItem->getSelList())] = $oArticle;
00123             }
00124         }
00125         return $aRes;
00126     }
00127 
00136     public function getItems( $blReload = false, $blActiveCheck = true )
00137     {
00138         // cached ?
00139         if ( $this->_aBasketItems !== null && !$blReload ) {
00140             return $this->_aBasketItems;
00141         }
00142 
00143         // initializing
00144         $this->_aBasketItems = array();
00145 
00146         // loading basket items
00147         $oArticle  = oxNew( 'oxarticle' );
00148         $sViewName = $oArticle->getViewName();
00149 
00150         $sSelect  = "select oxuserbasketitems.* from oxuserbasketitems left join $sViewName on oxuserbasketitems.oxartid = $sViewName.oxid ";
00151         if ($blActiveCheck) {
00152             $sSelect .= 'and '.$oArticle->getSqlActiveSnippet().' ';
00153         }
00154         $sSelect .= "where oxuserbasketitems.oxbasketid = '".$this->getId()."' and $sViewName.oxid is not null ";
00155 
00156         $oItems = oxNew( 'oxlist' );
00157         $oItems->init( 'oxuserbasketitem' );
00158         $oItems->selectstring( $sSelect );
00159 
00160         foreach ( $oItems as $oItem ) {
00161             $sKey = $this->_getItemKey( $oItem->oxuserbasketitems__oxartid->value, $oItem->getSelList() );
00162             $this->_aBasketItems[$sKey] = $oItem;
00163         }
00164 
00165         return $this->_aBasketItems;
00166     }
00167 
00177     protected function _createItem( $sProductId, $aSelList = null )
00178     {
00179         $oNewItem = oxNew( 'oxuserbasketitem' );
00180         $oNewItem->oxuserbasketitems__oxartid    = new oxField($sProductId, oxField::T_RAW);
00181         $oNewItem->oxuserbasketitems__oxbasketid = new oxField($this->getId(), oxField::T_RAW);
00182 
00183         if ( !$aSelList ) {
00184             $oArticle = oxNew( 'oxArticle' );
00185             $oArticle->load( $sProductId );
00186             $aSelectLists = $oArticle->getSelectLists();
00187             if ( ( $iSelCnt = count( $aSelectLists ) ) ) {
00188                 $aSelList = array_fill( 0, $iSelCnt, '0' );
00189             }
00190         }
00191 
00192         $oNewItem->setSelList( $aSelList );
00193 
00194         return $oNewItem;
00195     }
00196 
00197 
00207     public function getItem( $sProductId, $aSelList)
00208     {
00209         // loading basket item list
00210         $aItems   = $this->getItems();
00211         $sItemKey = $this->_getItemKey( $sProductId, $aSelList );
00212 
00213         $oItem = null;
00214         // returning existing item
00215         if ( isset( $aItems[$sProductId] )) {
00216             $oItem = $aItems[$sProductId];
00217         } elseif ( isset( $aItems[$sItemKey] ) ) {
00218             $oItem = $aItems[$sItemKey];
00219         } else {
00220             $oItem = $this->_createItem( $sProductId, $aSelList );
00221         }
00222 
00223         return $oItem;
00224     }
00225 
00234     protected function _getItemKey( $sProductId, $aSel = null )
00235     {
00236         $aSel = ( $aSel != null) ? $aSel : array (0=>'0');
00237         return md5( $sProductId.'|'.serialize( $aSel ) );
00238     }
00239 
00247     public function getItemCount( $blReload = false )
00248     {
00249         return count( $this->getItems( $blReload ) );
00250     }
00251 
00263     public function addItemToBasket( $sProductId = null, $dAmount = null, $aSel = null, $blOverride = false )
00264     {
00265         // basket info is only written in DB when something is in it
00266         if ( $this->_blNewBasket ) {
00267             $this->save();
00268         }
00269 
00270         if ( ( $oUserBasketItem = $this->getItem( $sProductId, $aSel ) ) ) {
00271             // updating object info and adding (if not yet added) item into basket items array
00272             if ( !$blOverride && !empty($oUserBasketItem->oxuserbasketitems__oxamount->value) ) {
00273                 $dAmount += $oUserBasketItem->oxuserbasketitems__oxamount->value;
00274             }
00275 
00276             if ( !$dAmount ) {
00277                 // if amount = 0 the means remove it
00278                 $oUserBasketItem->delete();
00279                 if ( isset($this->_aBasketItems[$this->_getItemKey($sProductId, $aSel)])) {
00280                     unset( $this->_aBasketItems[$this->_getItemKey($sProductId, $aSel)] );
00281                 }
00282             } else {
00283                 $oUserBasketItem->oxuserbasketitems__oxamount = new oxField($dAmount, oxField::T_RAW);
00284                 $oUserBasketItem->save();
00285 
00286                 $this->_aBasketItems[$this->_getItemKey($sProductId, $aSel)] = $oUserBasketItem;
00287             }
00288 
00289             //update timestamp
00290             $this->oxuserbaskets__oxupdate = new oxField(oxUtilsDate::getInstance()->getTime());
00291             $this->save();
00292 
00293             return $dAmount;
00294         }
00295     }
00296 
00304     public function delete( $sOXID = null )
00305     {
00306         if ( !$sOXID ) {
00307             $sOXID = $this->getId();
00308         }
00309 
00310         $blDelete = false;
00311         if ( $sOXID && ( $blDelete = parent::delete( $sOXID ) ) ) {
00312             // cleaning up related data
00313             $sQ = "delete from oxuserbasketitems where oxbasketid = " . oxDb::getDb()->quote( $sOXID );
00314             oxDb::getDb()->execute( $sQ );
00315         }
00316         return $blDelete;
00317     }
00318 
00324     public function isVisible()
00325     {
00326         $oActivUser = $this->getConfig()->getUser();
00327         $sActivUserId = null;
00328         if ($oActivUser)
00329             $sActivUserId = $oActivUser->getId();
00330 
00331         $blIsVisible = (bool) ($this->oxuserbaskets__oxpublic->value) ||
00332                               ($sActivUserId && ($this->oxuserbaskets__oxuserid->value == $sActivUserId));
00333 
00334         return $blIsVisible;
00335     }
00336 
00337 }