Go to the documentation of this file.00001 <?php
00002
00003
00004 if ( !function_exists( 'getShopBasePath' )) {
00010 function getShopBasePath()
00011 {
00012 return dirname(__FILE__).'/../';
00013 }
00014 }
00015
00016
00017 if ( !function_exists( 'isAdmin' )) {
00023 function isAdmin()
00024 {
00025 return true;
00026 }
00027 }
00028
00029 require_once getShopBasePath() . 'core/oxsupercfg.php';
00030
00034 class ajaxListComponent extends oxSuperCfg
00035 {
00041 protected $_aPosDir = array( 'asc', 'desc' );
00042
00048 protected $_aColumns = array();
00049
00055 protected $_iSqlLimit = 2500;
00056
00062 protected $_sContainer = null;
00063
00071 public function init( $aColumns )
00072 {
00073 $this->_aColumns = $aColumns;
00074 }
00075
00085 protected function _getActionIds( $sId )
00086 {
00087 $aColumns = $this->_getColNames();
00088 foreach ( $aColumns as $iPos => $aCol ) {
00089 if ( isset($aCol[4]) && $aCol[4] == 1 && $sId == $aCol[1].'.'.$aCol[0] ) {
00090 return oxConfig::getParameter( '_'.$iPos );
00091 }
00092 }
00093 }
00094
00102 public function setName( $sName )
00103 {
00104 $this->_sContainer = $sName;
00105 }
00106
00112 protected function _getQuery()
00113 {
00114 return '';
00115 }
00116
00124 protected function _getDataQuery( $sQ )
00125 {
00126 return 'select ' . $this->_getQueryCols() . $sQ;
00127 }
00128
00136 protected function _getCountQuery( $sQ )
00137 {
00138 return 'select count( * ) ' . $sQ;
00139 }
00140
00148 public function processRequest( $sFunction = null )
00149 {
00150 if ( $sFunction ) {
00151 $this->$sFunction();
00152 } else {
00153 $sQAdd = $this->_getQuery();
00154
00155
00156 $sQ = $this->_getDataQuery( $sQAdd );
00157 $sCountQ = $this->_getCountQuery( $sQAdd );
00158
00159 $this->_outputResponse( $this->_getData( $sCountQ, $sQ ) );
00160 }
00161 }
00162
00168 protected function _getSortCol()
00169 {
00170 $aVisibleNames = $this->_getVisibleColNames();
00171 $iCol = oxConfig::getParameter( 'sort' );
00172 $iCol = $iCol?( ( int ) str_replace( '_', '', $iCol )):0;
00173 $iCol = ( !isset( $aVisibleNames[$iCol] ) )?0:$iCol;
00174
00175 return $iCol;
00176 }
00177
00178
00187 protected function _getColNames( $sId = null )
00188 {
00189 if ( $sId === null ) {
00190 $sId = oxConfig::getParameter( 'cmpid' );
00191 }
00192
00193 if ( $sId && isset( $this->_aColumns[$sId] ) ) {
00194 return $this->_aColumns[$sId];
00195 }
00196
00197 return $this->_aColumns;
00198 }
00199
00206 protected function _getIdentColNames()
00207 {
00208 $aColNames = $this->_getColNames();
00209 $aCols = array();
00210 foreach ( $aColNames as $iKey => $aCol ) {
00211 if ( $aCol[4] )
00212 $aCols[$iKey] = $aCol;
00213 }
00214 return $aCols;
00215 }
00216
00222 protected function _getVisibleColNames()
00223 {
00224 $aColNames = $this->_getColNames();
00225 $aUserCols = oxConfig::getParameter( 'aCols' );
00226 $aVisibleCols = array();
00227
00228
00229 if ( is_array( $aUserCols ) ) {
00230 foreach ( $aUserCols as $iKey => $sCol ) {
00231 $iCol = ( int ) str_replace( '_', '', $sCol );
00232 if ( isset( $aColNames[$iCol] ) && !$aColNames[$iCol][4] ) {
00233 $aVisibleCols[$iCol] = $aColNames[$iCol];
00234 }
00235 }
00236 }
00237
00238
00239 if ( !count( $aVisibleCols ) ) {
00240 foreach ( $aColNames as $sName => $aCol ) {
00241 if ( $aCol[1] && !$aColNames[$sName][4] )
00242 $aVisibleCols[$sName] = $aCol;
00243 }
00244 }
00245
00246 return $aVisibleCols;
00247 }
00248
00255 protected function _getQueryCols()
00256 {
00257 $sLangTag = oxLang::getInstance()->getLanguageTag();
00258 $sQ = '';
00259 $blSep = false;
00260 $aVisiblecols = $this->_getVisibleColNames();
00261 foreach ( $aVisiblecols as $iCnt => $aCol ) {
00262 if ( $blSep )
00263 $sQ .= ', ';
00264
00265
00266 $sCol = $aCol[3]?$aCol[0].$sLangTag:$aCol[0];
00267 $sQ .= getViewName( $aCol[1] ) . '.' . $sCol . ' as _' . $iCnt;
00268 $blSep = true;
00269 }
00270
00271 $aIdentCols = $this->_getIdentColNames();
00272 foreach ( $aIdentCols as $iCnt => $aCol ) {
00273 if ( $blSep )
00274 $sQ .= ', ';
00275
00276
00277 $sCol = $aCol[3]?$aCol[0].$sLangTag:$aCol[0];
00278 $sQ .= getViewName( $aCol[1] ) . '.' . $sCol . ' as _' . $iCnt;
00279 }
00280
00281 return " $sQ ";
00282 }
00283
00289 protected function _getSorting()
00290 {
00291 return ' order by _' . $this->_getSortCol() . ' '.$this->_getSortDir().' ';
00292 }
00293
00301 protected function _getLimit( $iStart )
00302 {
00303 $iLimit = (int) oxConfig::getParameter("results");
00304 $iLimit = $iLimit?$iLimit:$this->_iSqlLimit;
00305
00306 return " limit $iStart, $iLimit ";
00307 }
00308
00314 protected function _getFilter()
00315 {
00316 $sQ = '';
00317 $aFilter = oxConfig::getParameter( 'aFilter' );
00318 if ( is_array( $aFilter ) && count( $aFilter ) ) {
00319 $aCols = $this->_getVisibleColNames();
00320 $blSep = false;
00321 $oDb = oxDb::getDb();
00322 $oLang = oxLang::getInstance();
00323 $oStr = getStr();
00324
00325 $sLangTag = $oLang->getLanguageTag();
00326 $blIsUtf = $this->getConfig()->isUtf();
00327 $sCharset = $oLang->translateString( "charset" );
00328
00329 foreach ( $aFilter as $sCol => $sValue ) {
00330
00331
00332 if ( !$sValue ) {
00333 continue;
00334 }
00335
00336 $iCol = (int) str_replace( '_', '', $sCol );
00337 if ( isset( $aCols[ $iCol ] ) ) {
00338 if ( $sQ )
00339 $sQ .= ' and ';
00340
00341 if ( !$blIsUtf ) {
00342 $sValue = iconv( 'UTF-8', $sCharset, $sValue );
00343 }
00344
00345
00346 $sValue = str_replace( array( '%', '_' ), array( '\%', '\_' ), $sValue );
00347
00348
00349 $sValue = $oStr->preg_replace( '/^\*/', '%', $sValue );
00350
00351 $sCol = $aCols[ $iCol ][3]?$aCols[ $iCol ][0].$sLangTag:$aCols[ $iCol ][0];
00352 $sQ .= getViewName( $aCols[ $iCol ][1] ) . '.' . $sCol;
00353 $sQ .= ' like ' . $oDb->Quote( $sValue . '%' ). ' ';
00354 }
00355
00356 }
00357 }
00358 return $sQ;
00359 }
00360
00368 protected function _addFilter( $sQ )
00369 {
00370 if ( $sQ && ( $sFilter = $this->_getFilter() ) ) {
00371 $sQ .= ( ( stristr( $sQ, 'where' ) === false )?'where':' and ' ) . $sFilter;
00372 }
00373 return $sQ;
00374 }
00375
00383 protected function _getAll( $sQ )
00384 {
00385 $aReturn = array();
00386 $rs = oxDb::getDb()->execute( $sQ );
00387 if ($rs != false && $rs->recordCount() > 0) {
00388 while (!$rs->EOF) {
00389 $aReturn[] = $rs->fields[0];
00390 $rs->moveNext();
00391 }
00392 }
00393 return $aReturn;
00394 }
00395
00401 protected function _getSortDir()
00402 {
00403 $sDir = oxConfig::getParameter( 'dir' );
00404 if ( !in_array( $sDir, $this->_aPosDir ) ) {
00405 $sDir = $this->_aPosDir[0];
00406 }
00407
00408 return $sDir;
00409 }
00410
00416 protected function _getStartIndex()
00417 {
00418 return (int) oxConfig::getParameter( 'startIndex' );
00419 }
00420
00428 protected function _getTotalCount( $sQ )
00429 {
00430
00431
00432
00433
00434
00435
00436 return (int) oxDb::getDb()->getOne( $sQ );
00437 }
00438
00446 protected function _getDataFields( $sQ )
00447 {
00448 return oxDb::getDb(true)->getArray( $sQ );
00449 }
00450
00458 protected function _outputResponse( $aData )
00459 {
00460 if ( !$this->getConfig()->isUtf() ) {
00461
00462 if ( is_array( $aData['records'] ) && ( $iRecSize = count( $aData['records'] ) ) ) {
00463 $aKeys = array_keys( current( $aData['records'] ) );
00464 $iKeySize = count( $aKeys );
00465 $sCharset = oxLang::getInstance()->translateString("charset");
00466 for ( $i = 0; $i < $iRecSize; $i++ ) {
00467 for ( $c = 0; $c < $iKeySize; $c++ ) {
00468 $aData['records'][$i][$aKeys[$c]] = iconv( $sCharset, "UTF-8", $aData['records'][$i][$aKeys[$c]] );
00469 }
00470 }
00471 }
00472 }
00473
00474 $this->_output( json_encode( $aData ) );
00475 }
00476
00484 protected function _output( $sOut )
00485 {
00486 echo $sOut;
00487 }
00488
00497 protected function _getData( $sCountQ, $sQ )
00498 {
00499 $sQ = $this->_addFilter( $sQ );
00500 $sCountQ = $this->_addFilter( $sCountQ );
00501
00502 $aResponse['startIndex'] = $iStart = $this->_getStartIndex();
00503 $aResponse['sort'] = '_' . $this->_getSortCol();
00504 $aResponse['dir'] = $this->_getSortDir();
00505
00506 $iDebug = $this->getConfig()->getConfigParam( 'iDebug' );
00507 if ( $iDebug ) {
00508 $aResponse['countsql'] = $sCountQ;
00509 }
00510
00511 $aResponse['records'] = array();
00512
00513
00514 if ( ( $iTotal = $this->_getTotalCount( $sCountQ ) ) ) {
00515 $sQ .= $this->_getSorting();
00516 $sQ .= $this->_getLimit( $iStart );
00517
00518 if ( $iDebug ) {
00519 $aResponse['datasql'] = $sQ;
00520 }
00521
00522 $aResponse['records'] = $this->_getDataFields( $sQ );
00523 }
00524
00525 $aResponse['totalRecords'] = $iTotal;
00526
00527 return $aResponse;
00528 }
00529
00537 public function resetArtSeoUrl( $aArtIds )
00538 {
00539 if ( !is_array( $aArtIds ) ) {
00540 $aArtIds = array( $aArtIds );
00541 }
00542
00543 foreach ( $aArtIds as $sArtId ) {
00544 oxSeoEncoder::getInstance()->markAsExpired( $sArtId );
00545 }
00546 }
00547
00553 public function resetContentCache()
00554 {
00555 $blDeleteCacheOnLogout = $this->getConfig()->getConfigParam( 'blClearCacheOnLogout' );
00556
00557
00558 if ( !$blDeleteCacheOnLogout ) {
00559 oxUtils::getInstance()->oxResetFileCache();
00560 }
00561 }
00562
00572 public function resetCounter( $sCounterType, $sValue = null )
00573 {
00574 $blDeleteCacheOnLogout = $this->getConfig()->getConfigParam( 'blClearCacheOnLogout' );
00575
00576 if ( !$blDeleteCacheOnLogout ) {
00577 $myUtilsCount = oxUtilsCount::getInstance();
00578 switch ( $sCounterType ) {
00579 case 'priceCatArticle':
00580 $myUtilsCount->resetPriceCatArticleCount( $sValue );
00581 break;
00582 case 'catArticle':
00583 $myUtilsCount->resetCatArticleCount( $sValue );
00584 break;
00585 case 'vendorArticle':
00586 $myUtilsCount->resetVendorArticleCount( $sValue );
00587 break;
00588 case 'manufacturerArticle':
00589 $myUtilsCount->resetManufacturerArticleCount( $sValue );
00590 break;
00591 }
00592 }
00593 }
00594
00595 }
00596
00597
00598 $blAjaxCall = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest');
00599 if ( $blAjaxCall ) {
00600
00601
00602
00603 error_reporting( E_ALL ^ E_NOTICE);
00604
00605
00606 ini_set('session.name', 'sid' );
00607 ini_set('session.use_cookies', 0 );
00608 ini_set('session.use_trans_sid', 0);
00609 ini_set('url_rewriter.tags', '');
00610 ini_set('magic_quotes_runtime', 0);
00611
00612
00613 $sBasePath = getShopBasePath();
00614 include_once $sBasePath . 'modules/functions.php';
00615 include_once $sBasePath . 'core/oxfunctions.php';
00616 include_once $sBasePath . 'core/adodblite/adodb.inc.php';
00617 include_once $sBasePath . 'core/oxconfig.php';
00618 include_once $sBasePath . 'core/oxsupercfg.php';
00619
00620
00621 include_once $sBasePath . "core/oxutils.php";
00622
00623 $myConfig = oxConfig::getInstance();
00624
00625
00626 $sUtilModule = $myConfig->getConfigParam( 'sUtilModule' );
00627 if ( $sUtilModule && file_exists( getShopBasePath()."modules/".$sUtilModule ) )
00628 include_once getShopBasePath()."modules/".$sUtilModule;
00629
00630 $myConfig->setConfigParam( 'blAdmin', true );
00631 $myConfig->setConfigParam( 'blTemplateCaching', false );
00632
00633
00634 if ( !(oxSession::getInstance()->checkSessionChallenge() && count(oxUtilsServer::getInstance()->getOxCookie()) && oxUtils::getInstance()->checkAccessRights())) {
00635 header( "location:index.php");
00636 oxUtils::getInstance()->showMessageAndExit( "" );
00637 }
00638
00639 if ( $sContainer = oxConfig::getParameter( 'container' ) ) {
00640
00641 $sContainer = trim(strtolower( basename( $sContainer ) ));
00642 $aColumns = array();
00643
00644 include_once 'inc/'.$sContainer.'.inc.php';
00645
00646
00647 $oAjaxComponent = oxNew("ajaxcomponent");
00648 $oAjaxComponent->init($aColumns);
00649
00650 $oAjaxComponent->setName( $sContainer );
00651 $oAjaxComponent->processRequest( oxConfig::getParameter( 'fnc' ) );
00652
00653 } else {
00654
00655 }
00656
00657 $myConfig->pageClose();
00658
00659
00660
00661 return;
00662 }