Browse Source

#2304 Wiki functionality: edit block

Alex Trofimov 6 years ago
parent
commit
56aa131222

+ 44 - 1
inc/classes/BxDolWiki.php

@@ -106,6 +106,14 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         return $this->_sObject;
     }
 
+    /**
+     * Get wiki URi
+     */
+    public function getWikiUri ()
+    {
+        return $this->_aObject['uri'];
+    }
+
     /**
      * Get WIKI block content
      * @param $iBlockId block ID
@@ -166,7 +174,42 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
 
     public function actionEdit ()
     {
-        return array('code' => 0, 'msg' => "TODO: Success! block = [" . bx_get('block_id') . "]");
+        $aWikiVer = $this->_oQuery->getBlockContent ((int)bx_get('block_id'), bx_lang_name());
+        unset($aWikiVer['notes']);
+        if (!$aWikiVer)
+            $aWikiVer = array('block_id' => (int)bx_get('block_id'));
+
+        $oForm = BxDolForm::getObjectInstance('sys_wiki', 'sys_wiki_edit');
+        if (!$oForm)
+            return _t('_sys_txt_error_occured');
+        $oForm->initChecker($aWikiVer);
+        if (!$oForm->isSubmittedAndValid()) {
+            return BxDolTemplate::getInstance()->parseHtmlByName('wiki_form.html', array(
+                'form' => $oForm->getCode(),
+                'block_id' => (int)bx_get('block_id'),
+                'wiki_action_uri' => $this->getWikiUri(),
+            ));
+        } 
+        else {
+            $aWikiVer = $this->_oQuery->getBlockContent ((int)bx_get('block_id'), $oForm->getCleanValue('lang'));
+
+            $sRev = $aWikiVer && $oForm->getCleanValue('lang') == $aWikiVer['lang'] ? $aWikiVer['revision'] + 1 : 1;
+
+            $bMainLang = 0;
+            if ($aWikiVer && $oForm->getCleanValue('lang') == $aWikiVer['lang'])
+                $bMainLang = $aWikiVer['main_lang'];
+            elseif (!$aWikiVer)
+                $bMainLang = 1;
+
+            $sId =  $oForm->insert(array(
+                'added' => time(), 
+                'revision' => $sRev,
+                'main_lang' => $bMainLang, 
+                'profile_id' => bx_get_logged_profile_id(),
+                'unsafe' => $this->isAllowed('unsafe') ? 1 : 0,
+            ));
+            return "Success [$sId] (TODO: wiki close popup)";
+        }
     }
 }
 

+ 2 - 2
inc/classes/BxDolWikiQuery.php

@@ -52,12 +52,12 @@ class BxDolWikiQuery extends BxDolDb
         }
 
         // get latest revision for specific language
-        $aRow = $this->getRow("SELECT `content`, `unsafe`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `language` = :lang $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
+        $aRow = $this->getRow("SELECT `block_id`, `revision`, `lang`, `main_lang`, `content`, `unsafe`, `notes`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `lang` = :lang $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
 
         // if translation isn't found for specific language then get latest revision for main language 
         if (!$aRow) {
             unset($aBind['lang']);
-            $aRow = $this->getRow("SELECT `content`, `unsafe`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `main_language` = 1 $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
+            $aRow = $this->getRow("SELECT `block_id`, `revision`, `lang`, `main_lang`, `content`, `unsafe`, `notes`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `main_lang` = 1 $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
         }
 
         return $aRow ? $aRow : false;

+ 3 - 4
inc/js/classes/BxDolWiki.js

@@ -11,6 +11,7 @@ function BxDolWiki (sObject, eContainer, oOptions) {
     this._oOptions = $.extend({}, oDefault, oOptions);
     this._sObject = sObject;
     this._eCont = eContainer;
+    this._sActionUrl = sUrlRoot + 'r.php?_q=' + this._oOptions.wiki_action_uri + '-action/';
     this.bindEvents();
 }
 
@@ -33,12 +34,10 @@ BxDolWiki.prototype.bindEvents = function () {
 
 BxDolWiki.prototype.onEdit = function () {
 
-    var sActionUrl = sUrlRoot + 'r.php?_q=wiki-action/edit';
-    $.getJSON(sActionUrl, {
+    var sActionUrl = bx_append_url_params(this._sActionUrl + 'edit', {
         block_id: this._oOptions.block_id
-    }, function (data) {
-        alert(JSON.stringify(data));
     });
+    $(window).dolPopupAjax({url: sActionUrl});
 };
 
 BxDolWiki.prototype.onDeleteVersion = function () {

+ 23 - 7
install/sql/system.sql

@@ -3048,7 +3048,8 @@ INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_att
 ('sys_comment', 'system', '_sys_form_comment', 'cmts.php', 'a:3:{s:2:"id";s:17:"cmt-%s-form-%s-%d";s:4:"name";s:17:"cmt-%s-form-%s-%d";s:5:"class";s:14:"cmt-post-reply";}', 'cmt_submit', '', 'cmt_id', '', '', '', 0, 1, 'BxTemplCmtsForm', ''),
 ('sys_review', 'system', '_sys_form_review', 'cmts.php', 'a:3:{s:2:"id";s:17:"cmt-%s-form-%s-%d";s:4:"name";s:17:"cmt-%s-form-%s-%d";s:5:"class";s:14:"cmt-post-reply";}', 'cmt_submit', '', 'cmt_id', '', '', '', 0, 1, 'BxTemplCmtsReviewsForm', ''),
 ('sys_report', 'system', '_sys_form_report', 'report.php', 'a:3:{s:2:"id";s:0:"";s:4:"name";s:0:"";s:5:"class";s:17:"bx-report-do-form";}', 'submit', '', 'id', '', '', '', 0, 1, '', ''),
-('sys_privacy_group_custom', 'system', '_sys_form_ps_group_custom', 'privacy.php', '', 'do_submit', 'sys_privacy_groups_custom', 'id', '', '', '', 0, 1, 'BxTemplPrivacyFormGroupCustom', '');
+('sys_privacy_group_custom', 'system', '_sys_form_ps_group_custom', 'privacy.php', '', 'do_submit', 'sys_privacy_groups_custom', 'id', '', '', '', 0, 1, 'BxTemplPrivacyFormGroupCustom', ''),
+('sys_wiki', 'system', '_sys_form_wiki', '', '', 'do_submit', 'sys_pages_wiki_blocks', 'id', '', '', '', 0, 1, 'BxTemplFormWiki', '');
 
 CREATE TABLE IF NOT EXISTS `sys_form_displays` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -3081,7 +3082,8 @@ INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `v
 ('sys_review_post', 'system', 'sys_review', '_sys_form_review_display_post', 0),
 ('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_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);
 
 
 CREATE TABLE IF NOT EXISTS `sys_form_inputs` (
@@ -3198,8 +3200,15 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 ('sys_privacy_group_custom', 'system', 'list', '', '', 0, 'custom', '_sys_form_ps_gc_input_caption_system_list', '_sys_form_ps_gc_input_caption_list', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
 ('sys_privacy_group_custom', 'system', 'controls', '', 'do_submit,do_cancel', 0, 'input_set', '', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
 ('sys_privacy_group_custom', 'system', 'do_submit', '_sys_form_ps_gc_input_caption_do_submit', '', 0, 'submit', '_sys_form_ps_gc_input_caption_system_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
-('sys_privacy_group_custom', 'system', 'do_cancel', '_sys_form_ps_gc_input_caption_do_cancel', '', 0, 'button', '_sys_form_ps_gc_input_caption_system_do_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0);
+('sys_privacy_group_custom', 'system', 'do_cancel', '_sys_form_ps_gc_input_caption_do_cancel', '', 0, 'button', '_sys_form_ps_gc_input_caption_system_do_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0),
 
+('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, 'select', '', '_sys_form_wiki_input_caption_lang', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 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),
+('sys_wiki', 'system', 'close', '_sys_close', '', 0, 'reset', '_sys_form_wiki_input_caption_close', '', '', 0, 0, 0, 'a:2:{s:7:\"onclick\";s:46:\"$(\'.bx-popup-applied:visible\').dolPopupHide();\";s:5:\"class\";s:22:\"bx-def-margin-sec-left\";}', '', '', '', '', '', '', '', 1, 0),
+('sys_wiki', 'system', 'buttons', '', 'do_submit,close', 0, 'input_set', '_sys_form_wiki_buttons', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0);
 
 
 CREATE TABLE IF NOT EXISTS `sys_form_display_inputs` (
@@ -3336,7 +3345,15 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('sys_privacy_group_custom_manage', 'list', 2147483647, 1, 7),
 ('sys_privacy_group_custom_manage', 'controls', 2147483647, 1, 8),
 ('sys_privacy_group_custom_manage', 'do_submit', 2147483647, 1, 9),
-('sys_privacy_group_custom_manage', 'do_cancel', 2147483647, 1, 10);
+('sys_privacy_group_custom_manage', 'do_cancel', 2147483647, 1, 10),
+
+('sys_wiki_edit', 'block_id', 2147483647, 1, 1),
+('sys_wiki_edit', 'lang', 2147483647, 1, 2),
+('sys_wiki_edit', 'content', 2147483647, 1, 3),
+('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);
 
 
 CREATE TABLE `sys_form_pre_lists` (
@@ -4894,14 +4911,13 @@ CREATE TABLE IF NOT EXISTS `sys_pages_wiki_blocks` (
   `id` int(10) UNSIGNED NOT NULL,
   `block_id` int(11) NOT NULL,
   `revision` int(11) NOT NULL,
-  `language` varchar(5) NOT NULL,
+  `lang` varchar(5) NOT NULL,
   `main_language` tinyint(4) NOT NULL DEFAULT '0',
   `profile_id` int(10) UNSIGNED NOT NULL,
   `content` mediumtext NOT NULL,
   `unsafe` tinyint(4) NOT NULL DEFAULT '0',
-  `comment` varchar(255) NOT NULL,
+  `notes` varchar(255) NOT NULL,
   `added` int(11) NOT NULL,
-  `changed` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `block_lang_rev` (`block_id`,`language`,`revision`)
 );

+ 21 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplFormWiki.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseFormWiki
+ */
+class BxTemplFormWiki extends BxBaseFormWiki
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+
+/** @} */

+ 9 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -2286,6 +2286,15 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_form_unsubscribe_input_submit"><![CDATA[Submit]]></string>
 	<string name="_sys_form_err_not_unique_value"><![CDATA[The field should have unique value]]></string>
 	<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_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_content"><![CDATA[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>
+	<string name="_sys_form_wiki_buttons"><![CDATA[Buttons]]></string>
 	<string name="_sys_format_size_b"><![CDATA[{0} bytes]]></string>
 	<string name="_sys_format_size_gb"><![CDATA[{0} GB]]></string>
 	<string name="_sys_format_size_kb"><![CDATA[{0} KB]]></string>

+ 21 - 0
modules/boonex/lucid/data/template/system/scripts/BxTemplFormWiki.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseFormWiki
+ */
+class BxTemplFormWiki extends BxBaseFormWiki
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplFormWiki.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseFormWiki
+ */
+class BxTemplFormWiki extends BxBaseFormWiki
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplFormWiki.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseFormWiki
+ */
+class BxTemplFormWiki extends BxBaseFormWiki
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+
+/** @} */

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

@@ -2275,6 +2275,13 @@
 	<string name="_sys_form_unsubscribe_input_submit"><![CDATA[Выполнить]]></string>
 	<string name="_sys_form_err_not_unique_value"><![CDATA[Поле должно иметь уникальное значение]]></string>
 	<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_wiki_input_caption_block_id"><![CDATA[Идентификатор блока]]></string>
+	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Язык]]></string>
+	<string name="_sys_form_wiki_input_caption_content"><![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>
 	<string name="_sys_format_size_gb"><![CDATA[{0} ГБ]]></string>
 	<string name="_sys_format_size_kb"><![CDATA[{0} КБ]]></string>

+ 26 - 0
template/scripts/BxBaseFormWiki.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Wiki Form
+ */
+class BxBaseFormWiki extends BxTemplFormView
+{
+    public function __construct($aInfo, $oTemplate)
+    {
+        parent::__construct($aInfo, $oTemplate);
+
+        if (isset($this->aInputs['lang'])) {
+            $this->aInputs['lang']['values'] = BxDolLanguages::getInstance()->getLanguages(false, false);
+        }
+    }
+
+}
+
+/** @} */

+ 7 - 3
template/scripts/BxBaseServiceWiki.php

@@ -89,13 +89,16 @@ class BxBaseServiceWiki extends BxDol
         }
 
         $sMethod = 'action' . bx_gen_method_name($sAction, array('-'));
-        if (!method_exists($oWiki, $sMethod) || !$oWiki->isAllowed($sAction)) {
+        if (!method_exists($oWiki, $sMethod) || !$oWiki->isAllowed($sAction)) {            
             echoJson(array('code' => 2, 'msg' => _t('_sys_wiki_error_action_not_allowed', $sAction, $sWikiObjectUri)));
             return;
         }
         
-        $a = $oWiki->$sMethod();
-        echoJson($a);
+        $mixed = $oWiki->$sMethod();
+        if (is_array($mixed))
+            echoJson($mixed);
+        else
+            echo $mixed;
     }
 
     /**
@@ -133,6 +136,7 @@ class BxBaseServiceWiki extends BxDol
             'info' => bx_time_js($aWikiVer['added']), // 'TODO: On right - Last modified time and List of missing and outdated translations. History and Last modified time should be controlled by regular menu privacy, while other actions should have custom privacy for particular wiki object',
             'options' => json_encode(array(
                 'block_id' => $sBlockId,
+                'wiki_action_uri' => $oWikiObject->getWikiUri(),
             )),
         ));
     }

+ 17 - 0
template/wiki_form.html

@@ -0,0 +1,17 @@
+<div id="bx-wiki-form-__block_id__" class="bx-wiki-form">
+    __form__
+</div>
+<script>
+    $(document).ready(function () {
+        $("#bx-wiki-form-__block_id__ form").ajaxForm({
+            url: sUrlRoot + 'r.php?_q=__wiki_action_uri__-action/edit',
+            beforeSubmit: function (formData, jqForm, options) {
+                bx_loading($("#bx-wiki-form-__block_id__ form"), true);
+            },
+            success: function (data) {
+                $("#bx-wiki-form-__block_id__").parent().html(data);
+                // $(".bx-popup-active").dolPopupHide();
+            }
+        });
+    });
+</script>