Go to the documentation of this file.00001 <?php
00002
00007 class Language_Main extends oxAdminDetails
00008 {
00009
00015 protected $_aLangData = null;
00016
00022 protected $_aLangParams = null;
00023
00029 protected $_aLanguagesUrls = null;
00030
00036 protected $_aLanguagesSslUrls = null;
00037
00045 public function render()
00046 {
00047 $myConfig = $this->getConfig();
00048
00049
00050 parent::render();
00051
00052 $sOxId = $this->_aViewData["oxid"] = $this->getEditObjectId();
00053
00054 $this->_aLangData = $this->_getLanguages();
00055
00056 if ( $sOxId != -1 ) {
00057
00058 $this->_checkLangTranslations( $sOxId );
00059 }
00060
00061 if ( $sOxId != "-1" && isset( $sOxId)) {
00062 $this->_aViewData["edit"] = $this->_getLanguageInfo( $sOxId );
00063 }
00064
00065 return "language_main.tpl";
00066 }
00067
00073 public function save()
00074 {
00075 $myConfig = $this->getConfig();
00076
00077
00078 parent::save();
00079
00080 $sOxId = $this->getEditObjectId();
00081 $aParams = oxConfig::getParameter( "editval" );
00082
00083 if ( !isset( $aParams['active'])) {
00084 $aParams['active'] = 0;
00085 }
00086
00087 if ( !isset( $aParams['default'])) {
00088 $aParams['default'] = false;
00089 }
00090
00091 if ( empty( $aParams['sort'])) {
00092 $aParams['sort'] = '99999';
00093 }
00094
00095
00096 $this->_aLangData = $this->_getLanguages();
00097
00098 if ( !$this->_validateInput() ) {
00099 return;
00100 }
00101
00102 $blViewError = false;
00103
00104
00105 if ( $sOxId != -1 && $sOxId != $aParams['abbr'] ) {
00106
00107 if ( (int) $this->_aLangData['params'][$sOxId]['baseId'] == 0 ) {
00108 $oEx = oxNew( "oxExceptionToDisplay" );
00109 $oEx->setMessage( 'LANGUAGE_ABBRCHANGEMAINLANG_WARNING' );
00110 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00111 $aParams['abbr'] = $sOxId;
00112 } else {
00113 $this->_updateAbbervation( $sOxId, $aParams['abbr'] );
00114 $sOxId = $aParams['abbr'];
00115 $this->setEditObjectId( $sOxId );
00116
00117 $blViewError = true;
00118 }
00119 }
00120
00121
00122 if ( $blNewLanguage = ($sOxId == -1) ) {
00123 $sOxId = $aParams['abbr'];
00124 $this->_aLangData['params'][$sOxId]['baseId'] = $this->_getAvailableLangBaseId();
00125 $this->setEditObjectId( $sOxId );
00126 }
00127
00128
00129 $this->_aLangData['lang'][$sOxId] = $aParams['desc'];
00130
00131
00132 $this->_aLangData['params'][$sOxId]['active'] = $aParams['active'];
00133 $this->_aLangData['params'][$sOxId]['default'] = $aParams['default'];
00134 $this->_aLangData['params'][$sOxId]['sort'] = $aParams['sort'];
00135
00136
00137 if ( $aParams['default'] == '1' ) {
00138 $this->_setDefaultLang( $sOxId );
00139 }
00140
00141
00142 $iBaseId = $this->_aLangData['params'][$sOxId]['baseId'];
00143 $this->_aLangData['urls'][$iBaseId] = $aParams['baseurl'];
00144 $this->_aLangData['sslUrls'][$iBaseId] = $aParams['basesslurl'];
00145
00146
00147 $this->_sortLangArraysByBaseId();
00148
00149 $this->_aViewData["updatelist"] = "1";
00150
00151
00152 $this->getConfig()->saveShopConfVar( 'aarr', 'aLanguageParams', $this->_aLangData['params'] );
00153 $this->getConfig()->saveShopConfVar( 'aarr', 'aLanguages', $this->_aLangData['lang'] );
00154 $this->getConfig()->saveShopConfVar( 'arr', 'aLanguageURLs', $this->_aLangData['urls'] );
00155 $this->getConfig()->saveShopConfVar( 'arr', 'aLanguageSSLURLs', $this->_aLangData['sslUrls'] );
00156
00157
00158
00159 if ($blNewLanguage) {
00160 if (!$this->_checkMultilangFieldsExistsInDb( $sOxId ) ) {
00161 $this->_addNewMultilangFieldsToDb();
00162 } else {
00163 $blViewError = true;
00164 }
00165 }
00166
00167
00168 if ($blViewError) {
00169 $oEx = oxNew( 'oxExceptionToDisplay' );
00170 $oEx->setMessage( 'LANGUAGE_ERRORGENERATEVIEWS' );
00171 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00172 }
00173 }
00174
00182 protected function _getLanguageInfo( $sOxId )
00183 {
00184 $sDefaultLang = $this->getConfig()->getConfigParam( 'sDefaultLang' );
00185
00186 $aLangData = $this->_aLangData['params'][$sOxId];
00187 $aLangData['abbr'] = $sOxId;
00188 $aLangData['desc'] = $this->_aLangData['lang'][$sOxId];
00189 $aLangData['baseurl'] = $this->_aLangData['urls'][$aLangData['baseId']];
00190 $aLangData['basesslurl'] = $this->_aLangData['sslUrls'][$aLangData['baseId']];
00191 $aLangData['default'] = ($this->_aLangData['params'][$sOxId]["baseId"] == $sDefaultLang) ? true : false;
00192
00193 return $aLangData;
00194 }
00195
00203 protected function _setLanguages( $aLangData )
00204 {
00205 $this->_aLangData = $aLangData;
00206 }
00207
00215 protected function _getLanguages()
00216 {
00217 $aLangData['params'] = $this->getConfig()->getConfigParam( 'aLanguageParams' );
00218 $aLangData['lang'] = $this->getConfig()->getConfigParam( 'aLanguages' );
00219 $aLangData['urls'] = $this->getConfig()->getConfigParam( 'aLanguageURLs' );
00220 $aLangData['sslUrls'] = $this->getConfig()->getConfigParam( 'aLanguageSSLURLs' );
00221
00222
00223 if ( !is_array( $aLangData['params']) ) {
00224 $aLangData['params'] = $this->_assignDefaultLangParams( $aLangData['lang'] );
00225 }
00226
00227 return $aLangData;
00228 }
00229
00238 protected function _updateAbbervation( $sOldId, $sNewId )
00239 {
00240 foreach ( array_keys($this->_aLangData) as $sTypeKey ) {
00241
00242 if ( is_array($this->_aLangData[$sTypeKey]) && count($this->_aLangData[$sTypeKey]) > 0 ) {
00243
00244 if ( $sTypeKey == 'urls' || $sTypeKey == 'sslUrls' ) {
00245 continue;
00246 }
00247
00248 $aKeys = array_keys( $this->_aLangData[$sTypeKey] );
00249 $aValues = array_values( $this->_aLangData[$sTypeKey] );
00250
00251 $iReplaceId = array_search( $sOldId, $aKeys );
00252 $aKeys[$iReplaceId] = $sNewId;
00253
00254 $this->_aLangData[$sTypeKey] = array_combine( $aKeys, $aValues );
00255 }
00256 }
00257 }
00258
00265 protected function _sortLangArraysByBaseId()
00266 {
00267 $aUrls = array();
00268 $aSslUrls = array();
00269 $aLanguages = array();
00270
00271 uasort( $this->_aLangData['params'], array($this, '_sortLangParamsByBaseIdCallback') );
00272
00273 foreach ( $this->_aLangData['params'] as $sAbbr => $aParams ) {
00274 $iId = (int)$aParams['baseId'];
00275 $aUrls[$iId] = $this->_aLangData['urls'][$iId];
00276 $aSslUrls[$iId] = $this->_aLangData['sslUrls'][$iId];
00277 $aLanguages[$sAbbr] = $this->_aLangData['lang'][$sAbbr];
00278 }
00279
00280 $this->_aLangData['lang'] = $aLanguages;
00281 $this->_aLangData['urls'] = $aUrls;
00282 $this->_aLangData['sslUrls'] = $aSslUrls;
00283 }
00284
00292 protected function _assignDefaultLangParams( $aLanguages )
00293 {
00294 $aParams = array();
00295 $iBaseId = 0;
00296
00297 foreach ( array_keys($aLanguages) as $sOxId ) {
00298 $aParams[$sOxId]['baseId'] = $iBaseId;
00299 $aParams[$sOxId]['active'] = 1;
00300 $aParams[$sOxId]['sort'] = $iBaseId + 1;
00301
00302 $iBaseId++;
00303 }
00304
00305 return $aParams;
00306 }
00307
00315 protected function _setDefaultLang( $sOxId )
00316 {
00317 $sDefaultId = $this->_aLangData['params'][$sOxId]['baseId'];
00318 $this->getConfig()->saveShopConfVar( 'str', 'sDefaultLang', $sDefaultId );
00319 }
00320
00326 protected function _getAvailableLangBaseId()
00327 {
00328 $aBaseId = array();
00329 foreach ( $this->_aLangData['params'] as $aLang ) {
00330 $aBaseId[] = $aLang['baseId'];
00331 }
00332
00333 $iNewId = 0;
00334 sort( $aBaseId );
00335 $iTotal = count($aBaseId);
00336
00337
00338 while ( $iNewId <= $iTotal ) {
00339 if ( $iNewId !== $aBaseId[$iNewId] ) {
00340 break;
00341 }
00342 $iNewId++;
00343 }
00344
00345 return $iNewId;
00346 }
00347
00356 protected function _checkLangTranslations( $sOxId )
00357 {
00358 $myConfig = $this->getConfig();
00359 $aLangParams = $this->_aLangData['params'][$sOxId];
00360 $iBaseId = $aLangParams['baseId'];
00361 $iIsActive = $aLangParams['active'];
00362
00363 $sDir = dirname( $myConfig->getDir( 'lang.php', oxLang::getInstance()->getLanguageAbbr( $iBaseId ), 0, $iBaseId ) );
00364
00365 $sDirAdmin = dirname( $myConfig->getDir( 'lang.php', oxLang::getInstance()->getLanguageAbbr( $iBaseId ), 1, $iBaseId ) );
00366
00367 if ( !$sDir ) {
00368
00369 $sDir = dirname( $myConfig->getLanguagePath( 'lang.txt', 0, $iBaseId ) );
00370 }
00371
00372
00373 if ( $iIsActive == 0 && empty($sDirAdmin) ) {
00374 $oEx = oxNew( "oxExceptionToDisplay" );
00375 $oEx->setMessage( 'LANGUAGE_BACKEND_NOTRANSLATIONS_WARNING' );
00376 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00377 }
00378
00379 elseif ( $iIsActive == 1 && empty($sDir) ) {
00380 $oEx = oxNew( "oxExceptionToDisplay" );
00381 $oEx->setMessage( 'LANGUAGE_FRONTEND_NOTRANSLATIONS_WARNING' );
00382 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00383 }
00384 }
00385
00393 protected function _checkMultilangFieldsExistsInDb( $sOxId )
00394 {
00395 $iBaseId = $this->_aLangData['params'][$sOxId]['baseId'];
00396 $sTable = getLangTableName('oxarticles', $iBaseId );
00397 $sColumn = 'oxtitle' . oxLang::getInstance()->getLanguageTag( $iBaseId );
00398
00399 $oDbMetadata = oxNew('oxDbMetaDataHandler');
00400 return $oDbMetadata->tableExists( $sTable ) && $oDbMetadata->fieldExists( $sColumn, $sTable );
00401 }
00402
00409 protected function _addNewMultilangFieldsToDb()
00410 {
00411
00412 oxDb::startTransaction();
00413
00414 $oDbMeta = oxNew( "oxDbMetaDataHandler" );
00415
00416 try {
00417 $oDbMeta->addNewLangToDb();
00418 } catch( Exception $oEx ) {
00419
00420 oxDb::rollbackTransaction();
00421
00422
00423 echo $oEx->getMessage();
00424 $oEx = oxNew( "oxExceptionToDisplay" );
00425 $oEx->setMessage( 'LANGUAGE_ERROR_ADDING_MULTILANG_FIELDS' );
00426 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00427
00428 return;
00429 }
00430
00431 oxDb::commitTransaction();
00432 }
00433
00441 protected function _checkLangExists( $sAbbr )
00442 {
00443 $myConfig = $this->getConfig();
00444 $aAbbrs = array_keys($this->_aLangData['lang']);
00445
00446 if ( in_array( $sAbbr, $aAbbrs ) ) {
00447 return true;
00448 }
00449
00450 return false;
00451 }
00452
00462 protected function _sortLangParamsByBaseIdCallback( $oLang1, $oLang2 )
00463 {
00464 return ($oLang1['baseId'] < $oLang2['baseId']) ? -1 : 1;
00465 }
00466
00472 protected function _validateInput()
00473 {
00474 $blResult = true;
00475
00476 $sOxId = $this->getEditObjectId();
00477 $aParams = oxConfig::getParameter( "editval" );
00478
00479
00480
00481 if ( $sOxId == -1 ) {
00482 if ( $this->_checkLangExists( $aParams['abbr'] ) ) {
00483 $oEx = oxNew( 'oxExceptionToDisplay' );
00484 $oEx->setMessage( 'LANGUAGE_ALREADYEXISTS_ERROR' );
00485 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00486 $blResult = false;
00487 }
00488 }
00489
00490
00491 if ( empty($aParams['desc']) ) {
00492 $oEx = oxNew( 'oxExceptionToDisplay' );
00493 $oEx->setMessage( 'LANGUAGE_EMPTYLANGUAGENAME_ERROR' );
00494 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00495 $blResult = false;
00496 }
00497
00498 return $blResult;
00499 }
00500 }