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 
00028     public static function getInstance()
00029     {
00030         if ( defined( 'OXID_PHP_UNIT' ) ) {
00031             self::$_instance = modInstances::getMod( __CLASS__ );
00032         }
00033 
00034         if (!self::$_instance) {
00035             self::$_instance = oxNew("oxSeoEncoderArticle");
00036             if ( defined( 'OXID_PHP_UNIT' ) ) {
00037                 modInstances::addMod( __CLASS__, self::$_instance);
00038             }
00039         }
00040 
00041         if ( defined( 'OXID_PHP_UNIT' ) ) {
00042             // resetting cache
00043             self::$_instance->_aSeoCache = array();
00044         }
00045 
00046         return self::$_instance;
00047     }
00048 
00054     protected function _getUrlExtension()
00055     {
00056         return '.html';
00057     }
00058 
00068     protected function _getProductForLang( $oArticle, $iLang )
00069     {
00070         if ( isset( $iLang ) && $iLang != $oArticle->getLanguage() ) {
00071             $sId = $oArticle->getId();
00072             $oArticle = oxNew( 'oxarticle' );
00073             $oArticle->loadInLang( $iLang, $sId );
00074         }
00075 
00076         return $oArticle;
00077     }
00078 
00087     protected function _getArticleRecommUri( $oArticle, $iLang )
00088     {
00089         $sSeoUri = null;
00090         if ( $oRecomm = $this->_getRecomm( $oArticle, $iLang ) ) {
00091             //load details link from DB
00092             if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oRecomm->getId(), true ) ) ) {
00093 
00094                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00095 
00096                 // create title part for uri
00097                 $sTitle = $this->_prepareArticleTitle( $oArticle );
00098 
00099                 // create uri for all categories
00100                 $sSeoUri = oxSeoEncoderRecomm::getInstance()->getRecommUri( $oRecomm, $iLang );
00101                 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00102 
00103                 $aStdParams = array( 'recommid' => $oRecomm->getId(), 'listtype' => $this->_getListType() );
00104                 $this->_saveToDb(
00105                             'oxarticle',
00106                             $oArticle->getId(),
00107                             oxUtilsUrl::getInstance()->appendUrl(
00108                                     $oArticle->getBaseStdLink( $iLang ),
00109                                     $aStdParams
00110                             ),
00111                             $sSeoUri,
00112                             $iLang,
00113                             null,
00114                             0,
00115                             $oRecomm->getId()
00116                         );
00117             }
00118         }
00119         return $sSeoUri;
00120     }
00121 
00130     protected function _getRecomm( $oArticle, $iLang )
00131     {
00132         $oList = null;
00133         $oView = $this->getConfig()->getActiveView();
00134         if ( $oView instanceof oxView ) {
00135             $oList = $oView->getActiveRecommList();
00136         }
00137         return $oList;
00138     }
00139 
00145     protected function _getListType()
00146     {
00147         return $this->getConfig()->getActiveView()->getListType();
00148     }
00149 
00159     protected function _getArticleTagUri( $oArticle, $iLang, $blRegenerate = false )
00160     {
00161         $sSeoUri = null;
00162         if ( $sTag = $this->_getTag( $oArticle, $iLang ) ) {
00163             $iShopId = $this->getConfig()->getShopId();
00164             $sStdUrl = $oArticle->getStdTagLink( $sTag );
00165             if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'dynamic', $this->getDynamicObjectId( $iShopId, $sStdUrl ), $iLang ) ) ) {
00166                 // generating new if not found
00167                 if ( $sSeoUri = oxSeoEncoderTag::getInstance()->getTagUri( $sTag, $iLang, $oArticle->getId() ) ) {
00168                     $sSeoUri .= $this->_prepareArticleTitle( $oArticle );
00169                     $sSeoUri  = $this->_processSeoUrl( $sSeoUri, $this->_getStaticObjectId( $iShopId, $sStdUrl ), $iLang );
00170                     $sSeoUri  = $this->_getDynamicUri( $sStdUrl, $sSeoUri, $iLang );
00171                 }
00172             }
00173         }
00174         return $sSeoUri;
00175     }
00176 
00185     protected function _getTag( $oArticle, $iLang )
00186     {
00187         $sTag = null;
00188         $oView = $this->getConfig()->getActiveView();
00189         if ( $oView instanceof oxView ) {
00190             $sTag = $oView->getTag();
00191         }
00192         return $sTag;
00193     }
00194 
00204     protected function _createArticleCategoryUri( $oArticle, $oCategory, $iLang )
00205     {
00206         startProfile(__FUNCTION__);
00207         $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00208 
00209         // create title part for uri
00210         $sTitle = $this->_prepareArticleTitle( $oArticle );
00211 
00212         // writing category path
00213         $sSeoUri = $this->_processSeoUrl(
00214                             oxSeoEncoderCategory::getInstance()->getCategoryUri( $oCategory, $iLang ).$sTitle,
00215                             $oArticle->getId(), $iLang
00216                         );
00217         $sCatId = $oCategory->getId();
00218         $this->_saveToDb(
00219                     'oxarticle',
00220                     $oArticle->getId(),
00221                     oxUtilsUrl::getInstance()->appendUrl(
00222                             $oArticle->getBaseStdLink( $iLang ),
00223                             array( 'cnid' => $sCatId )
00224                     ),
00225                     $sSeoUri,
00226                     $iLang,
00227                     null,
00228                     0,
00229                     $sCatId
00230                 );
00231 
00232         stopProfile(__FUNCTION__);
00233 
00234         return $sSeoUri;
00235     }
00236 
00246     protected function _getArticleUri( $oArticle, $iLang, $blRegenerate = false )
00247     {
00248         startProfile(__FUNCTION__);
00249 
00250         $sActCatId = '';
00251         if ( $oActCat = $this->_getCategory( $oArticle, $iLang ) ) {
00252             $sActCatId = $oActCat->getId();
00253         } elseif ( $oActCat = $this->_getMainCategory( $oArticle ) ) {
00254             $sActCatId = $oActCat->getId();
00255         }
00256 
00257         //load details link from DB
00258         if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sActCatId, true ) ) ) {
00259             if ( $oActCat ) {
00260                 $blInCat = false;
00261                 if ( $oActCat->isPriceCategory() ) {
00262                     $blInCat = $oArticle->inPriceCategory( $sActCatId );
00263                 } else {
00264                     $blInCat = $oArticle->inCategory( $sActCatId );
00265                 }
00266                 if ( $blInCat ) {
00267                     $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oActCat, $iLang );
00268                 }
00269             }
00270         }
00271 
00272         stopProfile(__FUNCTION__);
00273 
00274         return $sSeoUri;
00275     }
00276 
00285     protected function _getCategory( $oArticle, $iLang )
00286     {
00287         $oCat = null;
00288         $oView = $this->getConfig()->getActiveView();
00289         if ( $oView instanceof oxview ) {
00290             $oCat = $oView->getActCategory();
00291         }
00292         return $oCat;
00293     }
00294 
00302     protected function _getMainCategory( $oArticle )
00303     {
00304         $oMainCat = null;
00305 
00306         // if variant parent id must be used
00307         $sArtId = $oArticle->getId();
00308         if ( isset( $oArticle->oxarticles__oxparentid->value ) && $oArticle->oxarticles__oxparentid->value ) {
00309             $sArtId = $oArticle->oxarticles__oxparentid->value;
00310         }
00311 
00312         $sMainCatId = oxDb::getDb()->getOne( "select oxcatnid from ".getViewName( "oxobject2category" )." where oxobjectid = '{$sArtId}' order by oxtime" );
00313         if ( $sMainCatId ) {
00314             $oMainCat = oxNew( "oxcategory" );
00315             $oMainCat->load( $sMainCatId );
00316         }
00317 
00318         return $oMainCat;
00319     }
00320 
00329     protected function _getArticleMainUri( $oArticle, $iLang )
00330     {
00331         startProfile(__FUNCTION__);
00332 
00333         $oMainCat   = $this->_getMainCategory( $oArticle );
00334         $sMainCatId = $oMainCat ? $oMainCat->getId() : '';
00335 
00336         //load default article url from DB
00337         if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sMainCatId, true ) ) ) {
00338             // save for main category
00339             if ( $oMainCat ) {
00340                 $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oMainCat, $iLang );
00341             } else {
00342                 // get default article url
00343                 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00344                 $sSeoUri = $this->_processSeoUrl( $this->_prepareArticleTitle( $oArticle ), $oArticle->getId(), $iLang );
00345 
00346                 // save default article url
00347                 $this->_saveToDb(
00348                         'oxarticle',
00349                         $oArticle->getId(),
00350                         $oArticle->getBaseStdLink( $iLang ),
00351                         $sSeoUri,
00352                         $iLang,
00353                         null,
00354                         0,
00355                         ''
00356                     );
00357             }
00358         }
00359 
00360         stopProfile(__FUNCTION__);
00361         return $sSeoUri;
00362     }
00363 
00372     protected function _prepareArticleTitle( $oArticle )
00373     {
00374         $sTitle = '';
00375 
00376         // create title part for uri
00377         if ( !( $sTitle = $oArticle->oxarticles__oxtitle->value ) ) {
00378             // taking parent article title
00379             if ( ( $sParentId = $oArticle->oxarticles__oxparentid->value ) ) {
00380 
00381                 // looking in cache ..
00382                 if ( !isset( self::$_aTitleCache[$sParentId] ) ) {
00383                     $oDb = oxDb::getDb();
00384                     $sQ = "select oxtitle from ".$oArticle->getViewName()." where oxid = ".$oDb->quote( $sParentId );
00385                     self::$_aTitleCache[$sParentId] = $oDb->getOne( $sQ );
00386                 }
00387                 $sTitle = self::$_aTitleCache[$sParentId];
00388             }
00389         }
00390 
00391         // variant has varselect value
00392         if ( $oArticle->oxarticles__oxvarselect->value ) {
00393             $sTitle .= ( $sTitle ? ' ' : '' ).$oArticle->oxarticles__oxvarselect->value . ' ';
00394         }
00395 
00396         // in case nothing was found - looking for number
00397         if ( !$sTitle ) {
00398             $sTitle .= $oArticle->oxarticles__oxartnum->value;
00399         }
00400 
00401         return $this->_prepareTitle( $sTitle ) . '.html';
00402     }
00403 
00413     protected 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 = oxSeoEncoderVendor::getInstance()->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                         oxUtilsUrl::getInstance()->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     protected 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 = oxSeoEncoderManufacturer::getInstance()->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                         oxUtilsUrl::getInstance()->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         if ( $oArticle->loadInLang( $iLang, $sObjectId ) ) {
00648             // choosing URI type to generate
00649             switch( $this->_getListType() ) {
00650                 case 'vendor':
00651                     $sSeoUrl = $this->_getArticleVendorUri( $oArticle, $iLang, true );
00652                     break;
00653                 case 'manufacturer':
00654                     $sSeoUrl = $this->_getArticleManufacturerUri( $oArticle, $iLang, true );
00655                     break;
00656                 case 'tag':
00657                     $sSeoUrl = $this->_getArticleTagUri( $oArticle, $iLang, true );
00658                     break;
00659                 default:
00660                     $sSeoUrl = $this->_getArticleUri( $oArticle, $iLang, true );
00661                     break;
00662             }
00663         }
00664         return $sSeoUrl;
00665     }
00666 }