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 = oxConfig::getParameter( "oxid");
00053
00054 $sSavedID = oxConfig::getParameter( "saved_oxid");
00055 if ( isset( $sSavedID) ) {
00056 $sOxId = $sSavedID;
00057 oxSession::deleteVar( "saved_oxid");
00058 $this->_aViewData["oxid"] = $sOxId;
00059
00060 $this->_aViewData["updatelist"] = "1";
00061 }
00062
00063
00064 $this->_aLangData = $this->_getLanguages();
00065
00066 if ( $sOxId != -1 ) {
00067
00068 $this->_checkLangTranslations( $sOxId );
00069 }
00070
00071 if ( $sOxId != "-1" && isset( $sOxId)) {
00072 $this->_aViewData["edit"] = $this->_getLanguageInfo( $sOxId );
00073 }
00074
00075 return "language_main.tpl";
00076 }
00077
00083 public function save()
00084 {
00085 $myConfig = $this->getConfig();
00086
00087
00088 $sOxId = oxConfig::getParameter( "oxid");
00089 $aParams = oxConfig::getParameter( "editval" );
00090
00091 if ( !isset( $aParams['active'])) {
00092 $aParams['active'] = 0;
00093 }
00094
00095 if ( !isset( $aParams['default'])) {
00096 $aParams['default'] = false;
00097 }
00098
00099 if ( empty( $aParams['sort'])) {
00100 $aParams['sort'] = '99999';
00101 }
00102
00103
00104 $this->_aLangData = $this->_getLanguages();
00105
00106 if ( !$this->_validateInput() ) {
00107 return;
00108 }
00109
00110
00111 if ( $sOxId != -1 && $sOxId != $aParams['abbr'] ) {
00112 $this->_updateAbbervation( $sOxId, $aParams['abbr'] );
00113 $sOxId = $aParams['abbr'];
00114 oxSession::setVar( "saved_oxid", $sOxId);
00115 }
00116
00117
00118 if ( $sOxId == -1 ) {
00119 $sOxId = $aParams['abbr'];
00120 $this->_aLangData['params'][$sOxId]['baseId'] = $this->_getAvailableLangBaseId();
00121 oxSession::setVar( "saved_oxid", $sOxId);
00122
00123
00124
00125 if ( !$this->_checkMultilangFieldsExistsInDb( $sOxId ) ) {
00126 $this->_addNewMultilangFieldsToDb();
00127 }
00128 }
00129
00130
00131 $this->_aLangData['lang'][$sOxId] = $aParams['desc'];
00132
00133
00134 $this->_aLangData['params'][$sOxId]['active'] = $aParams['active'];
00135 $this->_aLangData['params'][$sOxId]['default'] = $aParams['default'];
00136 $this->_aLangData['params'][$sOxId]['sort'] = $aParams['sort'];
00137
00138
00139 if ( $aParams['default'] == '1' ) {
00140 $this->_setDefaultLang( $sOxId );
00141 }
00142
00143
00144 $iBaseId = $this->_aLangData['params'][$sOxId]['baseId'];
00145 $this->_aLangData['urls'][$iBaseId] = $aParams['baseurl'];
00146 $this->_aLangData['sslUrls'][$iBaseId] = $aParams['basesslurl'];
00147
00148
00149 $this->_sortLangArraysByBaseId();
00150
00151 $this->_aViewData["updatelist"] = "1";
00152
00153
00154 $this->getConfig()->saveShopConfVar( 'aarr', 'aLanguageParams', $this->_aLangData['params'] );
00155 $this->getConfig()->saveShopConfVar( 'aarr', 'aLanguages', $this->_aLangData['lang'] );
00156 $this->getConfig()->saveShopConfVar( 'arr', 'aLanguageURLs', $this->_aLangData['urls'] );
00157 $this->getConfig()->saveShopConfVar( 'arr', 'aLanguageSSLURLs', $this->_aLangData['sslUrls'] );
00158 }
00159
00167 protected function _getLanguageInfo( $sOxId )
00168 {
00169 $sDefaultLang = $this->getConfig()->getConfigParam( 'sDefaultLang' );
00170
00171 $aLangData = $this->_aLangData['params'][$sOxId];
00172 $aLangData['abbr'] = $sOxId;
00173 $aLangData['desc'] = $this->_aLangData['lang'][$sOxId];
00174 $aLangData['baseurl'] = $this->_aLangData['urls'][$aLangData['baseId']];
00175 $aLangData['basesslurl'] = $this->_aLangData['sslUrls'][$aLangData['baseId']];
00176 $aLangData['default'] = ($this->_aLangData['params'][$sOxId]["baseId"] == $sDefaultLang) ? true : false;
00177
00178 return $aLangData;
00179 }
00180
00188 protected function _setLanguages( $aLangData )
00189 {
00190 $this->_aLangData = $aLangData;
00191 }
00192
00200 protected function _getLanguages()
00201 {
00202 $aLangData['params'] = $this->getConfig()->getConfigParam( 'aLanguageParams' );
00203 $aLangData['lang'] = $this->getConfig()->getConfigParam( 'aLanguages' );
00204 $aLangData['urls'] = $this->getConfig()->getConfigParam( 'aLanguageURLs' );
00205 $aLangData['sslUrls'] = $this->getConfig()->getConfigParam( 'aLanguageSSLURLs' );
00206
00207
00208 if ( !is_array( $aLangData['params']) ) {
00209 $aLangData['params'] = $this->_assignDefaultLangParams( $aLangData['lang'] );
00210 }
00211
00212 return $aLangData;
00213 }
00214
00223 protected function _updateAbbervation( $sOldId, $sNewId )
00224 {
00225 foreach ( array_keys($this->_aLangData) as $sTypeKey ) {
00226
00227 if ( is_array($this->_aLangData[$sTypeKey]) && count($this->_aLangData[$sTypeKey]) > 0 ) {
00228
00229 if ( $sTypeKey == 'urls' || $sTypeKey == 'sslUrls' ) {
00230 continue;
00231 }
00232
00233 $aKeys = array_keys( $this->_aLangData[$sTypeKey] );
00234 $aValues = array_values( $this->_aLangData[$sTypeKey] );
00235
00236 $iReplaceId = array_search( $sOldId, $aKeys );
00237 $aKeys[$iReplaceId] = $sNewId;
00238
00239 $this->_aLangData[$sTypeKey] = array_combine( $aKeys, $aValues );
00240 }
00241 }
00242 }
00243
00250 protected function _sortLangArraysByBaseId()
00251 {
00252 $aUrls = array();
00253 $aSslUrls = array();
00254 $aLanguages = array();
00255
00256 uasort( $this->_aLangData['params'], array($this, '_sortLangParamsByBaseIdCallback') );
00257
00258 foreach ( $this->_aLangData['params'] as $sAbbr => $aParams ) {
00259 $iId = (int)$aParams['baseId'];
00260 $aUrls[$iId] = $this->_aLangData['urls'][$iId];
00261 $aSslUrls[$iId] = $this->_aLangData['sslUrls'][$iId];
00262 $aLanguages[$sAbbr] = $this->_aLangData['lang'][$sAbbr];
00263 }
00264
00265 $this->_aLangData['lang'] = $aLanguages;
00266 $this->_aLangData['urls'] = $aUrls;
00267 $this->_aLangData['sslUrls'] = $aSslUrls;
00268 }
00269
00277 protected function _assignDefaultLangParams( $aLanguages )
00278 {
00279 $aParams = array();
00280 $iBaseId = 0;
00281
00282 foreach ( array_keys($aLanguages) as $sOxId ) {
00283 $aParams[$sOxId]['baseId'] = $iBaseId;
00284 $aParams[$sOxId]['active'] = 1;
00285 $aParams[$sOxId]['sort'] = $iBaseId + 1;
00286
00287 $iBaseId++;
00288 }
00289
00290 return $aParams;
00291 }
00292
00300 protected function _setDefaultLang( $sOxId )
00301 {
00302 $sDefaultId = $this->_aLangData['params'][$sOxId]['baseId'];
00303 $this->getConfig()->saveShopConfVar( 'str', 'sDefaultLang', $sDefaultId );
00304 }
00305
00311 protected function _getAvailableLangBaseId()
00312 {
00313 $aBaseId = array();
00314 foreach ( $this->_aLangData['params'] as $aLang ) {
00315 $aBaseId[] = $aLang['baseId'];
00316 }
00317
00318 $iNewId = 0;
00319 sort( $aBaseId );
00320 $iTotal = count($aBaseId);
00321
00322
00323 while ( $iNewId <= $iTotal ) {
00324 if ( $iNewId !== $aBaseId[$iNewId] ) {
00325 break;
00326 }
00327 $iNewId++;
00328 }
00329
00330 return $iNewId;
00331 }
00332
00341 protected function _checkLangTranslations( $sOxId )
00342 {
00343 $myConfig = $this->getConfig();
00344 $iBaseId = $this->_aLangData['params'][$sOxId]['baseId'];
00345
00346 $sDir = dirname( $myConfig->getLanguagePath( 'lang.php', 0, $iBaseId ) );
00347 if ( !$sDir ) {
00348
00349 $sDir = dirname( $myConfig->getLanguagePath( 'lang.txt', 0, $iBaseId ) );
00350 }
00351
00352 if ( empty($sDir) ) {
00353 $oEx = new oxExceptionToDisplay();
00354 $oEx->setMessage( 'LANGUAGE_NOTRANSLATIONS_WARNING' );
00355 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00356 }
00357 }
00358
00366 protected function _checkMultilangFieldsExistsInDb( $sOxId )
00367 {
00368 $oDbMeta = oxNew( "oxDbMetaDataHandler" );
00369 $iBaseId = $this->_aLangData['params'][$sOxId]['baseId'];
00370
00371 $sPrefix = oxLang::getInstance()->getLanguageTag( $iBaseId );
00372 $sMultiLangCol = 'OXTITLE' . $sPrefix;
00373
00374 if ( !$oDbMeta->fieldExists( $sMultiLangCol, "oxarticles" ) ) {
00375 return false;
00376 }
00377
00378 return true;
00379 }
00380
00387 protected function _addNewMultilangFieldsToDb()
00388 {
00389
00390 oxDb::startTransaction();
00391
00392 $oDbMeta = oxNew( "oxDbMetaDataHandler" );
00393
00394 try {
00395 $oDbMeta->addNewLangToDb();
00396 } catch( Exception $oEx ) {
00397
00398 oxDb::rollbackTransaction();
00399
00400
00401 $oEx = new oxExceptionToDisplay();
00402 $oEx->setMessage( 'LANGUAGE_ERROR_ADDING_MULTILANG_FIELDS' );
00403 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00404
00405 return;
00406 }
00407
00408 oxDb::commitTransaction();
00409 }
00410
00418 protected function _checkLangExists( $sAbbr )
00419 {
00420 $myConfig = $this->getConfig();
00421 $aAbbrs = array_keys($this->_aLangData['lang']);
00422
00423 if ( in_array( $sAbbr, $aAbbrs ) ) {
00424 return true;
00425 }
00426
00427 return false;
00428 }
00429
00439 protected function _sortLangParamsByBaseIdCallback( $oLang1, $oLang2 )
00440 {
00441 return ($oLang1['baseId'] < $oLang2['baseId']) ? -1 : 1;
00442 }
00443
00449 protected function _validateInput()
00450 {
00451 $blResult = true;
00452
00453 $sOxId = oxConfig::getParameter( "oxid");
00454 $aParams = oxConfig::getParameter( "editval" );
00455
00456
00457
00458 if ( $sOxId == -1 ) {
00459 if ( $this->_checkLangExists( $aParams['abbr'] ) ) {
00460 $oEx = oxNew( 'oxExceptionToDisplay' );
00461 $oEx->setMessage( 'LANGUAGE_ALREADYEXISTS_ERROR' );
00462 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00463 $blResult = false;
00464 }
00465 }
00466
00467
00468 if ( empty($aParams['desc']) ) {
00469 $oEx = oxNew( 'oxExceptionToDisplay' );
00470 $oEx->setMessage( 'LANGUAGE_EMPTYLANGUAGENAME_ERROR' );
00471 oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
00472 $blResult = false;
00473 }
00474
00475 return $blResult;
00476 }
00477 }