Przeglądaj źródła

Ticket #4152 - United Post Form: Add possibility to preload necessary forms.

AntonLV 3 lat temu
rodzic
commit
0a1c32696c

+ 34 - 0
inc/js/classes/BxDolCreatePost.js

@@ -11,14 +11,48 @@ function BxDolCreatePost(oOptions) {
     this._sRootUrl = oOptions.sRootUrl == undefined ? sUrlRoot : oOptions.sRootUrl;
     this._sDefault = oOptions.sDefault == undefined ? '' : oOptions.sDefault;
     this._iContextId = oOptions.iContextId == undefined ? 0 : oOptions.iContextId;
+    this._oPreloadingList = oOptions.oPreloadingList == undefined ? [] : oOptions.oPreloadingList;
     this._oCustom = oOptions.oCustom == undefined ? {} : oOptions.oCustom;
 
     this._sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
     this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
 
     this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+
+    var $this = this;
+    $(document).ready(function() {
+        $this.init();
+    });
 }
 
+BxDolCreatePost.prototype.init = function () {
+    var oDate = new Date();
+
+    for(var sKey in this._oPreloadingList) {
+        var sForm = '.sys-cpf-form.sys-cpf-' + sKey;
+        if($(sForm).length != 0)
+            continue;
+
+        $.get(
+            this._sRootUrl + 'modules/?r=' + this._oPreloadingList[sKey] + '/get_create_post_form/', {
+                ajax_mode: true,
+                dynamic_mode: true,
+                absolute_action_url: true,
+                context_id: this._iContextId,
+                custom: this._oCustom,
+                _t:oDate.getTime()
+            },
+            function(oData) {
+                if(!oData || !oData.content) 
+                    return;
+
+                $('.sys-cpf-close').before($('<div class="sys-cpf-form sys-cpf-' + oData.module + '">' + oData.content + '</div>').hide());
+            }, 
+            'json'
+        );
+    }
+};
+
 BxDolCreatePost.prototype.getForm = function (sModuleName, sModuleUri, oElement) {
     var $this = this;
     var oDate = new Date();

+ 3 - 1
install/sql/system.sql

@@ -546,7 +546,9 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 
 (@iCategoryId, 'sys_vote_reactions_quick_mode', '_adm_stg_cpt_option_sys_vote_reactions_quick_mode', 'on', 'checkbox', '', '', '', 60),
 
-(@iCategoryId, 'sys_cmts_enable_auto_approve', '_adm_stg_cpt_option_sys_cmts_enable_auto_approve', 'on', 'checkbox', '', '', '', 70);
+(@iCategoryId, 'sys_cmts_enable_auto_approve', '_adm_stg_cpt_option_sys_cmts_enable_auto_approve', 'on', 'checkbox', '', '', '', 70),
+
+(@iCategoryId, 'sys_create_post_form_preloading_list', '_adm_stg_cpt_option_sys_create_post_form_preloading_list', '', 'list', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:44:"get_options_create_post_form_preloading_list";s:5:"class";s:13:"TemplServices";}', '', '', 80);
 
 --
 -- CATEGORY: Storage

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

@@ -1698,6 +1698,7 @@
     <string name="_adm_stg_cpt_option_sys_logs_storage_default"><![CDATA[Default logs storage]]></string>
     <string name="_adm_stg_cpt_option_sys_vote_reactions_quick_mode"><![CDATA[Enable 'Quick Reactions' mode - vote with default reaction when clicked]]></string>
     <string name="_adm_stg_cpt_option_sys_cmts_enable_auto_approve"><![CDATA[Auto approve a comment after creation]]></string>
+    <string name="_adm_stg_cpt_option_sys_create_post_form_preloading_list"><![CDATA[Preload forms asynchronously in "Create Post" blocks]]></string>
     <string name="_adm_stg_cpt_option_sys_a2a_enable"><![CDATA[Use Add2Any code instead of default sharing menu]]></string>
     <string name="_adm_stg_cpt_option_sys_a2a_code"><![CDATA[Add2Any code]]></string>
 

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

@@ -1677,6 +1677,7 @@
     <string name="_adm_stg_cpt_option_sys_logs_storage_default"><![CDATA[Система логирования по умолчанию]]></string>
     <string name="_adm_stg_cpt_option_sys_vote_reactions_quick_mode"><![CDATA[Включить режим 'Быстрых реакций' - голосовать при клике, используя реакцию по умолчанию]]></string>
     <string name="_adm_stg_cpt_option_sys_cmts_enable_auto_approve"><![CDATA[Автоматически активировать комментарий после создания]]></string>
+    <string name="_adm_stg_cpt_option_sys_create_post_form_preloading_list"><![CDATA[Предварительно загружать формы в асинхронном режиме в "Создать пост" блоках]]></string>
     <string name="_adm_stg_cpt_option_sys_a2a_enable"><![CDATA[Использовать Add2Any код вместо стандартного меню "Поделиться"]]></string>
     <string name="_adm_stg_cpt_option_sys_a2a_code"><![CDATA[Add2Any код]]></string>
     <string name="_adm_stg_cpt_type_system"><![CDATA[Система]]></string>

+ 51 - 10
template/scripts/BxBaseServices.php

@@ -611,10 +611,10 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
             $mixedContextId = (int)(!empty($mixedContextId) ? -$mixedContextId : $oProfile->id());
 
     	$oMenu = BxDolMenu::getObjectInstance('sys_create_post');
-        $oMenu->setContextId($mixedContextId);
         if(!$oMenu)
             return '';
 
+        $oMenu->setContextId($mixedContextId);
     	$aMenuItems = $oMenu->getMenuItems();
     	if(empty($aMenuItems) || !is_array($aMenuItems))
             return '';
@@ -633,30 +633,71 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
         $sTitle = _t('_sys_page_block_title_create_post' . (!$bContext ? '_public' : ($mixedContextId < 0 ? '_context' : '')));
         $sPlaceholder = _t('_sys_txt_create_post_placeholder', $oProfile->getDisplayName());
 
+        $oDbModules = BxDolModuleQuery::getInstance();
     	$oTemplate = BxDolTemplate::getInstance();
-    	$oTemplate->addJs(array('BxDolCreatePost.js'));
+    	$oTemplate->addJs(['BxDolCreatePost.js']);
+
+        $aPreloadingList = [];
+        $aModules = explode(',', getParam('sys_create_post_form_preloading_list'));
+        if(!empty($aModules))
+            foreach($aModules as $sModule) {
+                $aModule = $oDbModules->getModuleByName($sModule);
+                if(empty($aModule) || !is_array($aModule))
+                    continue;
+
+                $aPreloadingList[$sModule] = $aModule['uri'];
+            }
 
     	$sJsObject = 'oBxDolCreatePost';
-        $sJsContent = $oTemplate->_wrapInTagJsCode("var " . $sJsObject . " = new BxDolCreatePost(" . json_encode(array(
+        $sJsContent = $oTemplate->_wrapInTagJsCode("var " . $sJsObject . " = new BxDolCreatePost(" . json_encode([
             'sObjName' => $sJsObject,
             'sRootUrl' => BX_DOL_URL_ROOT,
             'sDefault' => $sDefault,
             'iContextId' => $bContext ? $mixedContextId : 0,
+            'oPreloadingList' => $aPreloadingList,
             'oCustom' => $aCustom
-        )) . ");");
+        ]) . ");");
 
-    	return array(
+    	return [
             'title' => $sTitle,
-            'content' => BxDolTemplate::getInstance()->parseHtmlByName('create_post_form.html', array(
+            'content' => $oTemplate->parseHtmlByName('create_post_form.html', [
                 'default' => $sDefault,
                 'placeholder' => $sPlaceholder,
-                'user_thumb' => $oProfile->getUnit(0, array('template' => 'unit_wo_info_links')),
-                'form' => BxDolService::call($sDefault, 'get_create_post_form', array(array('context_id' => $mixedContextId, 'ajax_mode' => true, 'absolute_action_url' => true, 'custom' => $aCustom))),
+                'user_thumb' => $oProfile->getUnit(0, ['template' => 'unit_wo_info_links']),
+                'form' => bx_srv($sDefault, 'get_create_post_form', [[
+                    'context_id' => $mixedContextId, 
+                    'ajax_mode' => true, 
+                    'absolute_action_url' => true, 
+                    'custom' => $aCustom
+                ]]),
                 'js_object' => $sJsObject,
                 'js_content' => $sJsContent
-            )),
+            ]),
             'menu' => $oMenu
-        );
+        ];
+    }
+
+    public function serviceGetOptionsCreatePostFormPreloadingList()
+    {
+        $oMenu = BxDolMenu::getObjectInstance('sys_create_post');
+        if(!$oMenu)
+            return [];
+
+        $aMenuItems = $oMenu->getMenuItems();
+
+        $aResult = [];
+        foreach($aMenuItems as $aMenuItem) {
+            $sModule = !empty($aMenuItem['module']) ? $aMenuItem['module'] : $aMenuItem['name'];
+            if(!bx_srv('system', 'is_module_enabled', [$sModule]))
+                continue;
+
+            $aResult[] = [
+                'key' => $sModule, 
+                'value' => _t('_' . $sModule)
+            ];
+        }
+
+        return $aResult;
     }
 
     public function serviceGetBlockAuthor($sModule, $iContentId = 0)