1
0
Эх сурвалжийг харах

#2304 Wiki functionality: various fixes

Alex Trofimov 6 жил өмнө
parent
commit
a912f172cf

+ 20 - 5
inc/classes/BxDolWiki.php

@@ -333,8 +333,11 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         }
 
         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
+        if (!$aWikiVer) { // check for new block, so initialize with default values
             $aWikiVer = array('block_id' => $iBlockId);
+            if ($bTranslate)
+                $aWikiVer['lang'] = $sLangForTranslate;
+        }
 
         // init form object
         $oForm = BxDolForm::getObjectInstance('sys_wiki', $bTranslate ? 'sys_wiki_translate' : 'sys_wiki_edit');
@@ -368,9 +371,9 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
             $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
             $bUnsafe = $this->getFieldUnsafeFlag ($oForm, $sLang, $aWikiVer);
 
-            // insert new revision
+            // insert new revision (main lang is NOT allowed for translations)
             $iTime = time();
-            if (!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) {
+            if ((!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) && $this->isContentChanged($iBlockId, $sLang, $oForm->getCleanValue('content'))) {
                 $sId = $oForm->insert(array(
                     'added' => $iTime, 
                     'revision' => $sRev,
@@ -393,8 +396,8 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
                     $sRev = $this->getFieldRev ($oForm, $sLang, $aWikiVer);
                     $bUnsafe = $this->getFieldUnsafeFlag ($oForm, $sLang, $aWikiVer);
 
-                    // insert new revision
-                    if (!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) {
+                    // insert new revision (main lang is NOT allowed for translations)
+                    if ((!$bMainLang || ($bMainLang && $this->isAllowed('edit'))) && $this->isContentChanged($iBlockId, $sLang, $sContent)) {
                         $sId =  $oForm->insert(array(
                             'added' => $iTime, 
                             'revision' => $sRev,
@@ -412,6 +415,18 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         }
     }
 
+    protected function isContentChanged ($iBlockId, $sLang, $sContent)
+    {
+        if (!$sContent) // don't allow revisions with empty content
+            return false;
+
+        $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sLang, false, false);
+        if (!$aWikiVer) // when no previous revision available
+            return true;
+
+        return $sContent != $aWikiVer['content'];
+    }
+
     protected function getFieldRev ($oForm, $sLang, $aWikiVer) {
         // increase revision for particular language or start with first revision
         return $aWikiVer && $sLang == $aWikiVer['lang'] ? $aWikiVer['revision'] + 1 : 1;

+ 18 - 1
inc/classes/BxDolWikiQuery.php

@@ -42,6 +42,14 @@ class BxDolWikiQuery extends BxDolDb
         return $aObject;
     }
 
+    /**
+     * Get wiki block
+     * @param $iBlockId block ID
+     * @param $sLang 2 letters language code
+     * @param $iRevision [optional, default false] revision number, if false get latest revision for then given lan
+     * @param $bAutoMainLang [optional, default true] automatically load wiki block for main language if translation for gived language doesn't exist
+     * @return array with wiki block info
+     */
     public function getBlockContent ($iBlockId, $sLang, $iRevision = false, $bAutoMainLang = true)
     {
         $sWhere = '';
@@ -72,7 +80,16 @@ class BxDolWikiQuery extends BxDolDb
     public function deleteRevisions ($iBlockId, $sLang, $aRevisions)
     {
         $aBind = array('block' => $iBlockId, 'lang' => $sLang);
-        return $this->query("DELETE FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `lang` = :lang AND `revision` IN(" . $this->implode_escape($aRevisions) . ")", $aBind);
+        $i = $this->query("DELETE FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `lang` = :lang AND `revision` IN(" . $this->implode_escape($aRevisions) . ")", $aBind);
+        if ($i) { 
+            // check if main language revisions was deleted
+            $aRow = $this->getOne("SELECT `block_id` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `main_lang` = 1 LIMIT 1", array('block' => $iBlockId));
+            if (!$aRow) {
+                // if main lang was deleted then mark latest translation from any lang as main
+                $this->query("UPDATE `sys_pages_wiki_blocks` SET `main_lang` = 1 WHERE `block_id` = :block ORDER BY `added` DESC LIMIT 1", array('block' => $iBlockId));
+            }
+        }
+        return $i;
     }
 
     public function deleteAllRevisions ($iBlockId)

+ 2 - 1
inc/js/classes/BxDolWiki.js

@@ -149,7 +149,8 @@ BxDolWiki.prototype.popup = function (sAction) {
     
     var self = this;
     var sActionUrl = bx_append_url_params(this._sActionUrl + sAction, {
-        block_id: this._oOptions.block_id
+        block_id: this._oOptions.block_id,
+        lang: this._sCurrentLang,
     });
 
     // remove previous popup

+ 9 - 6
install/sql/system.sql

@@ -3973,11 +3973,11 @@ INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `tit
 
 -- wiki menu
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `editable`, `order`) VALUES 
-('sys_wiki', 'system', 'edit', '', '_sys_menu_item_title_wiki_edit', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1, 1),
-('sys_wiki', 'system', 'delete-version', '', '_sys_menu_item_title_wiki_delete_version', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1, 2),
-('sys_wiki', 'system', 'delete-block', '', '_sys_menu_item_title_wiki_delete_block', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1, 3),
-('sys_wiki', 'system', 'translate', '', '_sys_menu_item_title_wiki_translate', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1, 4),
-('sys_wiki', 'system', 'history', '', '_sys_menu_item_title_wiki_history', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1, 5);
+('sys_wiki', 'system', 'edit', '', '_sys_menu_item_title_wiki_edit', '', '', '', '', '', '', 0, 2147483646, '', 1, 0, 1, 1),
+('sys_wiki', 'system', 'delete-version', '', '_sys_menu_item_title_wiki_delete_version', '', '', '', '', '', '', 0, 2147483646, '', 1, 0, 1, 2),
+('sys_wiki', 'system', 'delete-block', '', '_sys_menu_item_title_wiki_delete_block', '', '', '', '', '', '', 0, 2147483646, '', 1, 0, 1, 3),
+('sys_wiki', 'system', 'translate', '', '_sys_menu_item_title_wiki_translate', '', '', '', '', '', '', 0, 2147483646, '', 1, 0, 1, 4),
+('sys_wiki', 'system', 'history', '', '_sys_menu_item_title_wiki_history', '', '', '', '', '', '', 0, 2147483646, '', 1, 0, 1, 5);
 
 -- --------------------------------------------------------
 
@@ -4915,7 +4915,7 @@ CREATE TABLE IF NOT EXISTS `sys_objects_wiki` (
 );
 
 INSERT INTO `sys_objects_wiki` (`object`, `uri`, `title`, `module`, `allow_add_for_levels`, `allow_edit_for_levels`, `allow_delete_for_levels`, `allow_translate_for_levels`, `allow_unsafe_for_levels`, `override_class_name`, `override_class_file`) VALUES
-('system', '', '_sys_wiki_system_title', 'system', 0, 0, 0, 0, 0, '', '');
+('system', 'sys', '_sys_wiki_system_title', 'system', 0, 0, 0, 0, 0, '', '');
 
 
 CREATE TABLE IF NOT EXISTS `sys_pages_wiki_blocks` (
@@ -4946,6 +4946,9 @@ CREATE TABLE IF NOT EXISTS `sys_rewrite_rules` (
   PRIMARY KEY (`id`)
 );
 
+INSERT INTO `sys_rewrite_rules` (`preg`, `service`, `active`) VALUES
+('^sys-action/(.*)$', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"wiki_action";s:6:"params";a:2:{i:0;s:3:"sys";i:1;s:3:"{1}";}s:5:"class";s:16:"TemplServiceWiki";}', '1');
+
 -- --------------------------------------------------------
 
 --

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

@@ -2292,6 +2292,7 @@ If it is not enabled then please consider implement this optimization, since it
 	<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_lang_err"><![CDATA[Please select value]]></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>
@@ -3112,7 +3113,7 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_wiki_system_title"><![CDATA[System WIKI]]></string>
 	<string name="_sys_wiki_error_page_exists"><![CDATA[Page with such name({0}) already exists]]></string>
 	<string name="_sys_wiki_error_no_rev"><![CDATA[There is no {0} revision exist for {1} language]]></string>
-	<string name="_sys_wiki_error_no_revs"><![CDATA[There is no revisions available for this block]]></string>
+	<string name="_sys_wiki_error_no_revs"><![CDATA[There are no revisions available for this block]]></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_view_rev"><![CDATA[Version <b>{0}</b> by <a href="{1}">{2}</a>, {3}]]></string>

+ 1 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -2281,6 +2281,7 @@
 	<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_lang_err"><![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>

+ 1 - 0
template/wiki_delete_version.html

@@ -2,6 +2,7 @@
     <bx_repeat:revisions>
         <tr>
             <td class="bx-wiki-del-rev-cell-checkbox bx-def-border bx-def-padding-thd"><input type="checkbox" name="revision[]" value="__revision__" id="bx-wiki-del-rev-cell-checkbox-__revision__" /></td>
+            <td class="bx-wiki-del-rev-cell-lang bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__lang__</label></td>
             <td class="bx-wiki-del-rev-cell-rev bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__revision__</label></td>
             <td class="bx-wiki-del-rev-cell-time bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__timejs__</label></td>
             <td class="bx-wiki-del-rev-cell-profile bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__author_name__</label></td>

+ 1 - 1
template/wiki_form.html

@@ -15,7 +15,7 @@
                     window.glBxDolWiki__block_id__.processResponce(oResponce);
                 }
                 else {
-                    $("#bx-wiki-form-__block_id__").parent().html(data);
+                    $("#bx-wiki-form-__block_id__").parent().html(data).bxProcessHtml();
                 }
             }
         });

+ 1 - 0
template/wiki_history.html

@@ -3,6 +3,7 @@
 <bx_repeat:revisions>
     <tr>
         <td class="bx-wiki-history-cell-rev bx-def-border bx-def-padding-thd"><a href="__rev_url__">__revision__</a></td>
+        <td class="bx-wiki-history-cell-lang bx-def-border bx-def-padding-thd">__lang__</td>
         <td class="bx-wiki-history-cell-time bx-def-border bx-def-padding-thd">__timejs__</td>
         <td class="bx-wiki-history-cell-profile bx-def-border bx-def-padding-thd"><a href="__author_url__">__author_name__</a></td>
         <td class="bx-wiki-history-cell-notes bx-def-border bx-def-padding-thd">__notes__</td>