Просмотр исходного кода

Merge branch 'master' of github.com:boonex/dolphin

Alex Trofimov 12 лет назад
Родитель
Сommit
a3596661db

+ 13 - 4
inc/classes/BxDolXmlParser.php

@@ -51,8 +51,16 @@ class BxDolXmlParser extends BxDol implements iBxDolSingleton
         xml_parse_into_struct($rParser, $sXmlContent, $aValues, $aIndexes);
         xml_parser_free($rParser);
 
-        $aFieldIndex = $aIndexes[strtoupper($sXmlTag)][0];
-        return $aValues[$aFieldIndex]['attributes'][strtoupper($sXmlAttribute)];
+        $sTag = strtoupper($sXmlTag);
+        if(!isset($aIndexes[$sTag]))
+        	return false;
+
+        $iFieldIndex = $aIndexes[$sTag][0];
+        $sAttribute = strtoupper($sXmlAttribute);
+		if(!isset($aValues[$iFieldIndex]['attributes'][$sAttribute]))
+			return false;
+
+        return $aValues[$iFieldIndex]['attributes'][$sAttribute];
     }
 
     /**
@@ -116,8 +124,9 @@ class BxDolXmlParser extends BxDol implements iBxDolSingleton
         xml_parse_into_struct($rParser, $sXmlContent, $aValues, $aIndexes);
         xml_parser_free($rParser);
 
-        $aTagIndexes = $aIndexes[strtoupper($sXmlTagName)];
-        $aTagIndexes = isset($aTagIndexes) ? $aTagIndexes : array();
+        $sTag = strtoupper($sXmlTagName);
+        $aTagIndexes = isset($aIndexes[$sTag]) ? $aIndexes[$sTag] : array();
+
         $aReturnValues = array();
         foreach($aTagIndexes as $iTagIndex) {
             $aReturnValues[$aValues[$iTagIndex]['attributes']['NAME']] =

+ 27 - 14
studio/classes/BxDolStudioLanguagesUtils.php

@@ -81,6 +81,14 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         $aResult = array();
         $aResult['name'] = $oXmlParser->getAttribute($sXmlContent, 'resources', 'name');
 
+        $aResult['title'] = $oXmlParser->getAttribute($sXmlContent, 'resources', 'title');
+        if($aResult['title'] === false)
+			unset($aResult['title']);
+
+        $aResult['category'] = $oXmlParser->getAttribute($sXmlContent, 'resources', 'category');
+		if($aResult['category'] === false)
+			unset($aResult['category']);
+
         switch($sType) {
             case 'restore':
                 $aResult['strings'] = $oXmlParser->getValues($sXmlContent, 'string');
@@ -88,8 +96,17 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
 
             case 'update':
                 $aResult['strings_del'] = $oXmlParser->getValues($sXmlContent, 'string_del');
+                if(empty($aResult['strings_del']) || !is_array($aResult['strings_del']))
+                	unset($aResult['strings_del']);
+
                 $aResult['strings_add'] = $oXmlParser->getValues($sXmlContent, 'string_add');
+                if(empty($aResult['strings_add']) || !is_array($aResult['strings_add']))
+                	unset($aResult['strings_add']);
+
                 $aResult['strings_upd'] = $oXmlParser->getValues($sXmlContent, 'string_upd');
+                if(empty($aResult['strings_upd']) || !is_array($aResult['strings_upd']))
+                	unset($aResult['strings_upd']);
+
                 break;
         }
 
@@ -316,18 +333,24 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         return $iKeyId;
     }
 
-    function updateLanguageString($sKey, $sString, $iLangId = 0, $bRecompile = true)
+    function updateLanguageString($sKey, $mixedString, $iLangId = 0, $iCategoryId = 0, $bRecompile = true)
     {
         $sKey = bx_process_input($sKey);
-        $sString = bx_process_input($sString);
+        $mixedString = bx_process_input($mixedString);
         $iLangId = (int)$iLangId;
+        $iCategoryId = (int)$iCategoryId;
+        if(empty($iCategoryId))
+        	$iCategoryId = BX_DOL_LANGUAGE_CATEGORY_CUSTOM;
 
         $aKey = array();
         $this->oDb->getKeysBy(array('type' => 'by_name', 'value' => $sKey), $aKey);
         if(empty($aKey))
-            return $this->addLanguageString($sKey, $sString, $iLangId, BX_DOL_LANGUAGE_CATEGORY_CUSTOM, $bRecompile);
+            return $this->addLanguageString($sKey, $mixedString, $iLangId, $iCategoryId, $bRecompile);
 
-        return $this->updateLanguageStringById($aKey['id'], $sString, $iLangId, $bRecompile);
+		if((int)$aKey['category_id'] != $iCategoryId)
+			$this->oDb->updateKeys(array('IDCategory' => $iCategoryId), array('ID' => $aKey['id']));
+
+        return $this->updateLanguageStringById($aKey['id'], $mixedString, $iLangId, $bRecompile);
     }
 
     function updateLanguageStringById($iKeyId, $mixedString, $iLangId = 0, $bRecompile = true)
@@ -385,16 +408,6 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         return $this->oDb->deleteKey($iKeyId);
     }
 
-    function addLanguageKeys($iLanguageId, $iCategoryId, &$aKeys)
-    {
-        $this->oDb->addKeys($iLanguageId, $iCategoryId, $aKeys);
-    }
-
-    function deleteLanguageKeys($aKeys)
-    {
-        return $this->oDb->deleteKeys($aKeys);
-    }
-
     function addLanguageCategory($sName)
     {
         return $this->oDb->addCategory($sName);

+ 2 - 2
studio/classes/BxDolStudioLanguagesUtilsQuery.php

@@ -53,7 +53,7 @@ class BxDolStudioLanguagesUtilsQuery extends BxDolLanguagesQuery
         if(!empty($aKey) && is_array($aKey)) {
         	if((int)$aKey['IDCategory'] != $iCategoryId)
         		$this->updateKeys(array('IDCategory' => $iCategoryId), array('ID' => $aKey['ID']));
-        	
+
             return $aKey['ID'];
         }
 
@@ -135,7 +135,7 @@ class BxDolStudioLanguagesUtilsQuery extends BxDolLanguagesQuery
 
     function addString($iKeyId, $iLanguageId, $sString)
     {
-        $sSql = $this->prepare("INSERT INTO `sys_localization_strings` SET `IDKey`=?, `IDLanguage`=?, `String`=?", $iKeyId, $iLanguageId, $sString);
+        $sSql = $this->prepare("INSERT IGNORE INTO `sys_localization_strings` SET `IDKey`=?, `IDLanguage`=?, `String`=?", $iKeyId, $iLanguageId, $sString);
         return (int)$this->query($sSql) > 0;
     }
 

+ 47 - 20
studio/classes/BxDolStudioUpdater.php

@@ -29,6 +29,9 @@ class BxDolStudioUpdater extends BxDolStudioInstaller
             'update_files' => array(
                 'title' => _t('_adm_txt_modules_update_files'),
             ),
+            'restore_languages' => array(
+                'title' => _t('_adm_txt_modules_restore_languages'),
+            ),
         ));
     }
 
@@ -118,18 +121,15 @@ class BxDolStudioUpdater extends BxDolStudioInstaller
 
     public function actionUpdateLanguages($bInstall = true)
     {
-        $oDb = BxDolDb::getInstance();
-
-        bx_import('BxDolStudioLanguagesUtils');
-        $oLanguages = BxDolStudioLanguagesUtils::getInstance();
-        $aLanguages = $oLanguages->getLanguages();
-
-        //--- Process languages' key=>value pears ---//
         $aConfig = self::getModuleConfig($this->_sHomePath . 'install/config.php');
         if(empty($aConfig) || !is_array($aConfig))
             return BX_DOL_STUDIO_INSTALLER_FAILED;
 
-        $iCategoryId = $oLanguages->getLanguageCategory($aConfig['language_category']);
+    	bx_import('BxDolStudioLanguagesUtils');
+        $oLanguages = BxDolStudioLanguagesUtils::getInstance();
+        $aLanguages = $oLanguages->getLanguages();
+
+        $iCategoryId = !empty($aConfig['language_category']) ? $oLanguages->getLanguageCategory($aConfig['language_category']) : 0;
 
         foreach($aLanguages as $sName => $sTitle)
             $this->_updateLanguage($bInstall, $sName, $iCategoryId);
@@ -137,7 +137,30 @@ class BxDolStudioUpdater extends BxDolStudioInstaller
         return $oLanguages->compileLanguage(0, true) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : BX_DOL_STUDIO_INSTALLER_FAILED;
     }
 
-    protected function _updateLanguage($bInstall, $sLanguage, $iCategoryId = 0)
+    /*
+     * Restore module's language files.
+     * 
+     * Note. Mainly the action is needed for Updates in 'language' type modules. 
+     * It should be used after 'update_files' action if some changes were done in module's language files. 
+     */
+    public function actionRestoreLanguages($bInstall = true)
+    {
+    	$aConfig = self::getModuleConfig($this->_sHomePath . 'install/config.php');
+        if(empty($aConfig) || !is_array($aConfig) || empty($aConfig['module_uri']))
+            return BX_DOL_STUDIO_INSTALLER_FAILED;
+
+		bx_import('BxDolStudioLanguagesUtils');
+        $oLanguages = BxDolStudioLanguagesUtils::getInstance();
+        $aLanguages = $oLanguages->getLanguages();
+
+        $bResult = true;
+        foreach($aLanguages as $sName => $sTitle)
+        	$bResult &= $oLanguages->restoreLanguage($sName, $aConfig['module_uri']);
+
+        return $bResult ? BX_DOL_STUDIO_INSTALLER_SUCCESS : BX_DOL_STUDIO_INSTALLER_FAILED;
+    }
+
+    protected function _updateLanguage($bInstall, $sLanguage, $iCategory = 0)
     {
         $oDb = BxDolDb::getInstance();
         $oLanguages = BxDolStudioLanguagesUtils::getInstance();
@@ -149,19 +172,23 @@ class BxDolStudioUpdater extends BxDolStudioInstaller
 
         $iLanguage = $oLanguages->getLangId($sLanguage);
 
-        //--- Process delete ---//
-        if(isset($aLanguageInfo['strings_del']) && is_array($aLanguageInfo['strings_del']))
-            $oLanguages->deleteLanguageKeys($aLanguageInfo['strings_del']);
+        if(!empty($aLanguageInfo['category']))
+        	$iCategory = $oLanguages->getLanguageCategory($aLanguageInfo['category']);
 
-        //--- Process add ---//
-        if(isset($aLanguageInfo['strings_add']) && is_array($aLanguageInfo['strings_add']))
-            $oLanguages->addLanguageKeys($iLanguage, $iCategoryId, $aLanguageInfo['strings_add']);
+        //--- Process delete. Note. Deletion is performed for all languages. ---//
+        if(isset($aLanguageInfo['strings_del']))
+        	foreach($aLanguageInfo['strings_del'] as $sKey => $sValue)
+        		$oLanguages->deleteLanguageString($sKey, 0, false);
 
-        //--- Process update ---//
-        if(isset($aLanguageInfo['strings_upd']) && is_array($aLanguageInfo['strings_upd'])) {
-            $oLanguages->deleteLanguageKeys($aLanguageInfo['strings_upd']);
-            $oLanguages->addLanguageKeys($iLanguage, $iCategoryId, $aLanguageInfo['strings_upd']);
-        }
+        //--- Process add. Note. Key's category will be updated if it doesn't match. ---//
+        if(isset($aLanguageInfo['strings_add']))
+        	foreach($aLanguageInfo['strings_add'] as $sKey => $sValue)
+        		$oLanguages->addLanguageString($sKey, $sValue, $iLanguage, $iCategory, false);
+
+        //--- Process update. Note. Key's category will be updated if it doesn't match. ---//
+        if(isset($aLanguageInfo['strings_upd']))
+        	foreach($aLanguageInfo['strings_upd'] as $sKey => $sValue)
+        		$oLanguages->updateLanguageString($sKey, $sValue, $iLanguage, $iCategory, false);
 
         return true;
     }