Browse Source

#2304 Wiki functionality: translate

Alex Trofimov 6 years ago
parent
commit
2df3cfb754

+ 67 - 27
inc/classes/BxDolWiki.php

@@ -153,10 +153,10 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         $aTypes = array(
             'add' => 'allow_add_for_levels',
             'edit' => 'allow_edit_for_levels',
+            'translate' => 'allow_translate_for_levels',
             'delete-version' => 'allow_delete_for_levels',
             'delete-block' => 'allow_delete_for_levels',
             'get-traaslation' => 'allow_translate_for_levels',
-            'translate' => 'allow_translate_for_levels',
             'history' => true,
             'unsafe' => 'allow_unsafe_for_levels',
         );
@@ -170,35 +170,59 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
             return false;
 
         $oAcl = BxDolAcl::getInstance();
-        return $oAcl->isMemberLevelInSet($this->_aObject[$aTypes[$sType]], $iProfileId); 
+        $bResult = $oAcl->isMemberLevelInSet($this->_aObject[$aTypes[$sType]], $iProfileId); 
+        if ($bResult && 'translate' == $sType) {
+            $aLangs = BxDolLanguages::getInstance()->getLanguages(false, true);
+            return count($aLangs) > 1;
+        }
+        return $bResult;
     }
 
     public function actionGetTranslation ()
     {
         $aWikiVer = $this->_oQuery->getBlockContent ((int)bx_get('block_id'), bx_get('lang'), false, false);
         if (!$aWikiVer)
-            return array('code' => 1, 'msg' => 'no translation was found');
+            return array('code' => 1, 'actions' => 'ShowMsg', 'msg' => 'no translation was found');
         else
             return array('code' => 0, 'lang' => $aWikiVer['lang'], 'content' => $aWikiVer['content'], 'block_id' => $aWikiVer['block_id']);
     }
 
-    public function actionEdit ()
+    public function actionTranslate ()
+    {
+        return $this->actionEdit (true);
+    }
+
+    public function actionEdit ($bTranslate = false)
     {
         $iBlockId = (int)bx_get('block_id');
+        $sMainLangLabel = '';
+        $aWikiVerMain = array();
+        $sLangForTranslate = '';
+        $aLangsForInput = $this->getLangsForInput ($iBlockId, $bTranslate, $sMainLangLabel, $aWikiVerMain, $sLangForTranslate);
 
         // get latest revision for block with current lang
-        $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, bx_lang_name());
+        if ($bTranslate) {
+            $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sLangForTranslate, false, false);
+        }
+        else {
+            $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, bx_lang_name());
+        }
+
         unset($aWikiVer['notes']); // unset notes since we need this field empty in the form
         if (!$aWikiVer) // check for new block, so initialize with default values
             $aWikiVer = array('block_id' => $iBlockId);
 
         // init form object
-        $oForm = BxDolForm::getObjectInstance('sys_wiki', 'sys_wiki_edit');
+        $oForm = BxDolForm::getObjectInstance('sys_wiki', $bTranslate ? 'sys_wiki_translate' : 'sys_wiki_edit');
         if (!$oForm)
             return _t('_sys_txt_error_occured');
 
         if (isset($oForm->aInputs['lang']))
-            $oForm->aInputs['lang']['values'] = $this->getLangsForInput ($aWikiVer['block_id']);
+            $oForm->aInputs['lang']['values'] = $aLangsForInput;
+        if (isset($oForm->aInputs['content_main']) && $sMainLangLabel) {
+            $oForm->aInputs['content_main']['caption'] = $sMainLangLabel;
+            $oForm->aInputs['content_main']['content'] = $aWikiVerMain ? BxDolTemplate::getInstance()->parseHtmlByName('wiki_content.html', array('content' => $aWikiVerMain['content'])) : '';
+        }
 
         $oForm->initChecker($aWikiVer);
         if (!$oForm->isSubmittedAndValid()) {
@@ -207,6 +231,7 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
                 'form' => $oForm->getCode(),
                 'block_id' => $iBlockId,
                 'wiki_action_uri' => $this->getWikiUri(),
+                'action' => $bTranslate ? 'translate' : 'edit',
             ));
         } 
         else {
@@ -215,19 +240,21 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
             // get previous revision with priority for current language
             $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sLang);
 
-            $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
             $bMainLang = $this->getFieldMainLangFlag ($oForm, $sLang, $aWikiVer);
+            $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
             $bUnsafe = $this->getFieldUnsafeFlag ($oForm, $sLang, $aWikiVer);
 
             // insert new revision
             $iTime = time();
-            $sId =  $oForm->insert(array(
-                'added' => $iTime, 
-                'revision' => $sRev,
-                'main_lang' => $bMainLang, 
-                'profile_id' => bx_get_logged_profile_id(),
-                'unsafe' => $bUnsafe,
-            ));
+            if (!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) {
+                $sId = $oForm->insert(array(
+                    'added' => $iTime, 
+                    'revision' => $sRev,
+                    'main_lang' => $bMainLang, 
+                    'profile_id' => bx_get_logged_profile_id(),
+                    'unsafe' => $bUnsafe,
+                ));
+            }
 
             // process translations if available
             if (($sTranslations = bx_get('translations')) && ($aTranslations = json_decode($sTranslations, true))) {
@@ -238,20 +265,22 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
                     // get previous revision with priority for current language
                     $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sLang);
 
-                    $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
                     $bMainLang = $this->getFieldMainLangFlag ($oForm, $sLang, $aWikiVer);
+                    $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
                     $bUnsafe = $this->getFieldUnsafeFlag ($oForm, $sLang, $aWikiVer);
 
                     // insert new revision
-                    $sId =  $oForm->insert(array(
-                        'added' => $iTime, 
-                        'revision' => $sRev,
-                        'main_lang' => $bMainLang, 
-                        'profile_id' => bx_get_logged_profile_id(),
-                        'unsafe' => $bUnsafe,
-                        'lang' => $sLang,
-                        'content' => $sContent,
-                    ));
+                    if (!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) {
+                        $sId =  $oForm->insert(array(
+                            'added' => $iTime, 
+                            'revision' => $sRev,
+                            'main_lang' => $bMainLang, 
+                            'profile_id' => bx_get_logged_profile_id(),
+                            'unsafe' => $bUnsafe,
+                            'lang' => $sLang,
+                            'content' => $sContent,
+                        ));
+                    }
                 }
             }
 
@@ -282,14 +311,14 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
             return $this->isAllowed('unsafe') ? 1 : 0; // in other cases - check permissions
     }
 
-    protected function getLangsForInput ($iBlockId)
+    protected function getLangsForInput ($iBlockId, $bTranslateForm, &$sMainLangLabel, &$aWikiVerMain, &$sLangForTranslate)
     {
         // get main lang update time
         $aWikiVerMain = $this->_oQuery->getBlockContent ($iBlockId, 'neverhood');
         $iUpdatedMainLang = $aWikiVerMain ? $aWikiVerMain['added'] : 0;
 
         // generate values for radio set
-        $aLangs = BxDolLanguages::getInstance()->getLanguages(false, false);
+        $aLangs = BxDolLanguages::getInstance()->getLanguages(false, true);
         foreach ($aLangs as $sKey => $sLang) {
             $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sKey, false, false);
             $sMainLang = $aWikiVer && $aWikiVer['main_lang'] ? '★' : '';
@@ -298,6 +327,17 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
                 $aLangs[$sKey] = _t('_sys_wiki_lang_mask_warn', $sLang, $sMainLang, $sComment);
             else
                 $aLangs[$sKey] = _t('_sys_wiki_lang_mask', $sLang, $sMainLang, $sComment);
+
+
+            if ($bTranslateForm && !$aWikiVer['main_lang'] && !$sLangForTranslate) {
+                $sLangForTranslate = $sKey;
+            }
+
+            if ($bTranslateForm && $aWikiVer['main_lang']) {
+                $sMainLangLabel = $aLangs[$sKey];
+                unset($aLangs[$sKey]);
+                continue;
+            }            
         }
         return $aLangs;
     }

+ 10 - 6
inc/js/classes/BxDolWiki.js

@@ -40,10 +40,14 @@ BxDolWiki.prototype.removePopup = function (iBlockId) {
     $("#bx-wiki-form-" + iBlockId).parents(".bx-popup-wrapper").remove(); 
 }
 
-BxDolWiki.prototype.onEdit = function () {
+BxDolWiki.prototype.onTranslate = function () {
+    this.onEdit('translate');
+};
+
+BxDolWiki.prototype.onEdit = function (sAction) {
     
     var self = this;
-    var sActionUrl = bx_append_url_params(this._sActionUrl + 'edit', {
+    var sActionUrl = bx_append_url_params(this._sActionUrl + ('undefined' === typeof(sAction) ? 'edit' : sAction), {
         block_id: this._oOptions.block_id
     });
 
@@ -109,10 +113,6 @@ BxDolWiki.prototype.onHistory = function () {
     console.log("onHistory:" + this._sObject);
 };
 
-BxDolWiki.prototype.onTranslate = function () {
-    console.log("onTranslate:" + this._sObject);
-};
-
 BxDolWiki.prototype.processResponce = function (oResponce) {
     var self = this;
 
@@ -130,6 +130,10 @@ BxDolWiki.prototype.processResponce = function (oResponce) {
     }
 }
 
+BxDolWiki.prototype.actionShowMsg = function (oResponce) {
+    alert(oResponce.msg);
+}
+
 BxDolWiki.prototype.actionClosePopup = function (oResponce) {
     var self = this;
     if ($(".bx-popup-active").size())

+ 13 - 2
install/sql/system.sql

@@ -3083,7 +3083,8 @@ INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `v
 ('sys_review_edit', 'system', 'sys_review', '_sys_form_review_display_edit', 0),
 ('sys_report_post', 'system', 'sys_report', '_sys_form_display_report_post', 0),
 ('sys_privacy_group_custom_manage', 'system', 'sys_privacy_group_custom', '_sys_form_display_ps_gc_manage', 0),
-('sys_wiki_edit', 'system', 'sys_wiki', '_sys_form_display_wiki_edit', 0);
+('sys_wiki_edit', 'system', 'sys_wiki', '_sys_form_display_wiki_edit', 0),
+('sys_wiki_translate', 'system', 'sys_wiki', '_sys_form_display_wiki_translate', 0);
 
 
 CREATE TABLE IF NOT EXISTS `sys_form_inputs` (
@@ -3204,6 +3205,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 
 ('sys_wiki', 'system', 'block_id', '', '', 0, 'hidden', '', '_sys_form_wiki_input_caption_block_id', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('sys_wiki', 'system', 'lang', '', '', 0, 'radio_set', '', '_sys_form_wiki_input_caption_lang', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('sys_wiki', 'system', 'content_main', '', '', 0, 'custom', '', '_sys_form_wiki_input_caption_content_main', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('sys_wiki', 'system', 'content', '', '', 0, 'textarea', '', '_sys_form_wiki_input_caption_content', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
 ('sys_wiki', 'system', 'notes', '', '', 0, 'text', '', '_sys_form_wiki_input_caption_notes', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
 ('sys_wiki', 'system', 'do_submit', '_sys_submit', '', 0, 'submit', '_sys_form_wiki_input_caption_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
@@ -3353,7 +3355,16 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('sys_wiki_edit', 'notes', 2147483647, 1, 4),
 ('sys_wiki_edit', 'do_submit', 2147483647, 1, 5),
 ('sys_wiki_edit', 'close', 2147483647, 1, 6),
-('sys_wiki_edit', 'buttons', 2147483647, 1, 7);
+('sys_wiki_edit', 'buttons', 2147483647, 1, 7),
+
+('sys_wiki_translate', 'block_id', 2147483647, 1, 1),
+('sys_wiki_translate', 'content_main', 2147483647, 1, 2),
+('sys_wiki_translate', 'lang', 2147483647, 1, 3),
+('sys_wiki_translate', 'content', 2147483647, 1, 4),
+('sys_wiki_translate', 'notes', 2147483647, 1, 5),
+('sys_wiki_translate', 'do_submit', 2147483647, 1, 6),
+('sys_wiki_translate', 'close', 2147483647, 1, 7),
+('sys_wiki_translate', 'buttons', 2147483647, 1, 8);
 
 
 CREATE TABLE `sys_form_pre_lists` (

+ 4 - 2
modules/boonex/english/data/langs/system/en.xml

@@ -2288,10 +2288,12 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_form_txt_select_file"><![CDATA[Select a file]]></string>
 	<string name="_sys_form_wiki"><![CDATA[Wiki]]></string>
 	<string name="_sys_form_display_wiki_edit"><![CDATA[Wiki Edit]]></string>
+	<string name="_sys_form_display_wiki_translate"><![CDATA[Wiki Translate]]></string>
 	<string name="_sys_form_wiki_input_caption_block_id"><![CDATA[Block ID]]></string>
 	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Language]]></string>
 	<string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - main language, red - outdated or missing translation]]></string>
 	<string name="_sys_form_wiki_input_caption_content"><![CDATA[Content]]></string>
+	<string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Main Content]]></string>
 	<string name="_sys_form_wiki_input_caption_notes"><![CDATA[Notes]]></string>
 	<string name="_sys_form_wiki_input_caption_submit"><![CDATA[Submit]]></string>
 	<string name="_sys_form_wiki_input_caption_close"><![CDATA[Close]]></string>
@@ -3111,8 +3113,8 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_wiki_error_page_exists"><![CDATA[Page with such name({0}) already exists]]></string>
 	<string name="_sys_wiki_error_missing_wiki_object"><![CDATA[Wiki object ({0}) wasn't found]]></string>
     <string name="_sys_wiki_error_action_not_allowed"><![CDATA[Wiki object ({1}) action ({0}) isn't allowed]]></string>
-    <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} - <span>{2}</span>]]></string>
-    <string name="_sys_wiki_lang_mask_warn"><![CDATA[{0} {1} - <span style="color:red;">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} <span class="bx-def-font-grayed bx-def-font-small">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_mask_warn"><![CDATA[{0} {1} <span class="bx-def-font-small" style="color:red;">{2}</span>]]></string>
     <string name="_sys_wiki_lang_missing"><![CDATA[missing]]></string>
 	
 </resources>

+ 4 - 2
modules/boonex/russian/data/langs/system/ru.xml

@@ -2277,10 +2277,12 @@
 	<string name="_sys_form_txt_select_file"><![CDATA[Выбрать файл]]></string>
     <string name="_sys_form_wiki"><![CDATA[Вики]]></string>
     <string name="_sys_form_display_wiki_edit"><![CDATA[Вики: редактирование]]></string>
+    <string name="_sys_form_display_wiki_translate"><![CDATA[Вики: перевод]]></string>
 	<string name="_sys_form_wiki_input_caption_block_id"><![CDATA[Идентификатор блока]]></string>
 	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Язык]]></string>
     <string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - основной язык, красным помечен отсутствующий или устаревший перевод]]></string>
 	<string name="_sys_form_wiki_input_caption_content"><![CDATA[Содержимое]]></string>
+    <string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Основное содержимое]]></string>
 	<string name="_sys_form_wiki_input_caption_notes"><![CDATA[Заметки]]></string>
 	<string name="_sys_form_wiki_input_caption_submit"><![CDATA[Сохранить]]></string>
 	<string name="_sys_format_size_b"><![CDATA[{0} байт]]></string>
@@ -3091,8 +3093,8 @@
 	<string name="_sys_wiki_error_page_exists"><![CDATA[Страница с таким именем ({0}) уже существует]]></string>
     <string name="_sys_wiki_error_missing_wiki_object"><![CDATA[Вики объект ({0}) не найден]]></string>
     <string name="_sys_wiki_error_action_not_allowed"><![CDATA[Не разрешенное действие ({0}) для вики объекта ({1})]]></string>
-    <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} - {2}]]></string>
-    <string name="_sys_wiki_lang_mask_warn"><![CDATA[{0} {1} - <span style="color:red;">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} <span class="bx-def-font-grayed bx-def-font-small">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_mask_warn"><![CDATA[{0} {1} <span class="bx-def-font-small" style="color:red;">{2}</span>]]></string>
     <string name="_sys_wiki_lang_missing"><![CDATA[отсутствует]]></string>
 
 </resources>

+ 5 - 0
template/css/wiki.css

@@ -13,3 +13,8 @@
 .bx-wiki-form form textarea[name=content] {
     height:16rem;
 }
+.bx-wiki-content {
+    max-height:10rem;
+    overflow:auto;
+    margin:0;
+}

+ 2 - 2
template/scripts/BxBaseFormWiki.php

@@ -17,14 +17,14 @@ class BxBaseFormWiki extends BxTemplFormView
         parent::__construct($aInfo, $oTemplate);
 
         if (isset($this->aInputs['lang']))
-            $this->aInputs['lang']['values'] = BxDolLanguages::getInstance()->getLanguages(false, false);
+            $this->aInputs['lang']['values'] = BxDolLanguages::getInstance()->getLanguages(false, true);
         if (isset($this->aInputs['content']))
             $this->aInputs['content']['code'] = true;
     }
 
     function genLabel(&$aInput)
     {
-        if (isset($aInput['label']) && $aInput['label'] && 'lang' == $aInput['name']) {
+        if (isset($aInput['label']) && $aInput['label'] && ('lang' == $aInput['name'] || 'content_main' == $aInput['name'])) {
             $sInputID = $this->getInputId($aInput);
             return '<label for="' . $sInputID . '">' . $aInput['label'] . '</label>';
         }

+ 2 - 2
template/scripts/BxBaseServiceWiki.php

@@ -84,13 +84,13 @@ class BxBaseServiceWiki extends BxDol
     {
         $oWiki = BxDolWiki::getObjectInstanceByUri($sWikiObjectUri);
         if (!$oWiki) {
-            echoJson(array('code' => 1, 'msg' => _t('_sys_wiki_error_missing_wiki_object', $sWikiObjectUri)));
+            echoJson(array('code' => 1, 'actions' => 'ShowMsg', 'msg' => _t('_sys_wiki_error_missing_wiki_object', $sWikiObjectUri)));
             return;
         }
 
         $sMethod = 'action' . bx_gen_method_name($sAction, array('-'));
         if (!method_exists($oWiki, $sMethod) || !$oWiki->isAllowed($sAction)) {            
-            echoJson(array('code' => 2, 'msg' => _t('_sys_wiki_error_action_not_allowed', $sAction, $sWikiObjectUri)));
+            echoJson(array('code' => 2, 'actions' => 'ShowMsg', 'msg' => _t('_sys_wiki_error_action_not_allowed', $sAction, $sWikiObjectUri)));
             return;
         }
         

+ 3 - 0
template/wiki_content.html

@@ -0,0 +1,3 @@
+<pre class="bx-wiki-content bx-form-input-textarea bx-def-border bx-def-round-corners bx-def-font">
+__content__
+</pre>

+ 1 - 1
template/wiki_form.html

@@ -4,7 +4,7 @@
 <script>
     $(document).ready(function () {
         $("#bx-wiki-form-__block_id__ form").ajaxForm({
-            url: sUrlRoot + 'r.php?_q=__wiki_action_uri__-action/edit',
+            url: sUrlRoot + 'r.php?_q=__wiki_action_uri__-action/__action__',
             beforeSubmit: function (formData, $form, options) {
                 bx_loading($("#bx-wiki-form-__block_id__ form"), true);
                 formData.push({name: 'translations', value: JSON.stringify(window.glBxDolWiki__block_id__.getTranslations())});