00001 <?php
00002
00007 class oxArticleList extends oxList
00008 {
00012 protected $_sCustomSorting;
00013
00019 protected $_sObjectsInListName = 'oxarticle';
00020
00026 protected $_blLoadSelectLists = false;
00027
00033 protected $_blLoadPrice = true;
00034
00042 public function setCustomSorting( $sSorting)
00043 {
00044
00045 $aSorting = explode(" ", $sSorting);
00046 $aSorting[0] = $this->getBaseObject()->getSqlFieldName($aSorting[0]);
00047 $this->_sCustomSorting = implode( " ", $aSorting );
00048 }
00049
00055 public function enableSelectLists()
00056 {
00057 $this->_blLoadSelectLists = true;
00058 }
00059
00068 public function selectString( $sSelect )
00069 {
00070 if ( !$this->isAdmin() ) {
00071 $this->_aAssignCallbackPrepend = ( !$this->_blLoadPrice )?array( oxNew("oxarticle"), 'disablePriceLoad'):null;
00072 }
00073
00074 startProfile("loadinglists");
00075 $oRes = parent::selectString( $sSelect );
00076 stopProfile("loadinglists");
00077
00078 return $oRes;
00079 }
00080
00086 public function getHistoryArticles()
00087 {
00088 if ($aArticlesIds = $this->getSession()->getVar('aHistoryArticles')) {
00089 return $aArticlesIds;
00090 } elseif ( $sArticlesIds = oxUtilsServer::getInstance()->getOxCookie('aHistoryArticles')) {
00091 return explode('|', $sArticlesIds);
00092 }
00093 }
00094
00102 public function setHistoryArticles($aArticlesIds)
00103 {
00104 if ($this->getSession()->getId()) {
00105 $this->getSession()->setVar('aHistoryArticles', $aArticlesIds);
00106
00107 oxUtilsServer::getInstance()->setOxCookie('aHistoryArticles', '');
00108 } else {
00109 oxUtilsServer::getInstance()->setOxCookie('aHistoryArticles', implode('|', $aArticlesIds));
00110 }
00111 }
00112
00121 public function loadHistoryArticles($sArtId)
00122 {
00123 $aHistoryArticles = $this->getHistoryArticles();
00124 $aHistoryArticles[] = $sArtId;
00125
00126
00127 $aHistoryArticles = array_unique( $aHistoryArticles);
00128
00129 if (count($aHistoryArticles) > 5) {
00130 array_shift($aHistoryArticles);
00131 }
00132
00133 $this->setHistoryArticles($aHistoryArticles);
00134
00135
00136
00137 if (($iCurrentArt = array_search($sArtId, $aHistoryArticles)) !== false) {
00138 unset ($aHistoryArticles[$iCurrentArt]);
00139 }
00140
00141 $aHistoryArticles = array_values($aHistoryArticles);
00142 $this->loadIds($aHistoryArticles);
00143 $this->_sortByIds($aHistoryArticles);
00144 }
00145
00153 protected function _sortByIds($aIds)
00154 {
00155 $this->_aOrderMap = array_flip($aIds);
00156 uksort($this->_aArray, array($this, '_sortByOrderMapCallback'));
00157 }
00158
00169 protected function _sortByOrderMapCallback($key1, $key2)
00170 {
00171 if (isset($this->_aOrderMap[$key1])) {
00172 if (isset($this->_aOrderMap[$key2])) {
00173 $iDiff = $this->_aOrderMap[$key2] - $this->_aOrderMap[$key1];
00174 if ($iDiff > 0) {
00175 return -1;
00176 } elseif ($iDiff < 0) {
00177 return 1;
00178 } else {
00179 return 0;
00180 }
00181 } else {
00182
00183 return -1;
00184 }
00185 } elseif (isset($this->_aOrderMap[$key2])) {
00186
00187 return 1;
00188 } else {
00189
00190 return 0;
00191 }
00192 }
00193
00201 public function loadNewestArticles( $iLimit = null )
00202 {
00203
00204 $myConfig = $this->getConfig();
00205
00206 if ( !$myConfig->getConfigParam( 'bl_perfLoadPriceForAddList' ) ) {
00207 $this->_blLoadPrice = false;
00208 }
00209
00210 $this->_aArray = array();
00211 switch( $myConfig->getConfigParam( 'iNewestArticlesMode' ) ) {
00212 case 0:
00213
00214 break;
00215 case 1:
00216
00217 $this->loadAktionArticles( 'oxnewest' );
00218 break;
00219 case 2:
00220 $sArticleTable = getViewName('oxarticles');
00221 if ( $myConfig->getConfigParam( 'blNewArtByInsert' ) ) {
00222 $sType = 'oxinsert';
00223 } else {
00224 $sType = 'oxtimestamp';
00225 }
00226 $sSelect = "select * from $sArticleTable ";
00227 $sSelect .= "where oxparentid = '' and ".$this->getBaseObject()->getSqlActiveSnippet()." and oxissearch = 1 order by $sType desc ";
00228 if (!($iLimit = (int) $iLimit)) {
00229 $iLimit = $myConfig->getConfigParam( 'iNrofNewcomerArticles' );
00230 }
00231 $sSelect .= "limit " . $iLimit;
00232
00233 $this->selectString($sSelect);
00234 break;
00235 }
00236
00237 }
00238
00244 public function loadTop5Articles()
00245 {
00246
00247 $myConfig = $this->getConfig();
00248
00249 if ( !$myConfig->getConfigParam( 'bl_perfLoadPriceForAddList' ) ) {
00250 $this->_blLoadPrice = false;
00251 }
00252
00253 switch( $myConfig->getConfigParam( 'iTop5Mode' ) ) {
00254 case 0:
00255
00256 break;
00257 case 1:
00258
00259 $this->loadAktionArticles( 'oxtop5');
00260 break;
00261 case 2:
00262 $sArticleTable = getViewName('oxarticles');
00263
00264 $sSelect = "select * from $sArticleTable ";
00265 $sSelect .= "where ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxissearch = 1 ";
00266 $sSelect .= "and $sArticleTable.oxparentid = '' and $sArticleTable.oxsoldamount>0 ";
00267 $sSelect .= "order by $sArticleTable.oxsoldamount desc limit 5";
00268
00269 $this->selectString($sSelect);
00270 break;
00271 }
00272 }
00273
00281 public function loadAktionArticles( $sActionID )
00282 {
00283
00284 if ( !trim( $sActionID) ) {
00285 return;
00286 }
00287
00288 $sShopID = $this->getConfig()->getShopId();
00289 $sActionID = oxDb::getDb()->quote(strtolower( $sActionID));
00290
00291
00292 $oBaseObject = $this->getBaseObject();
00293 $sArticleTable = $oBaseObject->getViewName();
00294 $sArticleFields = $oBaseObject->getSelectFields();
00295
00296 $oBase = oxNew("oxactions");
00297 $sActiveSql = $oBase->getSqlActiveSnippet();
00298
00299 $sSelect = "select $sArticleFields from oxactions2article
00300 left join $sArticleTable on $sArticleTable.oxid = oxactions2article.oxartid
00301 left join oxactions on oxactions.oxid = oxactions2article.oxactionid
00302 where oxactions2article.oxshopid = '$sShopID' and oxactions2article.oxactionid = $sActionID and $sActiveSql
00303 and $sArticleTable.oxid is not null and " .$oBaseObject->getSqlActiveSnippet(). "
00304 order by oxactions2article.oxsort";
00305
00306 $this->selectString( $sSelect );
00307 }
00308
00316 public function loadArticleCrossSell( $sArticleId )
00317 {
00318 $myConfig = $this->getConfig();
00319
00320
00321 if ( !$myConfig->getConfigParam( 'bl_perfLoadCrossselling' ) ) {
00322 return null;
00323 }
00324
00325 $oBaseObject = $this->getBaseObject();
00326 $sArticleTable = $oBaseObject->getViewName();
00327
00328 $sArticleId = oxDb::getDb()->quote($sArticleId);
00329
00330 $sSelect = "select $sArticleTable.* from oxobject2article left join $sArticleTable on oxobject2article.oxobjectid=$sArticleTable.oxid ";
00331 $sSelect .= "where oxobject2article.oxarticlenid = $sArticleId ";
00332 $sSelect .= " and $sArticleTable.oxid is not null and " .$oBaseObject->getSqlActiveSnippet(). " order by rand()";
00333
00334
00335 if ( $myConfig->getConfigParam( 'blBidirectCross' ) ) {
00336 $sSelect = "select distinct $sArticleTable.* from oxobject2article left join $sArticleTable on (oxobject2article.oxobjectid=$sArticleTable.oxid or oxobject2article.oxarticlenid=$sArticleTable.oxid) ";
00337 $sSelect .= "where (oxobject2article.oxarticlenid = $sArticleId or oxobject2article.oxobjectid = $sArticleId )";
00338 $sSelect .= " and $sArticleTable.oxid is not null and " .$oBaseObject->getSqlActiveSnippet(). " having $sArticleTable.oxid!=$sArticleId order by rand()";
00339 }
00340
00341 $this->setSqlLimit( 0, $myConfig->getConfigParam( 'iNrofCrossellArticles' ));
00342 $this->selectString( $sSelect );
00343 }
00344
00352 public function loadArticleAccessoires( $sArticleId )
00353 {
00354 $myConfig = $this->getConfig();
00355
00356
00357 if ( !$myConfig->getConfigParam( 'bl_perfLoadAccessoires' ) ) {
00358 return;
00359 }
00360
00361 $sArticleId = oxDb::getDb()->quote($sArticleId);
00362
00363 $oBaseObject = $this->getBaseObject();
00364 $sArticleTable = $oBaseObject->getViewName();
00365
00366 $sSelect = "select $sArticleTable.* from oxaccessoire2article left join $sArticleTable on oxaccessoire2article.oxobjectid=$sArticleTable.oxid ";
00367 $sSelect .= "where oxaccessoire2article.oxarticlenid = $sArticleId ";
00368 $sSelect .= " and $sArticleTable.oxid is not null and " .$oBaseObject->getSqlActiveSnippet();
00369
00370 $sSelect .= " order by oxaccessoire2article.oxsort";
00371
00372 $this->selectString( $sSelect );
00373 }
00374
00383 public function loadCategoryIds( $sCatId, $aSessionFilter )
00384 {
00385 $sArticleTable = $this->getBaseObject()->getViewName();
00386 $sSelect = $this->_getCategorySelect( $sArticleTable.'.oxid as oxid', $sCatId, $aSessionFilter );
00387
00388 $this->_createIdListFromSql( $sSelect );
00389 }
00390
00400 public function loadCategoryArticles( $sCatId, $aSessionFilter, $iLimit = null )
00401 {
00402 $sArticleFields = $this->getBaseObject()->getSelectFields();
00403
00404 $sSelect = $this->_getCategorySelect( $sArticleFields, $sCatId, $aSessionFilter );
00405
00406
00407
00408 $iArticleCount = null;
00409 if ( $aSessionFilter) {
00410 $oRet = oxDb::getDb()->Execute( $sSelect );
00411 $iArticleCount = $oRet->recordCount();
00412 }
00413
00414 if ($iLimit = (int) $iLimit) {
00415 $sSelect .= " LIMIT $iLimit";
00416 }
00417
00418 $this->selectString( $sSelect );
00419
00420 if ( $iArticleCount !== null ) {
00421 return $iArticleCount;
00422 }
00423
00424 $iTotalCount = oxUtilsCount::getInstance()->getCatArticleCount($sCatId);
00425
00426
00427 return $iTotalCount;
00428 }
00429
00438 public function loadRecommArticles( $sRecommId, $sArticlesFilter = null )
00439 {
00440 $sSelect = $this->_getArticleSelect( $sRecommId, $sArticlesFilter);
00441 $this->selectString( $sSelect );
00442 }
00443
00452 public function loadRecommArticleIds( $sRecommId, $sArticlesFilter )
00453 {
00454 $sSelect = $this->_getArticleSelect( $sRecommId, $sArticlesFilter );
00455
00456 $sArtView = getViewName( 'oxarticles' );
00457 $sPartial = substr( $sSelect, strpos( $sSelect, ' from ' ) );
00458 $sSelect = "select distinct $sArtView.oxid $sPartial ";
00459
00460 $this->_createIdListFromSql( $sSelect );
00461 }
00462
00471 protected function _getArticleSelect( $sRecommId, $sArticlesFilter = null )
00472 {
00473 $sRecommId = oxDb::getDb()->quote($sRecommId);
00474
00475 $sArtView = getViewName( 'oxarticles' );
00476 $sSelect = "select distinct $sArtView.*, oxobject2list.oxdesc from oxobject2list ";
00477 $sSelect .= "left join $sArtView on oxobject2list.oxobjectid = $sArtView.oxid ";
00478 $sSelect .= "where (oxobject2list.oxlistid = $sRecommId) ".$sArticlesFilter;
00479
00480 return $sSelect;
00481 }
00482
00493 public function loadSearchIds( $sSearchStr = '', $sSearchCat = '', $sSearchVendor = '', $sSearchManufacturer = '' )
00494 {
00495 $oDb = oxDb::getDb();
00496 $sSearchCat = $sSearchCat?$sSearchCat:null;
00497 $sSearchVendor = $sSearchVendor?$sSearchVendor:null;
00498 $sSearchManufacturer = $sSearchManufacturer?$sSearchManufacturer:null;
00499
00500 $sWhere = null;
00501
00502 if ( $sSearchStr ) {
00503 $sWhere = $this->_getSearchSelect( $sSearchStr );
00504 }
00505
00506 $sArticleTable = getViewName('oxarticles');
00507
00508
00509 $sDescTable = '';
00510 $sDescJoin = '';
00511 if ( is_array( $aSearchCols = $this->getConfig()->getConfigParam( 'aSearchCols' ) ) ) {
00512 if ( in_array( 'oxlongdesc', $aSearchCols ) || in_array( 'oxtags', $aSearchCols ) ) {
00513 $sDescView = getViewName( 'oxartextends' );
00514 $sDescJoin = " LEFT JOIN $sDescView ON {$sDescView}.oxid={$sArticleTable}.oxid ";
00515 }
00516 }
00517
00518
00519 $sSelect = "select $sArticleTable.oxid from $sArticleTable $sDescJoin where ";
00520
00521
00522 if ( $sSearchCat ) {
00523 $sO2CView = getViewName('oxobject2category');
00524 $sSelect = "select $sArticleTable.oxid from $sO2CView as oxobject2category, $sArticleTable $sDescJoin ";
00525 $sSelect .= "where oxobject2category.oxcatnid=".$oDb->quote( $sSearchCat )." and oxobject2category.oxobjectid=$sArticleTable.oxid and ";
00526 }
00527 $sSelect .= $this->getBaseObject()->getSqlActiveSnippet();
00528 $sSelect .= " and $sArticleTable.oxparentid = '' and $sArticleTable.oxissearch = 1 ";
00529
00530
00531 if ( $sSearchVendor ) {
00532 $sSelect .= " and $sArticleTable.oxvendorid = ".$oDb->quote( $sSearchVendor )." ";
00533 }
00534
00535 if ( $sSearchManufacturer ) {
00536 $sSelect .= " and $sArticleTable.oxmanufacturerid = ".$oDb->quote( $sSearchManufacturer )." ";
00537 }
00538 $sSelect .= $sWhere;
00539
00540 if ($this->_sCustomSorting) {
00541 $sSelect .= " order by {$this->_sCustomSorting} ";
00542 }
00543
00544 $this->_createIdListFromSql($sSelect);
00545 }
00546
00555 public function loadPriceIds( $dPriceFrom, $dPriceTo )
00556 {
00557 $sSelect = $this->_getPriceSelect( $dPriceFrom, $dPriceTo );
00558 $this->_createIdListFromSql( $sSelect );
00559 }
00560
00571 public function loadPriceArticles( $dPriceFrom, $dPriceTo, $oCategory = null)
00572 {
00573 $sArticleTable = getViewName('oxarticles');
00574
00575 $sSelect = $this->_getPriceSelect( $dPriceFrom, $dPriceTo );
00576
00577 $this->selectString( $sSelect);
00578
00579
00580 if ( !$oCategory ) {
00581 return $this->count();
00582 }
00583
00584
00585 $iNumOfArticles = $oCategory->getNrOfArticles();
00586 if ( !isset($iNumOfArticles) || $iNumOfArticles == -1) {
00587 return oxUtilsCount::getInstance()->getPriceCatArticleCount($oCategory->getId(), $dPriceFrom, $dPriceTo );
00588 } else {
00589 return $oCategory->getNrOfArticles();
00590 }
00591 }
00592
00600 public function loadVendorIDs( $sVendorId)
00601 {
00602 $sSelect = $this->_getVendorSelect($sVendorId);
00603 $this->_createIdListFromSql($sSelect);
00604 }
00605
00613 public function loadManufacturerIDs( $sManufacturerId)
00614 {
00615 $sSelect = $this->_getManufacturerSelect($sManufacturerId);
00616 $this->_createIdListFromSql($sSelect);
00617 }
00618
00628 public function loadVendorArticles( $sVendorId, $oVendor = null )
00629 {
00630 $sSelect = $this->_getVendorSelect($sVendorId);
00631 $this->selectString( $sSelect);
00632
00633 return oxUtilsCount::getInstance()->getVendorArticleCount( $sVendorId );
00634 }
00635
00645 public function loadManufacturerArticles( $sManufacturerId, $oManufacturer = null )
00646 {
00647 $sSelect = $this->_getManufacturerSelect($sManufacturerId);
00648 $this->selectString( $sSelect);
00649
00650 return oxUtilsCount::getInstance()->getManufacturerArticleCount( $sManufacturerId );
00651 }
00652
00661 public function loadTagArticles( $sTag, $iLang )
00662 {
00663 $oListObject = $this->getBaseObject();
00664 $sArticleTable = $oListObject->getViewName();
00665 $sArticleFields = $oListObject->getSelectFields();
00666
00667 $sLangExt = oxLang::getInstance()->getLanguageTag( $iLang );
00668
00669 $oTagHandler = oxNew( 'oxtagcloud' );
00670 $sTag = $oTagHandler->prepareTags( $sTag );
00671
00672 $sQ = "select {$sArticleFields} from oxartextends inner join {$sArticleTable} on ".
00673 "{$sArticleTable}.oxid = oxartextends.oxid where match ( oxartextends.oxtags{$sLangExt} ) ".
00674 "against( ".oxDb::getDb()->quote( $sTag )." IN BOOLEAN MODE )";
00675
00676
00677 if ( ( $sActiveSnippet = $oListObject->getSqlActiveSnippet() ) ) {
00678 $sQ .= " and {$sActiveSnippet}";
00679 }
00680
00681 if ( $this->_sCustomSorting ) {
00682 $sSort = $this->_sCustomSorting;
00683 if (strpos($sSort, '.') === false) {
00684 $sSort = $sArticleTable.'.'.$sSort;
00685 }
00686 $sQ .= " order by $sSort ";
00687 }
00688
00689 $this->selectString( $sQ );
00690
00691
00692 return oxUtilsCount::getInstance()->getTagArticleCount( $sTag, $iLang );
00693 }
00694
00703 public function getTagArticleIds( $sTag, $iLang )
00704 {
00705 $oListObject = $this->getBaseObject();
00706 $sArticleTable = $oListObject->getViewName();
00707 $sLangExt = oxLang::getInstance()->getLanguageTag( $iLang );
00708
00709 $oTagHandler = oxNew( 'oxtagcloud' );
00710 $sTag = $oTagHandler->prepareTags( $sTag );
00711
00712 $sQ = "select oxartextends.oxid from oxartextends inner join {$sArticleTable} on ".
00713 "{$sArticleTable}.oxid = oxartextends.oxid where {$sArticleTable}.oxissearch = 1 and ".
00714 "match ( oxartextends.oxtags{$sLangExt} ) ".
00715 "against( ".oxDb::getDb()->quote( $sTag )." IN BOOLEAN MODE )";
00716
00717
00718 if ( ( $sActiveSnippet = $oListObject->getSqlActiveSnippet() ) ) {
00719 $sQ .= " and {$sActiveSnippet}";
00720 }
00721
00722 if ( $this->_sCustomSorting ) {
00723 $sSort = $this->_sCustomSorting;
00724 if (strpos($sSort, '.') === false) {
00725 $sSort = $sArticleTable.'.'.$sSort;
00726 }
00727 $sQ .= " order by $sSort ";
00728 }
00729
00730 return $this->_createIdListFromSql( $sQ );
00731 }
00732
00740 public function loadIds($aIds)
00741 {
00742 if (!count($aIds)) {
00743 $this->clear();
00744 return;
00745 }
00746
00747 foreach ($aIds as $iKey => $sVal) {
00748 $aIds[$iKey] = mysql_real_escape_string($sVal);
00749 }
00750
00751 $oBaseObject = $this->getBaseObject();
00752 $sArticleTable = $oBaseObject->getViewName();
00753 $sArticleFields = $oBaseObject->getSelectFields();
00754
00755 $sSelect = "select $sArticleFields from $sArticleTable ";
00756 $sSelect .= "where $sArticleTable.oxid in ( '".implode("','", $aIds)."' ) and ";
00757 $sSelect .= $oBaseObject->getSqlActiveSnippet();
00758
00759 $this->selectString($sSelect);
00760 }
00761
00769 public function loadOrderArticles($aOrders)
00770 {
00771 if (!count($aOrders)) {
00772 $this->clear();
00773 return;
00774 }
00775
00776 foreach ($aOrders as $iKey => $oOrder) {
00777 $aOrdersIds[] = $oOrder->getId();
00778 }
00779
00780 $oBaseObject = $this->getBaseObject();
00781 $sArticleTable = $oBaseObject->getViewName();
00782 $sArticleFields = $oBaseObject->getSelectFields();
00783 $sArticleFields = str_replace( "$sArticleTable.oxid", "oxorderarticles.oxartid as oxid", $sArticleFields );
00784
00785 $sSelect = "SELECT $sArticleFields FROM oxorderarticles ";
00786 $sSelect .= "left join $sArticleTable on oxorderarticles.oxartid = $sArticleTable.oxid ";
00787 $sSelect .= "WHERE oxorderarticles.oxorderid IN ( '".implode("','", $aOrdersIds)."' ) ";
00788 $sSelect .= "order by $sArticleTable.oxid ";
00789
00790 $this->selectString( $sSelect );
00791
00792
00793 foreach ( $this as $oArticle ) {
00794 if ( !$oArticle->oxarticles__oxactive->value ) {
00795 $oArticle->setBuyableState( false );
00796 }
00797 }
00798 }
00799
00807 protected function _createIdListFromSql( $sSql)
00808 {
00809 $rs = oxDb::getDb(true)->execute( $sSql);
00810 if ($rs != false && $rs->recordCount() > 0) {
00811 while (!$rs->EOF) {
00812 $rs->fields = array_change_key_case($rs->fields, CASE_LOWER);
00813 $this[$rs->fields['oxid']] = $rs->fields['oxid'];
00814 $rs->moveNext();
00815 }
00816 }
00817 }
00818
00827 protected function _getFilterIdsSql( $sCatId, $aFilter )
00828 {
00829 $sO2CView = getViewName( 'oxobject2category' );
00830 $sFilter = '';
00831 $iCnt = 0;
00832 $sSuffix = oxLang::getInstance()->getLanguageTag();
00833
00834 $oDb = oxDb::getDb();
00835 foreach ( $aFilter as $sAttrId => $sValue ) {
00836 if ( $sValue ) {
00837 if ( $sFilter ) {
00838 $sFilter .= ' or ';
00839 }
00840 $sValue = $oDb->quote( $sValue );
00841 $sAttrId = $oDb->quote( $sAttrId );
00842
00843 $sFilter .= "( oa.oxattrid = {$sAttrId} and oa.oxvalue{$sSuffix} = {$sValue} )";
00844 $iCnt++;
00845 }
00846 }
00847 if ( $sFilter ) {
00848 $sFilter = "WHERE $sFilter ";
00849 }
00850
00851 $sFilterSelect = "select oc.oxobjectid as oxobjectid, count(*) as cnt from ";
00852 $sFilterSelect.= "(SELECT * FROM $sO2CView WHERE $sO2CView.oxcatnid = '$sCatId' GROUP BY $sO2CView.oxobjectid, $sO2CView.oxcatnid) as oc ";
00853 $sFilterSelect.= "INNER JOIN oxobject2attribute as oa ON ( oa.oxobjectid = oc.oxobjectid ) ";
00854 return $sFilterSelect . "{$sFilter} GROUP BY oa.oxobjectid HAVING cnt = $iCnt ";
00855 }
00856
00865 protected function _getFilterSql( $sCatId, $aFilter )
00866 {
00867 $oDb = oxDb::getDb( true );
00868 $sArticleTable = getViewName( 'oxarticles' );
00869 $aIds = $oDb->getAll( $this->_getFilterIdsSql( $sCatId, $aFilter ) );
00870 $sIds = '';
00871
00872 if ( $aIds ) {
00873 foreach ( $aIds as $aArt ) {
00874 if ( $sIds ) {
00875 $sIds .= ', ';
00876 }
00877 $sIds .= $oDb->quote( current( $aArt ) );
00878 }
00879
00880 if ( $sIds ) {
00881 $sFilterSql = " and $sArticleTable.oxid in ( $sIds ) ";
00882 }
00883 }
00884 return $sFilterSql;
00885 }
00886
00896 protected function _getCategorySelect( $sFields, $sCatId, $aSessionFilter )
00897 {
00898 $sArticleTable = getViewName( 'oxarticles' );
00899 $sO2CView = getViewName( 'oxobject2category' );
00900
00901
00902
00903 $sSorting = '';
00904 if ( $this->_sCustomSorting ) {
00905 $sSorting = " {$this->_sCustomSorting} , ";
00906 }
00907
00908
00909
00910 $sFilterSql = '';
00911 if ( $aSessionFilter && isset( $aSessionFilter[$sCatId] ) ) {
00912 $sFilterSql = $this->_getFilterSql($sCatId, $aSessionFilter[$sCatId]);
00913 }
00914
00915 $oDb = oxDb::getDb();
00916
00917 $sSelect = "SELECT $sFields FROM $sO2CView as oc left join $sArticleTable
00918 ON $sArticleTable.oxid = oc.oxobjectid
00919 WHERE ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxparentid = ''
00920 and oc.oxcatnid = ".$oDb->quote($sCatId)." $sFilterSql GROUP BY oc.oxcatnid, oc.oxobjectid ORDER BY $sSorting oc.oxpos, oc.oxobjectid ";
00921
00922 return $sSelect;
00923 }
00924
00932 protected function _getSearchSelect( $sSearchString )
00933 {
00934
00935 if ( !$sSearchString || !str_replace( ' ', '', $sSearchString ) ) {
00936 return '';
00937 }
00938
00939 $oDb = oxDb::getDb();
00940 $myConfig = $this->getConfig();
00941 $myUtils = oxUtils::getInstance();
00942 $sArticleTable = $this->getBaseObject()->getViewName();
00943
00944 $aSearch = explode( ' ', $sSearchString);
00945
00946 $sSearch = ' and ( ';
00947 $blSep = false;
00948
00949
00950 if ( $myConfig->getConfigParam( 'blSearchUseAND' ) ) {
00951 $sSearchSep = ' and ';
00952 } else {
00953 $sSearchSep = ' or ';
00954 }
00955
00956 $aSearchCols = $myConfig->getConfigParam( 'aSearchCols' );
00957 $oBaseObject = $this->getBaseObject();
00958 $myUtilsString = oxUtilsString::getInstance();
00959 foreach ( $aSearch as $sSearchString) {
00960
00961 if ( !strlen( $sSearchString ) ) {
00962 continue;
00963 }
00964
00965 if ( $blSep ) {
00966 $sSearch .= $sSearchSep;
00967 }
00968 $blSep2 = false;
00969 $sSearch .= '( ';
00970
00971 $sUml = $myUtilsString->prepareStrForSearch($sSearchString);
00972 foreach ( $aSearchCols as $sField ) {
00973
00974 if ( $blSep2) {
00975 $sSearch .= ' or ';
00976 }
00977
00978
00979 if ( $sField == 'oxlongdesc' || $sField == 'oxtags') {
00980 $sSearchTable = getViewName( 'oxartextends' );
00981 } else {
00982 $sSearchTable = $sArticleTable;
00983 }
00984
00985 $sField = $oBaseObject->getSqlFieldName( $sField );
00986
00987 $sSearch .= $sSearchTable.'.'.$sField.' like '.$oDb->quote('%'.$sSearchString.'%') . ' ';
00988 if ( $sUml ) {
00989 $sSearch .= ' or '.$sSearchTable.'.'.$sField.' like '.$oDb->quote('%'.$sUml.'%');
00990 }
00991 $blSep2 = true;
00992 }
00993 $sSearch .= ' ) ';
00994 $blSep = true;
00995 }
00996 $sSearch .= ' ) ';
00997
00998 return $sSearch;
00999 }
01000
01009 protected function _getPriceSelect( $dPriceFrom, $dPriceTo )
01010 {
01011 $oBaseObject = $this->getBaseObject();
01012 $sArticleTable = $oBaseObject->getViewName();
01013 $sSelectFields = $oBaseObject->getSelectFields();
01014
01015 $sSubSelect = "select if( oxparentid = '',oxid,oxparentid ) as id from {$sArticleTable} where oxprice >= 0 ";
01016 if ($dPriceTo) {
01017 $sSubSelect .= "and oxprice <= ".(double)$dPriceTo." ";
01018 } else {
01019 $sSubSelect .= " ";
01020 }
01021 if ($dPriceFrom) {
01022 $sSubSelect .= "group by id having min( oxprice ) >= ".(double)$dPriceFrom." ";
01023 } else {
01024 $sSubSelect .= " ";
01025 }
01026
01027 $sSelect = "select {$sSelectFields} from {$sArticleTable} where ";
01028 $sSelect .= "{$sArticleTable}.oxid in ( {$sSubSelect} ) ";
01029 $sSelect .= "and ".$oBaseObject->getSqlActiveSnippet()." and {$sArticleTable}.oxissearch = 1";
01030
01031 if ( !$this->_sCustomSorting ) {
01032 $sSelect .= " order by {$sArticleTable}.oxprice asc , {$sArticleTable}.oxid";
01033 } else {
01034 $sSelect .= " order by {$this->_sCustomSorting}, {$sArticleTable}.oxid ";
01035 }
01036
01037 return $sSelect;
01038
01039 }
01040
01048 protected function _getVendorSelect( $sVendorId )
01049 {
01050 $sArticleTable = getViewName('oxarticles');
01051 $oBaseObject = $this->getBaseObject();
01052 $sFieldNames = $oBaseObject->getSelectFields();
01053 $sSelect = "select $sFieldNames from $sArticleTable ";
01054 $sSelect .= "where $sArticleTable.oxvendorid = ".oxDb::getDb()->quote($sVendorId)." ";
01055 $sSelect .= " and " . $oBaseObject->getSqlActiveSnippet() . " and $sArticleTable.oxparentid = '' ";
01056
01057 if ( $this->_sCustomSorting ) {
01058 $sSelect .= " ORDER BY {$this->_sCustomSorting} ";
01059 }
01060
01061 return $sSelect;
01062 }
01063
01071 protected function _getManufacturerSelect( $sManufacturerId )
01072 {
01073 $sArticleTable = getViewName('oxarticles');
01074 $oBaseObject = $this->getBaseObject();
01075 $sFieldNames = $oBaseObject->getSelectFields();
01076 $sSelect = "select $sFieldNames from $sArticleTable ";
01077 $sSelect .= "where $sArticleTable.oxmanufacturerid = ".oxDb::getDb()->quote($sManufacturerId)." ";
01078 $sSelect .= " and " . $oBaseObject->getSqlActiveSnippet() . " and $sArticleTable.oxparentid = '' ";
01079
01080 if ( $this->_sCustomSorting ) {
01081 $sSelect .= " ORDER BY {$this->_sCustomSorting} ";
01082 }
01083
01084 return $sSelect;
01085 }
01086
01094 public function loadStockRemindProducts( $aBasketContents )
01095 {
01096 if ( is_array( $aBasketContents ) && count( $aBasketContents ) ) {
01097 $oDb = oxDb::getDb();
01098 foreach ( $aBasketContents as $oBasketItem ) {
01099 $aArtIds[] = $oDb->quote($oBasketItem->getProductId());
01100 }
01101
01102 $oBaseObject = $this->getBaseObject();
01103
01104 $sFieldNames = $oBaseObject->getSelectFields();
01105 $sTable = $oBaseObject->getViewName();
01106
01107
01108 $sQ = "select {$sFieldNames} from {$sTable} where {$sTable}.oxid in ( ".implode( ",", $aArtIds )." ) and
01109 oxremindactive = '1' and oxstock <= oxremindamount";
01110 $this->selectString( $sQ );
01111
01112
01113 if ( $this->count() ) {
01114 $sQ = "update {$sTable} set oxremindactive = '2' where {$sTable}.oxid in ( ".implode( ",", $aArtIds )." ) and
01115 oxremindactive = '1' and oxstock <= oxremindamount";
01116 $oDb->execute( $sQ );
01117 }
01118 }
01119 }
01120 }