00001 <?php
00002
00008 class oxRssFeed extends oxSuperCfg
00009 {
00013 const CACHE_TTL = 10800;
00014
00018 const RSS_TOPSHOP = 'RSS_TopShop';
00019 const RSS_NEWARTS = 'RSS_NewArts';
00020 const RSS_CATARTS = 'RSS_CatArts';
00021 const RSS_ARTRECOMMLISTS = 'RSS_ARTRECOMMLISTS';
00022 const RSS_RECOMMLISTARTS = 'RSS_RECOMMLISTARTS';
00023 const RSS_BARGAIN = 'RSS_Bargain';
00024
00031 protected $_aChannel = array();
00032
00039 public function getChannel()
00040 {
00041 return $this->_aChannel;
00042 }
00043
00050 protected function _loadBaseChannel()
00051 {
00052 $myUtils = oxUtils::getInstance();
00053 $oShop = $this->getConfig()->getActiveShop();
00054 $this->_aChannel['title'] = $oShop->oxshops__oxname->value;
00055 $this->_aChannel['link'] = $myUtils->prepareUrlForNoSession($this->getConfig()->getShopHomeURL());
00056 $this->_aChannel['description'] = '';
00057 $oLang = oxLang::getInstance();
00058 $aLangIds = $oLang->getLanguageIds();
00059 $this->_aChannel['language'] = $aLangIds[$oLang->getBaseLanguage()];
00060 $this->_aChannel['copyright'] = $oShop->oxshops__oxname->value;
00061 $this->_aChannel['selflink'] = '';
00062 if ( $myUtils->isValidEmail( $oShop->oxshops__oxinfoemail->value )) {
00063 $this->_aChannel['managingEditor'] = $oShop->oxshops__oxinfoemail->value;
00064 }
00065
00066
00067 $this->_aChannel['generator'] = 'OXID eShop '.$oShop->oxshops__oxversion->value;
00068 $this->_aChannel['image']['url'] = $this->getConfig()->getImageUrl().'logo.png';
00069
00070
00071 $this->_aChannel['image']['title'] = $this->_aChannel['title'];
00072 $this->_aChannel['image']['link'] = $this->_aChannel['link'];
00073 }
00074
00083 protected function _getCacheId($name)
00084 {
00085 return $name.'_'.$this->getConfig()->getShopId().'_'.oxLang::getInstance()->getBaseLanguage().'_'.(int) oxConfig::getParameter('currency');
00086 }
00087
00096 protected function _loadFromCache($name)
00097 {
00098 if ($aRes = oxUtils::getInstance()->fromFileCache($this->_getCacheId($name))) {
00099 if ($aRes['timestamp'] > time() - self::CACHE_TTL) {
00100 return $aRes['content'];
00101 }
00102 }
00103 return false;
00104 }
00105
00106
00117 protected function _getLastBuildDate($name, $aData)
00118 {
00119 if ($aData2 = oxUtils::getInstance()->fromFileCache($this->_getCacheId($name))) {
00120 $sLastBuildDate = $aData2['content']['lastBuildDate'];
00121 $aData2['content']['lastBuildDate'] = '';
00122 $aData['lastBuildDate'] = '';
00123 if (!strcmp(serialize($aData), serialize($aData2['content']))) {
00124 return $sLastBuildDate;
00125 }
00126 }
00127 return date('D, d M Y H:i:s O');
00128 }
00129
00142 protected function _saveToCache($name, $aContent)
00143 {
00144 $aData = array( 'timestamp' => time(), 'content' => $aContent );
00145 return oxUtils::getInstance()->toFileCache($this->_getCacheId($name), $aData);
00146 }
00147
00148
00157 protected function _getArticleItems(oxArticleList $oList)
00158 {
00159 $myUtils = oxUtils::getInstance();
00160 $aItems = array();
00161 $oLang = oxLang::getInstance();
00162 $oStr = getStr();
00163
00164 foreach ($oList as $oArticle) {
00165 $oItem = new oxStdClass();
00166 $oActCur = $this->getConfig()->getActShopCurrencyObject();
00167 $sPrice = '';
00168 if ( $oPrice = $oArticle->getPrice() ) {
00169 $sPrice = " " . $oArticle->getPriceFromPrefix().$oLang->formatCurrency( $oPrice->getBruttoPrice(), $oActCur ) . " ". $oActCur->sign;
00170 }
00171 $oItem->title = strip_tags($oArticle->oxarticles__oxtitle->value . $sPrice);
00172 $oItem->guid = $oItem->link = $myUtils->prepareUrlForNoSession($oArticle->getLink());
00173 $oItem->isGuidPermalink = true;
00174 $oItem->description = $oArticle->getArticleLongDesc()->value;
00175 if (trim(str_replace(' ', '', (strip_tags($oItem->description)))) == '') {
00176 $oItem->description = $oArticle->oxarticles__oxshortdesc->value;
00177 }
00178
00179 $oItem->description = trim($oItem->description);
00180 if ($sIcon = $oArticle->getIconUrl()) {
00181 $oItem->description = "<img src='$sIcon' border=0 align='left' hspace=5>".$oItem->description;
00182 }
00183 $oItem->description = $oStr->htmlspecialchars( $oItem->description );
00184
00185 $aItems[] = $oItem;
00186 }
00187 return $aItems;
00188 }
00189
00200 protected function _prepareUrl($sUri, $sTitle)
00201 {
00202 $iLang = oxLang::getInstance()->getBaseLanguage();
00203 $sUrl = $this->_getShopUrl();
00204 $sUrl .= $sUri.'&lang='.$iLang;
00205
00206 if ( oxUtils::getInstance()->seoIsActive() ) {
00207 $oEncoder = oxSeoEncoder::getInstance();
00208 $sUrl = $oEncoder->getDynamicUrl( $sUrl, "rss/{$sTitle}/", $iLang );
00209 }
00210
00211 return oxUtils::getInstance()->prepareUrlForNoSession( $sUrl );
00212 }
00213
00223 protected function _prepareFeedName($sTitle)
00224 {
00225 $oShop = $this->getConfig()->getActiveShop();
00226
00227 return $oShop->oxshops__oxname->value . "/" . $sTitle;
00228 }
00229
00236 protected function _getShopUrl()
00237 {
00238 $sUrl = $this->getConfig()->getShopUrl();
00239 $oStr = getStr();
00240 if ( $oStr->strpos($sUrl, '?') !== false ) {
00241 if ( !$oStr->preg_match('/[?&](amp;)?$/i', $sUrl)) {
00242 $sUrl .= '&';
00243 }
00244 } else {
00245 $sUrl .= '?';
00246 }
00247 return $sUrl;
00248 }
00249
00263 protected function _loadData($sTag, $sTitle, $sDesc, $aItems, $sRssUrl, $sTargetUrl = null)
00264 {
00265 $this->_loadBaseChannel();
00266
00267 $this->_aChannel['selflink'] = $sRssUrl;
00268
00269 if ($sTargetUrl) {
00270 $this->_aChannel['link'] = $this->_aChannel['image']['link'] = $sTargetUrl;
00271 }
00272
00273 $this->_aChannel['image']['title'] = $this->_aChannel['title'] = $sTitle;
00274 $this->_aChannel['image']['description'] = $this->_aChannel['description'] = $sDesc;
00275
00276 $this->_aChannel['items'] = $aItems;
00277
00278 if ($sTag) {
00279 $this->_aChannel['lastBuildDate'] = $this->_getLastBuildDate($sTag, $this->_aChannel);
00280 $this->_saveToCache($sTag, $this->_aChannel);
00281 } else {
00282 $this->_aChannel['lastBuildDate'] = date( 'D, d M Y H:i:s O', oxUtilsDate::getInstance()->getTime() );
00283 }
00284 }
00285
00293 public function getTopInShopTitle()
00294 {
00295 $oLang = oxLang::getInstance();
00296 $iLang = $oLang->getBaseLanguage();
00297 return $this->_prepareFeedName( $oLang->translateString( 'RSS_TOPSHOP_TITLE', $iLang ) );
00298 }
00299
00307 public function getTopInShopUrl()
00308 {
00309 return $this->_prepareUrl("cl=rss&fnc=topshop", $this->getTopInShopTitle());
00310 }
00311
00319 public function loadTopInShop()
00320 {
00321 if ( ( $this->_aChannel = $this->_loadFromCache( self::RSS_TOPSHOP ) ) ) {
00322 return;
00323 }
00324
00325 $oArtList = oxNew( 'oxarticlelist' );
00326 $oArtList->loadTop5Articles();
00327
00328 $oLang = oxLang::getInstance();
00329 $this->_loadData(
00330 self::RSS_TOPSHOP,
00331 $this->getTopInShopTitle(),
00332 $oLang->translateString( 'RSS_TOPSHOP_DESCRIPTION', $oLang->getBaseLanguage() ),
00333 $this->_getArticleItems($oArtList),
00334 $this->getTopInShopUrl()
00335 );
00336 }
00337
00338
00339
00347 public function getNewestArticlesTitle()
00348 {
00349 $oLang = oxLang::getInstance();
00350 $iLang = $oLang->getBaseLanguage();
00351 return $this->_prepareFeedName( $oLang->translateString( 'RSS_NEWESTARTICLES_TITLE', $iLang ) );
00352 }
00353
00361 public function getNewestArticlesUrl()
00362 {
00363 return $this->_prepareUrl("cl=rss&fnc=newarts", $this->getNewestArticlesTitle());
00364 }
00365
00373 public function loadNewestArticles()
00374 {
00375 if ( ( $this->_aChannel = $this->_loadFromCache(self::RSS_NEWARTS ) ) ) {
00376 return;
00377 }
00378 $oArtList = oxNew( 'oxarticlelist' );
00379 $oArtList->loadNewestArticles( $this->getConfig()->getConfigParam( 'iRssItemsCount' ) );
00380
00381 $oLang = oxLang::getInstance();
00382 $this->_loadData(
00383 self::RSS_NEWARTS,
00384 $this->getNewestArticlesTitle( ),
00385 $oLang->translateString( 'RSS_NEWESTARTICLES_DESCRIPTION', $oLang->getBaseLanguage() ),
00386 $this->_getArticleItems($oArtList),
00387 $this->getNewestArticlesUrl()
00388 );
00389 }
00390
00391
00401 public function getCategoryArticlesTitle(oxCategory $oCat)
00402 {
00403 $oLang = oxLang::getInstance();
00404 $iLang = $oLang->getBaseLanguage();
00405 $sTitle = $this->_getCatPath($oCat);
00406 return $this->_prepareFeedName( $sTitle . $oLang->translateString( 'RSS_CATEGORYARTICLES_TITLE', $iLang ) );
00407 }
00408
00416 protected function _getCatPath( $oCat )
00417 {
00418 $sCatPathString = '';
00419 $sSep = '';
00420 while ( $oCat ) {
00421
00422 $sCatPathString = $oCat->oxcategories__oxtitle->value.$sSep.$sCatPathString ;
00423 $sSep = '/';
00424
00425 $oCat = $oCat->getParentCategory();
00426 }
00427 return $sCatPathString;
00428 }
00429
00439 public function getCategoryArticlesUrl(oxCategory $oCat)
00440 {
00441 $oLang = oxLang::getInstance();
00442 return $this->_prepareUrl("cl=rss&fnc=catarts&cat=".urlencode($oCat->getId()),
00443 sprintf($oLang->translateString( 'RSS_CATEGORYARTICLES_URL', $oLang->getBaseLanguage() ), $oCat->oxcategories__oxtitle->value));
00444 }
00445
00455 public function loadCategoryArticles( oxCategory $oCat )
00456 {
00457 $sId = $oCat->getId();
00458 if ( ( $this->_aChannel = $this->_loadFromCache( self::RSS_CATARTS.$sId ) ) ) {
00459 return;
00460 }
00461
00462 $oArtList = oxNew( 'oxarticlelist' );
00463 $oArtList->setCustomSorting('oc.oxtime desc');
00464 $oArtList->loadCategoryArticles($oCat->getId(), null, $this->getConfig()->getConfigParam( 'iRssItemsCount' ));
00465
00466 $oLang = oxLang::getInstance();
00467 $this->_loadData(
00468 self::RSS_CATARTS.$sId,
00469 $this->getCategoryArticlesTitle($oCat),
00470 sprintf($oLang->translateString( 'RSS_CATEGORYARTICLES_DESCRIPTION', $oLang->getBaseLanguage() ), $oCat->oxcategories__oxtitle->value),
00471 $this->_getArticleItems($oArtList),
00472 $this->getCategoryArticlesUrl($oCat),
00473 $oCat->getLink()
00474 );
00475 }
00476
00477
00490 public function getSearchArticlesTitle($sSearch, $sCatId, $sVendorId, $sManufacturerId)
00491 {
00492 return $this->_prepareFeedName( getStr()->htmlspecialchars($this->_getSearchParamsTranslation('RSS_SEARCHARTICLES_TITLE', $sSearch, $sCatId, $sVendorId, $sManufacturerId)) );
00493 }
00494
00507 protected function _getSearchParamsUrl($sSearch, $sCatId, $sVendorId, $sManufacturerId)
00508 {
00509 $sParams = "searchparam=".urlencode($sSearch);
00510 if ($sCatId) {
00511 $sParams .= "&searchcnid=".urlencode($sCatId);
00512 }
00513
00514 if ($sVendorId) {
00515 $sParams .= "&searchvendor=".urlencode($sVendorId);
00516 }
00517
00518 if ($sManufacturerId) {
00519 $sParams .= "&searchmanufacturer=".urlencode($sManufacturerId);
00520 }
00521
00522 return $sParams;
00523 }
00524
00535 protected function _getObjectField($sId, $sObject, $sField)
00536 {
00537 if (!$sId) {
00538 return '';
00539 }
00540 $oObj = oxNew($sObject);
00541 if ($oObj->load($sId)) {
00542 return $oObj->$sField->value;
00543 }
00544 return '';
00545 }
00546
00560 protected function _getSearchParamsTranslation($sId, $sSearch, $sCatId, $sVendorId, $sManufacturerId)
00561 {
00562 $oLang = oxLang::getInstance();
00563 $sCatTitle = '';
00564 if ($sTitle = $this->_getObjectField($sCatId, 'oxcategory', 'oxcategories__oxtitle')) {
00565 $sCatTitle = sprintf($oLang->translateString( 'RSS_SEARCHARTICLES_TAG_CATEGORY', $oLang->getBaseLanguage() ), $sTitle);
00566 }
00567 $sVendorTitle = '';
00568 if ($sTitle = $this->_getObjectField($sVendorId, 'oxvendor', 'oxvendor__oxtitle')) {
00569 $sVendorTitle = sprintf($oLang->translateString( 'RSS_SEARCHARTICLES_TAG_VENDOR', $oLang->getBaseLanguage() ), $sTitle);
00570 }
00571 $sManufacturerTitle = '';
00572 if ($sTitle = $this->_getObjectField($sManufacturerId, 'oxmanufacturer', 'oxmanufacturers__oxtitle')) {
00573 $sManufacturerTitle = sprintf($oLang->translateString( 'RSS_SEARCHARTICLES_TAG_MANUFACTURER', $oLang->getBaseLanguage() ), $sTitle);
00574 }
00575
00576 $sRet = sprintf($oLang->translateString( $sId, $oLang->getBaseLanguage() ), $sSearch);
00577
00578 $sRet = str_replace('<TAG_CATEGORY>', $sCatTitle, $sRet);
00579 $sRet = str_replace('<TAG_VENDOR>', $sVendorTitle, $sRet);
00580 $sRet = str_replace('<TAG_MANUFACTURER>', $sManufacturerTitle, $sRet);
00581
00582 return $sRet;
00583 }
00584
00597 public function getSearchArticlesUrl( $sSearch, $sCatId, $sVendorId, $sManufacturerId )
00598 {
00599 $oLang = oxLang::getInstance();
00600 $sUrl = $this->_prepareUrl("cl=rss&fnc=searcharts", $oLang->translateString( 'RSS_SEARCHARTICLES_URL', $oLang->getBaseLanguage()));
00601
00602 $sJoin = '?';
00603 if (strpos($sUrl, '?') !== false) {
00604 $sJoin = '&';
00605 }
00606 return $sUrl.$sJoin.$this->_getSearchParamsUrl($sSearch, $sCatId, $sVendorId, $sManufacturerId);
00607 }
00608
00621 public function loadSearchArticles( $sSearch, $sCatId, $sVendorId, $sManufacturerId )
00622 {
00623
00624
00625
00626
00627
00628 $oConfig = $this->getConfig();
00629 $oConfig->setConfigParam('iNrofCatArticles', $oConfig->getConfigParam( 'iRssItemsCount' ));
00630
00631 $oArtList = oxNew( 'oxsearch' )->getSearchArticles($sSearch, $sCatId, $sVendorId, $sManufacturerId, oxNew('oxarticle')->getViewName().'.oxtimestamp desc');
00632
00633 $this->_loadData(
00634
00635 null,
00636
00637 $this->getSearchArticlesTitle($sSearch, $sCatId, $sVendorId, $sManufacturerId),
00638 $this->_getSearchParamsTranslation('RSS_SEARCHARTICLES_DESCRIPTION', getStr()->htmlspecialchars( $sSearch ), $sCatId, $sVendorId, $sManufacturerId),
00639 $this->_getArticleItems($oArtList),
00640 $this->getSearchArticlesUrl($sSearch, $sCatId, $sVendorId, $sManufacturerId),
00641 $this->_getShopUrl()."cl=search&".$this->_getSearchParamsUrl($sSearch, $sCatId, $sVendorId, $sManufacturerId)
00642 );
00643 }
00644
00652 public function getRecommListsTitle(oxArticle $oArticle)
00653 {
00654 $oLang = oxLang::getInstance();
00655 $iLang = $oLang->getBaseLanguage();
00656 return $this->_prepareFeedName( sprintf($oLang->translateString( 'RSS_ARTRECOMMLISTS_TITLE', $iLang ), $oArticle->oxarticles__oxtitle->value) );
00657 }
00658
00666 public function getRecommListsUrl(oxArticle $oArticle)
00667 {
00668 $oLang = oxLang::getInstance();
00669 $iLang = $oLang->getBaseLanguage();
00670 return $this->_prepareUrl("cl=rss&fnc=recommlists&anid=".$oArticle->getId(),
00671 sprintf($oLang->translateString( 'RSS_ARTRECOMMLISTS_URL', $iLang ), $oArticle->oxarticles__oxtitle->value));
00672 }
00673
00681 protected function _getRecommListItems($oList)
00682 {
00683 $myUtils = oxUtils::getInstance();
00684 $aItems = array();
00685 foreach ($oList as $oRecommList) {
00686 $oItem = new oxStdClass();
00687 $oItem->title = $oRecommList->oxrecommlists__oxtitle->value;
00688 $oItem->guid = $oItem->link = $myUtils->prepareUrlForNoSession($oRecommList->getLink());
00689 $oItem->isGuidPermalink = true;
00690 $oItem->description = $oRecommList->oxrecommlists__oxdesc->value;
00691
00692 $aItems[] = $oItem;
00693 }
00694 return $aItems;
00695 }
00696
00704 public function loadRecommLists(oxArticle $oArticle)
00705 {
00706 if ( ( $this->_aChannel = $this->_loadFromCache( self::RSS_ARTRECOMMLISTS.$oArticle->getId() ) ) ) {
00707 return;
00708 }
00709
00710 $oConfig = $this->getConfig();
00711 $oConfig->setConfigParam('iNrofCrossellArticles', $oConfig->getConfigParam( 'iRssItemsCount' ));
00712
00713 $oList = oxNew( 'oxrecommlist' )->getRecommListsByIds(array($oArticle->getId()));
00714 if ($oList == null) {
00715 $oList = oxNew('oxlist');
00716 }
00717
00718 $oLang = oxLang::getInstance();
00719 $this->_loadData(
00720 self::RSS_ARTRECOMMLISTS.$oArticle->getId(),
00721 $this->getRecommListsTitle($oArticle),
00722 sprintf($oLang->translateString( 'RSS_ARTRECOMMLISTS_DESCRIPTION', $oLang->getBaseLanguage() ), $oArticle->oxarticles__oxtitle->value),
00723 $this->_getRecommListItems($oList),
00724 $this->getRecommListsUrl($oArticle),
00725 $oArticle->getLink()
00726 );
00727 }
00728
00736 public function getRecommListArticlesTitle(oxRecommList $oRecommList)
00737 {
00738 $oLang = oxLang::getInstance();
00739 $iLang = $oLang->getBaseLanguage();
00740 return $this->_prepareFeedName( sprintf($oLang->translateString( 'RSS_RECOMMLISTARTICLES_TITLE', $iLang ), $oRecommList->oxrecommlists__oxtitle->value) );
00741 }
00742
00750 public function getRecommListArticlesUrl(oxRecommList $oRecommList)
00751 {
00752 $oLang = oxLang::getInstance();
00753 $iLang = $oLang->getBaseLanguage();
00754 return $this->_prepareUrl("cl=rss&fnc=recommlistarts&recommid=".$oRecommList->getId(),
00755 sprintf($oLang->translateString( 'RSS_RECOMMLISTARTICLES_URL', $iLang ), $oRecommList->oxrecommlists__oxtitle->value));
00756 }
00757
00765 public function loadRecommListArticles(oxRecommList $oRecommList)
00766 {
00767 if ( ( $this->_aChannel = $this->_loadFromCache( self::RSS_RECOMMLISTARTS.$oRecommList->getId() ) ) ) {
00768 return;
00769 }
00770
00771 $oList = oxNew( 'oxarticlelist' );
00772 $oList->loadRecommArticles( $oRecommList->getId(), ' order by oxobject2list.oxtimestamp desc limit '. $this->getConfig()->getConfigParam( 'iRssItemsCount' ) );
00773
00774 $oLang = oxLang::getInstance();
00775 $this->_loadData(
00776 self::RSS_RECOMMLISTARTS.$oRecommList->getId(),
00777 $this->getRecommListArticlesTitle($oRecommList),
00778 sprintf($oLang->translateString( 'RSS_RECOMMLISTARTICLES_DESCRIPTION', $oLang->getBaseLanguage() ), $oRecommList->oxrecommlists__oxtitle->value),
00779 $this->_getArticleItems($oList),
00780 $this->getRecommListArticlesUrl($oRecommList),
00781 $oRecommList->getLink()
00782 );
00783 }
00784
00792 public function getBargainTitle()
00793 {
00794 $oLang = oxLang::getInstance();
00795 $iLang = $oLang->getBaseLanguage();
00796 return $this->_prepareFeedName( $oLang->translateString( 'RSS_BARGAIN_TITLE', $iLang ) );
00797 }
00798
00806 public function getBargainUrl()
00807 {
00808 return $this->_prepareUrl("cl=rss&fnc=bargain", $this->getBargainTitle());
00809 }
00810
00818 public function loadBargain()
00819 {
00820 if ( ( $this->_aChannel = $this->_loadFromCache( self::RSS_BARGAIN ) ) ) {
00821 return;
00822 }
00823
00824 $oArtList = oxNew( 'oxarticlelist' );
00825 $oArtList->loadAktionArticles( 'OXBARGAIN' );
00826
00827 $oLang = oxLang::getInstance();
00828 $this->_loadData(
00829 self::RSS_BARGAIN,
00830 $this->getBargainTitle(),
00831 $oLang->translateString( 'RSS_BARGAIN_DESCRIPTION', $oLang->getBaseLanguage() ),
00832 $this->_getArticleItems($oArtList),
00833 $this->getBargainUrl()
00834 );
00835 }
00836
00837 }
00838