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
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->setSkipAssign( true );
00074 $oArticle->loadInLang( $iLang, $sId );
00075 }
00076
00077 return $oArticle;
00078 }
00079
00091 protected function _getArticleRecommUri( $oArticle, $iLang )
00092 {
00093 return $this->getArticleRecommUri( $oArticle, $iLang );
00094 }
00095
00104 public function getArticleRecommUri( $oArticle, $iLang )
00105 {
00106 $sSeoUri = null;
00107 if ( $oRecomm = $this->_getRecomm( $oArticle, $iLang ) ) {
00108
00109 if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oRecomm->getId(), true ) ) ) {
00110
00111 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00112
00113
00114 $sTitle = $this->_prepareArticleTitle( $oArticle );
00115
00116
00117 $sSeoUri = oxSeoEncoderRecomm::getInstance()->getRecommUri( $oRecomm, $iLang );
00118 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00119
00120 $aStdParams = array( 'recommid' => $oRecomm->getId(), 'listtype' => $this->_getListType() );
00121 $this->_saveToDb(
00122 'oxarticle',
00123 $oArticle->getId(),
00124 oxUtilsUrl::getInstance()->appendUrl(
00125 $oArticle->getBaseStdLink( $iLang ),
00126 $aStdParams
00127 ),
00128 $sSeoUri,
00129 $iLang,
00130 null,
00131 0,
00132 $oRecomm->getId()
00133 );
00134 }
00135 }
00136 return $sSeoUri;
00137 }
00138
00147 protected function _getRecomm( $oArticle, $iLang )
00148 {
00149 $oList = null;
00150 $oView = $this->getConfig()->getActiveView();
00151 if ( $oView instanceof oxView ) {
00152 $oList = $oView->getActiveRecommList();
00153 }
00154 return $oList;
00155 }
00156
00162 protected function _getListType()
00163 {
00164 return $this->getConfig()->getActiveView()->getListType();
00165 }
00166
00179 protected function _getArticleTagUri( $oArticle, $iLang, $blRegenerate = false )
00180 {
00181 return $this->getArticleTagUri( $oArticle, $iLang, $blRegenerate );
00182 }
00192 public function getArticleTagUri( $oArticle, $iLang, $blRegenerate = false )
00193 {
00194 $sSeoUri = null;
00195 if ( $sTag = $this->_getTag( $oArticle, $iLang ) ) {
00196 $iShopId = $this->getConfig()->getShopId();
00197 $sStdUrl = $oArticle->getStdTagLink( $sTag );
00198 if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'dynamic', $this->getDynamicObjectId( $iShopId, $sStdUrl ), $iLang ) ) ) {
00199
00200 if ( $sSeoUri = oxSeoEncoderTag::getInstance()->getTagUri( $sTag, $iLang, $oArticle->getId() ) ) {
00201 $sSeoUri .= $this->_prepareArticleTitle( $oArticle );
00202 $sSeoUri = $this->_processSeoUrl( $sSeoUri, $this->_getStaticObjectId( $iShopId, $sStdUrl ), $iLang );
00203 $sSeoUri = $this->_getDynamicUri( $sStdUrl, $sSeoUri, $iLang );
00204 }
00205 }
00206 }
00207 return $sSeoUri;
00208 }
00209
00218 protected function _getTag( $oArticle, $iLang )
00219 {
00220 $sTag = null;
00221 $oView = $this->getConfig()->getActiveView();
00222 if ( $oView instanceof oxView ) {
00223 $sTag = $oView->getTag();
00224 }
00225 return $sTag;
00226 }
00227
00237 protected function _createArticleCategoryUri( $oArticle, $oCategory, $iLang )
00238 {
00239 startProfile(__FUNCTION__);
00240 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00241
00242
00243 $sTitle = $this->_prepareArticleTitle( $oArticle );
00244
00245
00246 $sSeoUri = $this->_processSeoUrl(
00247 oxSeoEncoderCategory::getInstance()->getCategoryUri( $oCategory, $iLang ).$sTitle,
00248 $oArticle->getId(), $iLang
00249 );
00250 $sCatId = $oCategory->getId();
00251 $this->_saveToDb(
00252 'oxarticle',
00253 $oArticle->getId(),
00254 oxUtilsUrl::getInstance()->appendUrl(
00255 $oArticle->getBaseStdLink( $iLang ),
00256 array( 'cnid' => $sCatId )
00257 ),
00258 $sSeoUri,
00259 $iLang,
00260 null,
00261 0,
00262 $sCatId
00263 );
00264
00265 stopProfile(__FUNCTION__);
00266
00267 return $sSeoUri;
00268 }
00269
00282 protected function _getArticleUri( $oArticle, $iLang, $blRegenerate = false )
00283 {
00284 return $this->getArticleUri( $oArticle, $iLang, $blRegenerate );
00285 }
00286
00296 public function getArticleUri( $oArticle, $iLang, $blRegenerate = false )
00297 {
00298 startProfile(__FUNCTION__);
00299
00300 $sActCatId = '';
00301 if ( $oActCat = $this->_getCategory( $oArticle, $iLang ) ) {
00302 $sActCatId = $oActCat->getId();
00303 } elseif ( $oActCat = $this->_getMainCategory( $oArticle ) ) {
00304 $sActCatId = $oActCat->getId();
00305 }
00306
00307
00308 if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sActCatId, true ) ) ) {
00309 if ( $oActCat ) {
00310 $blInCat = false;
00311 if ( $oActCat->isPriceCategory() ) {
00312 $blInCat = $oArticle->inPriceCategory( $sActCatId );
00313 } else {
00314 $blInCat = $oArticle->inCategory( $sActCatId );
00315 }
00316 if ( $blInCat ) {
00317 $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oActCat, $iLang );
00318 }
00319 }
00320 }
00321
00322 stopProfile(__FUNCTION__);
00323
00324 return $sSeoUri;
00325 }
00326
00335 protected function _getCategory( $oArticle, $iLang )
00336 {
00337 $oCat = null;
00338 $oView = $this->getConfig()->getActiveView();
00339 if ( $oView instanceof oxview ) {
00340 $oCat = $oView->getActCategory();
00341 }
00342 return $oCat;
00343 }
00344
00352 protected function _getMainCategory( $oArticle )
00353 {
00354 $oMainCat = null;
00355
00356
00357 $sArtId = $oArticle->getId();
00358 if ( isset( $oArticle->oxarticles__oxparentid->value ) && $oArticle->oxarticles__oxparentid->value ) {
00359 $sArtId = $oArticle->oxarticles__oxparentid->value;
00360 }
00361
00362 $oDb = oxDb::getDb();
00363
00364 $sQ = "select oxcatnid from ".getViewName( "oxobject2category" )." where oxobjectid = ".$oDb->quote( $sArtId )." order by oxtime";
00365 $sIdent = md5( $sQ );
00366
00367 if ( ( $sMainCatId = $this->_loadFromCache( $sIdent ) ) === false ) {
00368 $sMainCatId = $oDb->getOne( $sQ );
00369
00370 $this->_saveInCache( $sIdent, $sMainCatId );
00371 }
00372
00373 if ( $sMainCatId ) {
00374 $oMainCat = oxNew( "oxcategory" );
00375 if ( ! $oMainCat->load( $sMainCatId )) {
00376 $oMainCat = null;
00377 }
00378 }
00379
00380 return $oMainCat;
00381 }
00382
00394 protected function _getArticleMainUri( $oArticle, $iLang )
00395 {
00396 return $this->getArticleMainUri( $oArticle, $iLang );
00397 }
00398
00407 public function getArticleMainUri( $oArticle, $iLang )
00408 {
00409 startProfile(__FUNCTION__);
00410
00411 $oMainCat = $this->_getMainCategory( $oArticle );
00412 $sMainCatId = $oMainCat ? $oMainCat->getId() : '';
00413
00414
00415 if ( !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $sMainCatId, true ) ) ) {
00416
00417 if ( $oMainCat ) {
00418 $sSeoUri = $this->_createArticleCategoryUri( $oArticle, $oMainCat, $iLang );
00419 } else {
00420
00421 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00422 $sSeoUri = $this->_processSeoUrl( $this->_prepareArticleTitle( $oArticle ), $oArticle->getId(), $iLang );
00423
00424
00425 $this->_saveToDb(
00426 'oxarticle',
00427 $oArticle->getId(),
00428 $oArticle->getBaseStdLink( $iLang ),
00429 $sSeoUri,
00430 $iLang,
00431 null,
00432 0,
00433 ''
00434 );
00435 }
00436 }
00437
00438 stopProfile(__FUNCTION__);
00439 return $sSeoUri;
00440 }
00441
00450 protected function _prepareArticleTitle( $oArticle )
00451 {
00452 $sTitle = '';
00453
00454
00455 if ( !( $sTitle = $oArticle->oxarticles__oxtitle->value ) ) {
00456
00457 if ( ( $sParentId = $oArticle->oxarticles__oxparentid->value ) ) {
00458
00459
00460 if ( !isset( self::$_aTitleCache[$sParentId] ) ) {
00461 $oDb = oxDb::getDb();
00462 $sQ = "select oxtitle from ".$oArticle->getViewName()." where oxid = ".$oDb->quote( $sParentId );
00463 self::$_aTitleCache[$sParentId] = $oDb->getOne( $sQ );
00464 }
00465 $sTitle = self::$_aTitleCache[$sParentId];
00466 }
00467 }
00468
00469
00470 if ( $oArticle->oxarticles__oxvarselect->value ) {
00471 $sTitle .= ( $sTitle ? ' ' : '' ) . $oArticle->oxarticles__oxvarselect->value . ' ';
00472 } elseif ( !$sTitle || ( $oArticle->oxarticles__oxparentid->value ) ) {
00473
00474 $sTitle .= ( $sTitle ? ' ' : '' ) . $oArticle->oxarticles__oxartnum->value;
00475 }
00476
00477 return $this->_prepareTitle( $sTitle ) . '.html';
00478 }
00479
00492 protected function _getArticleVendorUri( $oArticle, $iLang, $blRegenerate = false )
00493 {
00494 return $this->getArticleVendorUri( $oArticle, $iLang, $blRegenerate );
00495 }
00496
00506 public function getArticleVendorUri( $oArticle, $iLang, $blRegenerate = false )
00507 {
00508 startProfile(__FUNCTION__);
00509
00510 $sSeoUri = null;
00511 if ( $oVendor = $this->_getVendor( $oArticle, $iLang ) ) {
00512
00513 if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oVendor->getId(), true ) ) ) {
00514
00515 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00516
00517
00518 $sTitle = $this->_prepareArticleTitle( $oArticle );
00519
00520
00521 $sSeoUri = oxSeoEncoderVendor::getInstance()->getVendorUri( $oVendor, $iLang );
00522 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00523
00524 $aStdParams = array( 'cnid' => "v_".$oVendor->getId(), 'listtype' => $this->_getListType() );
00525 $this->_saveToDb(
00526 'oxarticle',
00527 $oArticle->getId(),
00528 oxUtilsUrl::getInstance()->appendUrl(
00529 $oArticle->getBaseStdLink( $iLang ),
00530 $aStdParams
00531 ),
00532 $sSeoUri,
00533 $iLang,
00534 null,
00535 0,
00536 $oVendor->getId()
00537 );
00538 }
00539
00540 stopProfile(__FUNCTION__);
00541 }
00542 return $sSeoUri;
00543 }
00544
00553 protected function _getVendor( $oArticle, $iLang )
00554 {
00555 $oView = $this->getConfig()->getActiveView();
00556
00557 $oVendor = null;
00558 if ( $sActVendorId = $oArticle->oxarticles__oxvendorid->value ) {
00559 if ( $oView instanceof oxView && ( $oActVendor = $oView->getActVendor() ) ) {
00560 $oVendor = $oActVendor;
00561 } else {
00562 $oVendor = oxNew( "oxVendor" );
00563 }
00564 if ( $oVendor->getId() !== $sActVendorId ) {
00565 $oVendor = oxNew( "oxVendor" );
00566 if ( !$oVendor->loadInLang( $iLang, $sActVendorId ) ) {
00567 $oVendor = null;
00568 }
00569 }
00570 }
00571
00572 return $oVendor;
00573 }
00574
00587 protected function _getArticleManufacturerUri( $oArticle, $iLang, $blRegenerate = false )
00588 {
00589 return $this->getArticleManufacturerUri( $oArticle, $iLang, $blRegenerate );
00590 }
00591
00601 public function getArticleManufacturerUri( $oArticle, $iLang, $blRegenerate = false )
00602 {
00603 $sSeoUri = null;
00604 startProfile(__FUNCTION__);
00605 if ( $oManufacturer = $this->_getManufacturer( $oArticle, $iLang ) ) {
00606
00607 if ( $blRegenerate || !( $sSeoUri = $this->_loadFromDb( 'oxarticle', $oArticle->getId(), $iLang, null, $oManufacturer->getId(), true ) ) ) {
00608
00609 $oArticle = $this->_getProductForLang( $oArticle, $iLang );
00610
00611
00612 $sTitle = $this->_prepareArticleTitle( $oArticle );
00613
00614
00615 $sSeoUri = oxSeoEncoderManufacturer::getInstance()->getManufacturerUri( $oManufacturer, $iLang );
00616 $sSeoUri = $this->_processSeoUrl( $sSeoUri . $sTitle, $oArticle->getId(), $iLang );
00617
00618 $aStdParams = array( 'mnid' => $oManufacturer->getId(), 'listtype' => $this->_getListType() );
00619 $this->_saveToDb(
00620 'oxarticle',
00621 $oArticle->getId(),
00622 oxUtilsUrl::getInstance()->appendUrl(
00623 $oArticle->getBaseStdLink( $iLang ),
00624 $aStdParams
00625 ),
00626 $sSeoUri,
00627 $iLang,
00628 null,
00629 0,
00630 $oManufacturer->getId()
00631 );
00632 }
00633
00634 stopProfile(__FUNCTION__);
00635 }
00636 return $sSeoUri;
00637 }
00638
00647 protected function _getManufacturer( $oArticle, $iLang )
00648 {
00649 $oManufacturer = null;
00650 if ( $sActManufacturerId = $oArticle->oxarticles__oxmanufacturerid->value ) {
00651 $oView = $this->getConfig()->getActiveView();
00652
00653 if ( $oView instanceof oxView && ( $oActManufacturer = $oView->getActManufacturer() ) ) {
00654 $oManufacturer = $oActManufacturer;
00655 } else {
00656 $oManufacturer = oxNew( "oxManufacturer" );
00657 }
00658
00659 if ( $oManufacturer->getId() !== $sActManufacturerId || $oManufacturer->getLanguage() != $iLang ) {
00660 $oManufacturer = oxNew( "oxManufacturer" );
00661 if ( !$oManufacturer->loadInLang( $iLang, $sActManufacturerId ) ) {
00662 $oManufacturer = null;
00663 }
00664 }
00665 }
00666
00667 return $oManufacturer;
00668 }
00669
00678 public function getArticleMainUrl( $oArticle, $iLang = null )
00679 {
00680 if ( !isset( $iLang ) ) {
00681 $iLang = $oArticle->getLanguage();
00682 }
00683
00684 return $this->_getFullUrl( $this->_getArticleMainUri( $oArticle, $iLang ), $iLang );
00685 }
00686
00696 public function getArticleUrl( $oArticle, $iLang = null, $iType = 0 )
00697 {
00698 if ( !isset( $iLang ) ) {
00699 $iLang = $oArticle->getLanguage();
00700 }
00701
00702 $sUri = null;
00703 switch ( $iType ) {
00704 case OXARTICLE_LINKTYPE_VENDOR :
00705 $sUri = $this->_getArticleVendorUri( $oArticle, $iLang );
00706 break;
00707 case OXARTICLE_LINKTYPE_MANUFACTURER :
00708 $sUri = $this->_getArticleManufacturerUri( $oArticle, $iLang );
00709 break;
00710 case OXARTICLE_LINKTYPE_TAG :
00711 $sUri = $this->_getArticleTagUri( $oArticle, $iLang );
00712 break;
00713 case OXARTICLE_LINKTYPE_RECOMM :
00714 $sUri = $this->_getArticleRecommUri( $oArticle, $iLang );
00715 break;
00716 case OXARTICLE_LINKTYPE_PRICECATEGORY :
00717 default:
00718 $sUri = $this->_getArticleUri( $oArticle, $iLang );
00719 break;
00720 }
00721
00722
00723 if ( !$sUri ) {
00724 $sUri = $this->_getArticleMainUri( $oArticle, $iLang );
00725 }
00726
00727 return $this->_getFullUrl( $sUri, $iLang );
00728 }
00729
00737 public function onDeleteArticle( $oArticle )
00738 {
00739 $oDb = oxDb::getDb();
00740 $sIdQuoted = $oDb->quote( $oArticle->getId() );
00741 $oDb->execute("delete from oxseo where oxobjectid = $sIdQuoted and oxtype = 'oxarticle'");
00742 $oDb->execute("delete from oxobject2seodata where oxobjectid = $sIdQuoted");
00743 }
00744
00753 protected function _getAltUri( $sObjectId, $iLang )
00754 {
00755 $sSeoUrl = null;
00756 $oArticle = oxNew( "oxarticle" );
00757 $oArticle->setSkipAssign( true );
00758 if ( $oArticle->loadInLang( $iLang, $sObjectId ) ) {
00759
00760 switch( $this->_getListType() ) {
00761 case 'vendor':
00762 $sSeoUrl = $this->_getArticleVendorUri( $oArticle, $iLang, true );
00763 break;
00764 case 'manufacturer':
00765 $sSeoUrl = $this->_getArticleManufacturerUri( $oArticle, $iLang, true );
00766 break;
00767 case 'tag':
00768 $sSeoUrl = $this->_getArticleTagUri( $oArticle, $iLang, true );
00769 break;
00770 default:
00771 $sSeoUrl = $this->_getArticleUri( $oArticle, $iLang, true );
00772 break;
00773 }
00774 }
00775 return $sSeoUrl;
00776 }
00777 }