oxseoencoderarticle.php

Go to the documentation of this file.
00001 <?php
00002 
00007 class oxSeoEncoderArticle extends oxSeoEncoder
00008 {
00014     protected static $_instance = null;
00015 
00021     protected static $_aTitleCache = array();
00022 
00030     public static function getInstance()
00031     {
00032         return oxRegistry::get("oxSeoEncoderArticle");
00033     }
00034 
00040     protected function _getUrlExtension()
00041     {
00042         return '.html';
00043     }
00044 
00054     protected function _getProductForLang( $oArticle, $iLang )
00055     {
00056         if ( isset( $iLang ) && $iLang != $oArticle->getLanguage() ) {
00057             $sId = $oArticle->getId();
00058             $oArticle = oxNew( 'oxarticle' );
00059             $oArticle->setSkipAssign( true );
00060             $oArticle->loadInLang( $iLang, $sId );
00061         }
00062 
00063         return $oArticle;
00064     }
00065 
00074     public function getArticleRecommUri( $oArticle, $iLang )
00075     {
00076         $sSeoUri = null;
00077         if ( $oRecomm = $this->_getRecomm( $oArticle, $iLang ) ) {
00078             //load details link from DB
00079             if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oRecomm->getId(), true ) ) ) {
00080 
00081                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00082 
00083                 // create title part for uri
00084                 $sTitle = $this->_prepareArticleTitle( $oArticle );
00085 
00086                 // create uri for all categories
00087                 $sSeoUri = oxRegistry::get("oxSeoEncoderRecomm")->getRecommUri( $oRecomm, $iLang );
00088                 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00089 
00090                 $aStdParams = array( 'recommid' => $oRecomm->getId(), 'listtype' => $this->_getListType() );
00091                 $this->_saveToDb(
00092                             'oxarticle',
00093                             $oArticle->getId(),
00094                             oxRegistry::get("oxUtilsUrl")->appendUrl(
00095                                     $oArticle->getBaseStdLink( $iLang ),
00096                                     $aStdParams
00097                             ),
00098                             $sSeoUri,
00099                             $iLang,
00100                             null,
00101                             0,
00102                             $oRecomm->getId()
00103                         );
00104             }
00105         }
00106         return $sSeoUri;
00107     }
00108 
00117     protected function _getRecomm( $oArticle, $iLang )
00118     {
00119         $oList = null;
00120         $oView = $this->getConfig()->getActiveView();
00121         if ( $oView instanceof oxView ) {
00122             $oList = $oView->getActiveRecommList();
00123         }
00124         return $oList;
00125     }
00126 
00132     protected function _getListType()
00133     {
00134         return $this->getConfig()->getActiveView()->getListType();
00135     }
00136 
00146     public function getArticleTagUri( $oArticle, $iLang, $blRegenerate = false )
00147     {
00148         $sSeoUri = null;
00149         if ( $sTag = $this->_getTag( $oArticle, $iLang ) ) {
00150             $iShopId = $this->getConfig()->getShopId();
00151             $sStdUrl = $oArticle->getStdTagLink( $sTag );
00152             if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'dynamic', $this->getDynamicObjectId( $iShopId, $sStdUrl ), $iLang ) ) ) {
00153                 // generating new if not found
00154                 if ( $sSeoUri = oxRegistry::get("oxSeoEncoderTag")->getTagUri( $sTag, $iLang, $oArticle->getId() ) ) {
00155                     $sSeoUri .= $this->_prepareArticleTitle( $oArticle );
00156                     $sSeoUri  = $this->_processSeoUrl( $sSeoUri, $this->_getStaticObjectId( $iShopId, $sStdUrl ), $iLang );
00157                     $sSeoUri  = $this->_getDynamicUri( $sStdUrl, $sSeoUri, $iLang );
00158                 }
00159             }
00160         }
00161         return $sSeoUri;
00162     }
00163 
00172     protected function _getTag( $oArticle, $iLang )
00173     {
00174         $sTag = null;
00175         $oView = $this->getConfig()->getTopActiveView();
00176         if ( $oView instanceof oxView ) {
00177             $sTag = $oView->getTag();
00178         }
00179         return $sTag;
00180     }
00181 
00191     protected function _createArticleCategoryUri( $oArticle, $oCategory, $iLang )
00192     {
00193         startProfile(__FUNCTION__);
00194         $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00195 
00196         // create title part for uri
00197         $sTitle = $this->_prepareArticleTitle( $oArticle );
00198 
00199         // writing category path
00200         $sSeoUri = $this->_processSeoUrl(
00201                             oxRegistry::get("oxSeoEncoderCategory")->getCategoryUri( $oCategory, $iLang ).$sTitle,
00202                             $oArticle->getId(), $iLang
00203                         );
00204         $sCatId = $oCategory->getId();
00205         $this->_saveToDb(
00206                     'oxarticle',
00207                     $oArticle->getId(),
00208                     oxRegistry::get("oxUtilsUrl")->appendUrl(
00209                             $oArticle->getBaseStdLink( $iLang ),
00210                             array( 'cnid' => $sCatId )
00211                     ),
00212                     $sSeoUri,
00213                     $iLang,
00214                     null,
00215                     0,
00216                     $sCatId
00217                 );
00218 
00219         stopProfile(__FUNCTION__);
00220 
00221         return $sSeoUri;
00222     }
00223 
00233     public function getArticleUri( $oArticle, $iLang, $blRegenerate = false )
00234     {
00235         startProfile(__FUNCTION__);
00236 
00237         $sActCatId = '';
00238 
00239         $oActCat = $this->_getCategory( $oArticle, $iLang );
00240 
00241         if ( $oActCat instanceof oxCategory ) {
00242             $sActCatId = $oActCat->getId();
00243         } elseif ( $oActCat = $this->_getMainCategory( $oArticle ) ) {
00244             $sActCatId = $oActCat->getId();
00245         }
00246 
00247         //load details link from DB
00248         if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sActCatId, true ) ) ) {
00249             if ( $oActCat ) {
00250                 $blInCat = false;
00251                 if ( $oActCat->isPriceCategory() ) {
00252                     $blInCat = $oArticle->inPriceCategory( $sActCatId );
00253                 } else {
00254                     $blInCat = $oArticle->inCategory( $sActCatId );
00255                 }
00256                 if ( $blInCat ) {
00257                     $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oActCat, $iLang );
00258                 }
00259             }
00260         }
00261 
00262         stopProfile(__FUNCTION__);
00263 
00264         return $sSeoUri;
00265     }
00266 
00275     protected function _getCategory( $oArticle, $iLang )
00276     {
00277         $oCat = null;
00278         $oView = $this->getConfig()->getActiveView();
00279         if ( $oView instanceof oxUBase ) {
00280             $oCat = $oView->getActiveCategory();
00281         }
00282         return $oCat;
00283     }
00284 
00292     protected function _getMainCategory( $oArticle )
00293     {
00294         $oMainCat = null;
00295 
00296         // if variant parent id must be used
00297         $sArtId = $oArticle->getId();
00298         if ( isset( $oArticle->oxarticles__oxparentid->value ) && $oArticle->oxarticles__oxparentid->value ) {
00299             $sArtId = $oArticle->oxarticles__oxparentid->value;
00300         }
00301 
00302         $oDb = oxDb::getDb();
00303         // add manin category chaching;
00304         $sQ = "select oxcatnid from ".getViewName( "oxobject2category" )." where oxobjectid = ".$oDb->quote( $sArtId )." order by oxtime";
00305         $sIdent = md5( $sQ );
00306 
00307         if ( ( $sMainCatId = $this->_loadFromCache( $sIdent, "oxarticle" ) ) === false ) {
00308             $sMainCatId = $oDb->getOne( $sQ );
00309             // storing in cache
00310             $this->_saveInCache( $sIdent, $sMainCatId, "oxarticle" );
00311         }
00312 
00313         if ( $sMainCatId ) {
00314             $oMainCat = oxNew( "oxcategory" );
00315             if ( ! $oMainCat->load( $sMainCatId )) {
00316                 $oMainCat = null;
00317             }
00318         }
00319 
00320         return $oMainCat;
00321     }
00322 
00331     public function getArticleMainUri( $oArticle, $iLang )
00332     {
00333         startProfile(__FUNCTION__);
00334 
00335         $oMainCat   = $this->_getMainCategory( $oArticle );
00336         $sMainCatId = $oMainCat ? $oMainCat->getId() : '';
00337 
00338         //load default article url from DB
00339         if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sMainCatId, true ) ) ) {
00340             // save for main category
00341             if ( $oMainCat ) {
00342                 $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oMainCat, $iLang );
00343             } else {
00344                 // get default article url
00345                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00346                 $sSeoUri = $this->_processSeoUrl( $this->_prepareArticleTitle( $oArticle ), $oArticle->getId(), $iLang );
00347 
00348                 // save default article url
00349                 $this->_saveToDb(
00350                         'oxarticle',
00351                         $oArticle->getId(),
00352                         $oArticle->getBaseStdLink( $iLang ),
00353                         $sSeoUri,
00354                         $iLang,
00355                         null,
00356                         0,
00357                         ''
00358                     );
00359             }
00360         }
00361 
00362         stopProfile(__FUNCTION__);
00363         return $sSeoUri;
00364     }
00365 
00374     protected function _prepareArticleTitle( $oArticle )
00375     {
00376         $sTitle = '';
00377 
00378         // create title part for uri
00379         if ( !( $sTitle = $oArticle->oxarticles__oxtitle->value ) ) {
00380             // taking parent article title
00381             if ( ( $sParentId = $oArticle->oxarticles__oxparentid->value ) ) {
00382 
00383                 // looking in cache ..
00384                 if ( !isset( self::$_aTitleCache[$sParentId] ) ) {
00385                     $oDb = oxDb::getDb();
00386                     $sQ = "select oxtitle from ".$oArticle->getViewName()." where oxid = ".$oDb->quote( $sParentId );
00387                     self::$_aTitleCache[$sParentId] = $oDb->getOne( $sQ );
00388                 }
00389                 $sTitle = self::$_aTitleCache[$sParentId];
00390             }
00391         }
00392 
00393         // variant has varselect value
00394         if ( $oArticle->oxarticles__oxvarselect->value ) {
00395             $sTitle .= ( $sTitle ? ' ' : '' ) . $oArticle->oxarticles__oxvarselect->value . ' ';
00396         } elseif ( !$sTitle || ( $oArticle->oxarticles__oxparentid->value ) ) {
00397             // in case nothing was found - looking for number
00398             $sTitle .= ( $sTitle ? ' ' : '' ) . $oArticle->oxarticles__oxartnum->value;
00399         }
00400 
00401         return $this->_prepareTitle( $sTitle, false, $oArticle->getLanguage() ) . '.html';
00402     }
00403 
00413     public function getArticleVendorUri( $oArticle, $iLang, $blRegenerate = false )
00414     {
00415         startProfile(__FUNCTION__);
00416 
00417         $sSeoUri = null;
00418         if ( $oVendor = $this->_getVendor( $oArticle, $iLang ) ) {
00419             //load details link from DB
00420             if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oVendor->getId(), true ) ) ) {
00421 
00422                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00423 
00424                 // create title part for uri
00425                 $sTitle = $this->_prepareArticleTitle( $oArticle );
00426 
00427                 // create uri for all categories
00428                 $sSeoUri = oxRegistry::get("oxSeoEncoderVendor")->getVendorUri( $oVendor, $iLang );
00429                 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00430 
00431                 $aStdParams = array( 'cnid' => "v_".$oVendor->getId(), 'listtype' => $this->_getListType() );
00432                 $this->_saveToDb(
00433                         'oxarticle',
00434                         $oArticle->getId(),
00435                         oxRegistry::get("oxUtilsUrl")->appendUrl(
00436                                 $oArticle->getBaseStdLink( $iLang ),
00437                                 $aStdParams
00438                         ),
00439                         $sSeoUri,
00440                         $iLang,
00441                         null,
00442                         0,
00443                         $oVendor->getId()
00444                     );
00445             }
00446 
00447             stopProfile(__FUNCTION__);
00448         }
00449         return $sSeoUri;
00450     }
00451 
00460     protected function _getVendor( $oArticle, $iLang )
00461     {
00462         $oView = $this->getConfig()->getActiveView();
00463 
00464         $oVendor = null;
00465         if ( $sActVendorId = $oArticle->oxarticles__oxvendorid->value ) {
00466             if ( $oView instanceof oxView && ( $oActVendor = $oView->getActVendor() ) ) {
00467                 $oVendor = $oActVendor;
00468             } else {
00469                 $oVendor = oxNew( "oxVendor" );
00470             }
00471             if ( $oVendor->getId() !== $sActVendorId ) {
00472                 $oVendor = oxNew( "oxVendor" );
00473                 if ( !$oVendor->loadInLang( $iLang, $sActVendorId ) ) {
00474                     $oVendor = null;
00475                 }
00476             }
00477         }
00478 
00479         return $oVendor;
00480     }
00481 
00491     public function getArticleManufacturerUri( $oArticle, $iLang, $blRegenerate = false )
00492     {
00493         $sSeoUri = null;
00494         startProfile(__FUNCTION__);
00495         if ( $oManufacturer = $this->_getManufacturer( $oArticle, $iLang ) ) {
00496             //load details link from DB
00497             if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oManufacturer->getId(), true ) ) ) {
00498 
00499                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00500 
00501                 // create title part for uri
00502                 $sTitle = $this->_prepareArticleTitle( $oArticle );
00503 
00504                 // create uri for all categories
00505                 $sSeoUri = oxRegistry::get("oxSeoEncoderManufacturer")->getManufacturerUri( $oManufacturer, $iLang );
00506                 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00507 
00508                 $aStdParams = array( 'mnid' => $oManufacturer->getId(), 'listtype' => $this->_getListType() );
00509                 $this->_saveToDb(
00510                         'oxarticle',
00511                         $oArticle->getId(),
00512                         oxRegistry::get("oxUtilsUrl")->appendUrl(
00513                                 $oArticle->getBaseStdLink( $iLang ),
00514                                 $aStdParams
00515                         ),
00516                         $sSeoUri,
00517                         $iLang,
00518                         null,
00519                         0,
00520                         $oManufacturer->getId()
00521                     );
00522             }
00523 
00524             stopProfile(__FUNCTION__);
00525         }
00526         return $sSeoUri;
00527     }
00528 
00537     protected function _getManufacturer( $oArticle, $iLang )
00538     {
00539         $oManufacturer = null;
00540         if ( $sActManufacturerId = $oArticle->oxarticles__oxmanufacturerid->value ) {
00541             $oView = $this->getConfig()->getActiveView();
00542 
00543             if ( $oView instanceof oxView && ( $oActManufacturer = $oView->getActManufacturer() ) ) {
00544                 $oManufacturer = $oActManufacturer;
00545             } else {
00546                 $oManufacturer = oxNew( "oxManufacturer" );
00547             }
00548 
00549             if ( $oManufacturer->getId() !== $sActManufacturerId || $oManufacturer->getLanguage() != $iLang ) {
00550                 $oManufacturer = oxNew( "oxManufacturer" );
00551                 if ( !$oManufacturer->loadInLang( $iLang, $sActManufacturerId ) ) {
00552                     $oManufacturer = null;
00553                 }
00554             }
00555         }
00556 
00557         return $oManufacturer;
00558     }
00559 
00568     public function getArticleMainUrl( $oArticle, $iLang = null )
00569     {
00570         if ( !isset( $iLang ) ) {
00571             $iLang = $oArticle->getLanguage();
00572         }
00573 
00574         return $this->_getFullUrl( $this->getArticleMainUri( $oArticle, $iLang ), $iLang );
00575     }
00576 
00586     public function getArticleUrl( $oArticle, $iLang = null, $iType = 0 )
00587     {
00588         if ( !isset( $iLang ) ) {
00589             $iLang = $oArticle->getLanguage();
00590         }
00591 
00592         $sUri = null;
00593         switch ( $iType ) {
00594             case OXARTICLE_LINKTYPE_VENDOR :
00595                 $sUri = $this->getArticleVendorUri( $oArticle, $iLang );
00596                 break;
00597             case OXARTICLE_LINKTYPE_MANUFACTURER :
00598                 $sUri = $this->getArticleManufacturerUri( $oArticle, $iLang );
00599                 break;
00600             case OXARTICLE_LINKTYPE_TAG :
00601                 $sUri = $this->getArticleTagUri( $oArticle, $iLang );
00602                 break;
00603             case OXARTICLE_LINKTYPE_RECOMM :
00604                 $sUri = $this->getArticleRecommUri( $oArticle, $iLang );
00605                 break;
00606             case OXARTICLE_LINKTYPE_PRICECATEGORY : // goes price category urls to default (category urls)
00607             default:
00608                 $sUri = $this->getArticleUri( $oArticle, $iLang );
00609                 break;
00610         }
00611 
00612         // if was unable to fetch type uri - returning main
00613         if ( !$sUri ) {
00614             $sUri = $this->getArticleMainUri( $oArticle, $iLang );
00615         }
00616 
00617         return $this->_getFullUrl( $sUri, $iLang );
00618     }
00619 
00627     public function onDeleteArticle( $oArticle )
00628     {
00629         $oDb = oxDb::getDb();
00630         $sIdQuoted = $oDb->quote( $oArticle->getId() );
00631         $oDb->execute("delete from oxseo where oxobjectid = $sIdQuoted and oxtype = 'oxarticle'");
00632         $oDb->execute("delete from oxobject2seodata where oxobjectid = $sIdQuoted");
00633     }
00634 
00643     protected function _getAltUri( $sObjectId, $iLang )
00644     {
00645         $sSeoUrl = null;
00646         $oArticle = oxNew( "oxarticle" );
00647         $oArticle->setSkipAssign( true );
00648         if ( $oArticle->loadInLang( $iLang, $sObjectId ) ) {
00649             // choosing URI type to generate
00650             switch( $this->_getListType() ) {
00651                 case 'vendor':
00652                     $sSeoUrl = $this->getArticleVendorUri( $oArticle, $iLang, true );
00653                     break;
00654                 case 'manufacturer':
00655                     $sSeoUrl = $this->getArticleManufacturerUri( $oArticle, $iLang, true );
00656                     break;
00657                 case 'tag':
00658                     $sSeoUrl = $this->getArticleTagUri( $oArticle, $iLang, true );
00659                     break;
00660                 default:
00661                     $sSeoUrl = $this->getArticleUri( $oArticle, $iLang, true );
00662                     break;
00663             }
00664         }
00665         return $sSeoUrl;
00666     }
00667 }