Przeglądaj źródła

Ticket #4558 - Build-in API support: Custom config for menus and pages.

AntonLV 1 rok temu
rodzic
commit
d8f88ca7bc

+ 5 - 1
install/sql/system.sql

@@ -4687,6 +4687,7 @@ CREATE TABLE IF NOT EXISTS `sys_objects_menu` (
   `set_name` varchar(64) NOT NULL,
   `set_name` varchar(64) NOT NULL,
   `module` varchar(32) NOT NULL,
   `module` varchar(32) NOT NULL,
   `template_id` int(11) NOT NULL,
   `template_id` int(11) NOT NULL,
+  `config_api` text NOT NULL,
   `persistent` tinyint(4) NOT NULL DEFAULT '0',
   `persistent` tinyint(4) NOT NULL DEFAULT '0',
   `deletable` tinyint(4) NOT NULL DEFAULT '1',
   `deletable` tinyint(4) NOT NULL DEFAULT '1',
   `active` tinyint(4) NOT NULL DEFAULT '0',
   `active` tinyint(4) NOT NULL DEFAULT '0',
@@ -4806,7 +4807,8 @@ CREATE TABLE IF NOT EXISTS `sys_menu_items` (
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
   `hidden_on_cxt` varchar(255) NOT NULL DEFAULT '',
   `hidden_on_cxt` varchar(255) NOT NULL DEFAULT '',
   `hidden_on_pt` int(11) NOT NULL DEFAULT '0',
   `hidden_on_pt` int(11) NOT NULL DEFAULT '0',
-  `hidden_on_col` int(11) NOT NULL DEFAULT '0',    
+  `hidden_on_col` int(11) NOT NULL DEFAULT '0',
+  `config_api` text NOT NULL,
   `primary` tinyint(4) NOT NULL DEFAULT '0',
   `primary` tinyint(4) NOT NULL DEFAULT '0',
   `collapsed` tinyint(4) NOT NULL DEFAULT '0',
   `collapsed` tinyint(4) NOT NULL DEFAULT '0',
   `active` tinyint(4) NOT NULL DEFAULT '1',
   `active` tinyint(4) NOT NULL DEFAULT '1',
@@ -5861,6 +5863,7 @@ CREATE TABLE IF NOT EXISTS `sys_objects_page` (
   `cache_editable` tinyint(4) NOT NULL DEFAULT '1',
   `cache_editable` tinyint(4) NOT NULL DEFAULT '1',
   `inj_head` text NOT NULL,
   `inj_head` text NOT NULL,
   `inj_footer` text NOT NULL,
   `inj_footer` text NOT NULL,
+  `config_api` text NOT NULL,
   `deletable` tinyint(1) NOT NULL,
   `deletable` tinyint(1) NOT NULL,
   `override_class_name` varchar(255) NOT NULL,
   `override_class_name` varchar(255) NOT NULL,
   `override_class_file` varchar(255) NOT NULL,
   `override_class_file` varchar(255) NOT NULL,
@@ -6025,6 +6028,7 @@ CREATE TABLE IF NOT EXISTS `sys_pages_blocks` (
   `text_updated` int(11) NOT NULL,
   `text_updated` int(11) NOT NULL,
   `help` varchar(255) NOT NULL,
   `help` varchar(255) NOT NULL,
   `cache_lifetime` int(11) NOT NULL DEFAULT '0',
   `cache_lifetime` int(11) NOT NULL DEFAULT '0',
+  `config_api` text NOT NULL,
   `deletable` tinyint(4) NOT NULL DEFAULT '1',
   `deletable` tinyint(4) NOT NULL DEFAULT '1',
   `copyable` tinyint(4) NOT NULL DEFAULT '1',
   `copyable` tinyint(4) NOT NULL DEFAULT '1',
   `active` tinyint(4) NOT NULL DEFAULT '1',
   `active` tinyint(4) NOT NULL DEFAULT '1',

+ 24 - 0
modules/boonex/developer/classes/BxDevBuilderPage.php

@@ -239,6 +239,21 @@ class BxDevBuilderPage extends BxTemplStudioBuilderPage
         );
         );
         unset($aForm['inputs']['url']['attrs']['disabled']);
         unset($aForm['inputs']['url']['attrs']['disabled']);
 
 
+        $aConfigApi = array(
+            'config_api'  => array(
+                'type' => 'textarea',
+                'name' => 'config_api',
+                'caption' => _t('_bx_dev_bp_txt_page_config_api'),
+                'info' => '',
+                'value' => $this->aPageRebuild['config_api'],
+                'required' => '',
+                'db' => array (
+                    'pass' => 'XssHtml',
+                ),
+            )
+        );
+        $aForm['inputs'] = bx_array_insert_before($aConfigApi, $aForm['inputs'], 'sticky_columns');
+
         $aForm['inputs']['deletable'] = array(
         $aForm['inputs']['deletable'] = array(
             'type' => 'switcher',
             'type' => 'switcher',
             'name' => 'deletable',
             'name' => 'deletable',
@@ -437,12 +452,21 @@ class BxDevBuilderPage extends BxTemplStudioBuilderPage
         $aBlock['designbox_id'] = $this->sSelectKeyPrefix . $aBlock['designbox_id'];
         $aBlock['designbox_id'] = $this->sSelectKeyPrefix . $aBlock['designbox_id'];
     }
     }
 
 
+    protected function onSavePage(&$oForm, &$aPage) 
+    {
+        if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
+            BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
+    }
+
     protected function onSaveBlock(&$oForm, &$aBlock)
     protected function onSaveBlock(&$oForm, &$aBlock)
     {
     {
         parent::onSaveBlock($oForm, $aBlock);
         parent::onSaveBlock($oForm, $aBlock);
 
 
         if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE && isset($oForm->aInputs['content']))
         if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE && isset($oForm->aInputs['content']))
             $this->onSaveBlockService($oForm, $aBlock);
             $this->onSaveBlockService($oForm, $aBlock);
+
+        if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
+            BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
     }
     }
 
 
     protected function onSaveBlockLang(&$oForm, &$aBlock)
     protected function onSaveBlockLang(&$oForm, &$aBlock)

+ 8 - 0
modules/boonex/developer/classes/BxDevModule.php

@@ -267,6 +267,14 @@ class BxDevModule extends BxDolModule
         ];
         ];
     }
     }
 
 
+    public function isValidJson($s)
+    {
+        //--- Validation is disabled for now.         
+        //--- return json_decode($s, true) !== null;
+
+        return true;
+    }
+
     /**
     /**
      * 
      * 
      * Methods for Export/Import feature.
      * Methods for Export/Import feature.

+ 11 - 1
modules/boonex/developer/classes/BxDevNavigationItems.php

@@ -46,6 +46,8 @@ class BxDevNavigationItems extends BxTemplStudioNavigationItems
 
 
         $oForm->initChecker();
         $oForm->initChecker();
         if($oForm->isSubmittedAndValid()) {
         if($oForm->isSubmittedAndValid()) {
+            $this->onSave($oForm);
+
             if(($iId = (int)$oForm->insert()) != 0)
             if(($iId = (int)$oForm->insert()) != 0)
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
             else
             else
@@ -89,6 +91,8 @@ class BxDevNavigationItems extends BxTemplStudioNavigationItems
             $this->_prepareServiceSave('addon', $oForm);
             $this->_prepareServiceSave('addon', $oForm);
             $this->_prepareServiceSave('visibility_custom', $oForm);
             $this->_prepareServiceSave('visibility_custom', $oForm);
 
 
+            $this->onSave($oForm, $aItem);
+
             if($oForm->update($aItem['id']) !== false)
             if($oForm->update($aItem['id']) !== false)
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aItem['id']);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aItem['id']);
             else
             else
@@ -132,11 +136,17 @@ class BxDevNavigationItems extends BxTemplStudioNavigationItems
     	return true;
     	return true;
     }
     }
 
 
-	protected function _isDeletable(&$aRow)
+    protected function _isDeletable(&$aRow)
     {
     {
     	return true;
     	return true;
     }
     }
 
 
+    protected function onSave(&$oForm, &$aItem) 
+    {
+        if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
+            BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
+    }
+
     private function fillInSelects(&$aInputs)
     private function fillInSelects(&$aInputs)
     {
     {
         $aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_module')), BxDolStudioUtils::getModules());
         $aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_module')), BxDolStudioUtils::getModules());

+ 10 - 0
modules/boonex/developer/classes/BxDevNavigationMenus.php

@@ -43,6 +43,8 @@ class BxDevNavigationMenus extends BxTemplStudioNavigationMenus
             $sObject = uriGenerate($oForm->getCleanValue('object'), 'sys_objects_menu', 'object', ['empty' => 'object']);
             $sObject = uriGenerate($oForm->getCleanValue('object'), 'sys_objects_menu', 'object', ['empty' => 'object']);
             BxDolForm::setSubmittedValue('object', $sObject, $oForm->aFormAttrs['method']);
             BxDolForm::setSubmittedValue('object', $sObject, $oForm->aFormAttrs['method']);
 
 
+            $this->onSave($oForm);
+
             if(($iId = (int)$oForm->insert()) != 0)
             if(($iId = (int)$oForm->insert()) != 0)
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
             else
             else
@@ -80,6 +82,8 @@ class BxDevNavigationMenus extends BxTemplStudioNavigationMenus
 
 
         $oForm->initChecker($aMenu);
         $oForm->initChecker($aMenu);
         if($oForm->isSubmittedAndValid()) {
         if($oForm->isSubmittedAndValid()) {
+            $this->onSave($oForm, $aMenu);
+
             if($oForm->update($aMenu['id']) !== false)
             if($oForm->update($aMenu['id']) !== false)
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aMenu['id']);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aMenu['id']);
             else
             else
@@ -222,6 +226,12 @@ class BxDevNavigationMenus extends BxTemplStudioNavigationMenus
         ]);
         ]);
     }
     }
 
 
+    protected function onSave(&$oForm, &$aMenu) 
+    {
+        if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
+            BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
+    }
+
     private function fillInSelects(&$aInputs)
     private function fillInSelects(&$aInputs)
     {
     {
         $aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_module')), BxDolStudioUtils::getModules());
         $aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_module')), BxDolStudioUtils::getModules());

+ 8 - 0
modules/boonex/developer/install/langs/en.xml

@@ -283,6 +283,8 @@
     <string name="_bx_dev_nav_txt_menus_template_id"><![CDATA[Style]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id"><![CDATA[Style]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id_select"><![CDATA[Select Style...]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id_select"><![CDATA[Select Style...]]></string>
     <string name="_bx_dev_nav_err_menus_template_id"><![CDATA[You need to select a style]]></string>
     <string name="_bx_dev_nav_err_menus_template_id"><![CDATA[You need to select a style]]></string>
+    <string name="_bx_dev_nav_txt_sys_menus_config_api"><![CDATA[Config (for App)]]></string>
+    <string name="_bx_dev_nav_txt_menus_config_api"><![CDATA[Config (for App in JSON format)]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_nav_txt_menus_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_nav_txt_menus_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_override_class_name"><![CDATA[Class Name]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_override_class_name"><![CDATA[Class Name]]></string>
@@ -373,6 +375,8 @@
     <string name="_bx_dev_nav_txt_items_hidden_on_col_full"><![CDATA[Full]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_col_full"><![CDATA[Full]]></string>
     <string name="_bx_dev_nav_txt_sys_items_hidden_on_cxt"><![CDATA[Hidden in contexts]]></string>
     <string name="_bx_dev_nav_txt_sys_items_hidden_on_cxt"><![CDATA[Hidden in contexts]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_cxt"><![CDATA[Hidden in contexts]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_cxt"><![CDATA[Hidden in contexts]]></string>
+    <string name="_bx_dev_nav_txt_sys_items_config_api"><![CDATA[Config (for App)]]></string>
+    <string name="_bx_dev_nav_txt_items_config_api"><![CDATA[Config (for App in JSON format)]]></string>
     <string name="_bx_dev_nav_txt_sys_items_primary"><![CDATA[Primary]]></string>
     <string name="_bx_dev_nav_txt_sys_items_primary"><![CDATA[Primary]]></string>
     <string name="_bx_dev_nav_txt_items_primary"><![CDATA[Primary]]></string>
     <string name="_bx_dev_nav_txt_items_primary"><![CDATA[Primary]]></string>
     <string name="_bx_dev_nav_txt_sys_items_collapsed"><![CDATA[Collapsed]]></string>
     <string name="_bx_dev_nav_txt_sys_items_collapsed"><![CDATA[Collapsed]]></string>
@@ -412,6 +416,8 @@
     <string name="_bx_dev_bp_txt_page_layout_id"><![CDATA[Layout]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id"><![CDATA[Layout]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id_select"><![CDATA[Select Layout...]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id_select"><![CDATA[Select Layout...]]></string>
     <string name="_bx_dev_bp_err_page_layout_id"><![CDATA[You need to select a layout]]></string>
     <string name="_bx_dev_bp_err_page_layout_id"><![CDATA[You need to select a layout]]></string>
+    <string name="_bx_dev_bp_txt_sys_page_config_api"><![CDATA[Config (for App)]]></string>
+    <string name="_bx_dev_bp_txt_page_config_api"><![CDATA[Config (for App in JSON format)]]></string>
     <string name="_bx_dev_bp_txt_page_cache_editable"><![CDATA[Editable]]></string>
     <string name="_bx_dev_bp_txt_page_cache_editable"><![CDATA[Editable]]></string>
     <string name="_bx_dev_bp_txt_sys_page_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_bp_txt_sys_page_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_bp_txt_page_deletable"><![CDATA[Deletable]]></string>
     <string name="_bx_dev_bp_txt_page_deletable"><![CDATA[Deletable]]></string>
@@ -451,6 +457,8 @@
     <string name="_bx_dev_bp_err_block_designbox_id"><![CDATA[You need to select a layout]]></string>
     <string name="_bx_dev_bp_err_block_designbox_id"><![CDATA[You need to select a layout]]></string>
     <string name="_bx_dev_bp_txt_sys_block_class"><![CDATA[CSS class]]></string>
     <string name="_bx_dev_bp_txt_sys_block_class"><![CDATA[CSS class]]></string>
     <string name="_bx_dev_bp_txt_block_class"><![CDATA[CSS class]]></string>
     <string name="_bx_dev_bp_txt_block_class"><![CDATA[CSS class]]></string>
+    <string name="_bx_dev_bp_txt_sys_block_config_api"><![CDATA[Config (for App)]]></string>
+    <string name="_bx_dev_bp_txt_block_config_api"><![CDATA[Config (for App in JSON format)]]></string>
     <string name="_bx_dev_bp_txt_sys_block_async"><![CDATA[Asynchronous Mode]]></string>
     <string name="_bx_dev_bp_txt_sys_block_async"><![CDATA[Asynchronous Mode]]></string>
     <string name="_bx_dev_bp_txt_block_async"><![CDATA[Asynchronous Mode]]></string>
     <string name="_bx_dev_bp_txt_block_async"><![CDATA[Asynchronous Mode]]></string>
     <string name="_bx_dev_bp_txt_sys_block_submenu"><![CDATA[Block submenu]]></string>
     <string name="_bx_dev_bp_txt_sys_block_submenu"><![CDATA[Block submenu]]></string>

+ 51 - 40
modules/boonex/developer/install/sql/install.sql

@@ -436,6 +436,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 ('bx_developer_nav_menu', @sName, 'title', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_title', '_bx_dev_nav_txt_menus_title', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_nav_err_menus_title', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'title', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_title', '_bx_dev_nav_txt_menus_title', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_nav_err_menus_title', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'set_name', '', '', 0, 'select', '_bx_dev_nav_txt_sys_menus_set_name', '_bx_dev_nav_txt_menus_set_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'set_name', '', '', 0, 'select', '_bx_dev_nav_txt_sys_menus_set_name', '_bx_dev_nav_txt_menus_set_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'template_id', '', '', 0, 'select', '_bx_dev_nav_txt_sys_menus_template_id', '_bx_dev_nav_txt_menus_template_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_menus_template_id', 'Int', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'template_id', '', '', 0, 'select', '_bx_dev_nav_txt_sys_menus_template_id', '_bx_dev_nav_txt_menus_template_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_menus_template_id', 'Int', '', 0, 0),
+('bx_developer_nav_menu', @sName, 'config_api', '', '', 0, 'textarea', '_bx_dev_nav_txt_sys_menus_config_api', '_bx_dev_nav_txt_menus_config_api', '', 0, 0, 0, '', '', '', '', '', '', 'XssHtml', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'deletable', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_menus_deletable', '_bx_dev_nav_txt_menus_deletable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'deletable', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_menus_deletable', '_bx_dev_nav_txt_menus_deletable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'override_class_name', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_override_class_name', '_bx_dev_nav_txt_menus_override_class_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'override_class_name', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_override_class_name', '_bx_dev_nav_txt_menus_override_class_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'override_class_file', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_override_class_file', '_bx_dev_nav_txt_menus_override_class_file', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_menu', @sName, 'override_class_file', '', '', 0, 'text', '_bx_dev_nav_txt_sys_menus_override_class_file', '_bx_dev_nav_txt_menus_override_class_file', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
@@ -449,24 +450,27 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_developer_nav_menu_add', 'title', 2147483647, 1, 3),
 ('bx_developer_nav_menu_add', 'title', 2147483647, 1, 3),
 ('bx_developer_nav_menu_add', 'set_name', 2147483647, 1, 4),
 ('bx_developer_nav_menu_add', 'set_name', 2147483647, 1, 4),
 ('bx_developer_nav_menu_add', 'template_id', 2147483647, 1, 5),
 ('bx_developer_nav_menu_add', 'template_id', 2147483647, 1, 5),
-('bx_developer_nav_menu_add', 'deletable', 2147483647, 1, 6),
-('bx_developer_nav_menu_add', 'override_class_name', 2147483647, 1, 7),
-('bx_developer_nav_menu_add', 'override_class_file', 2147483647, 1, 8),
-('bx_developer_nav_menu_add', 'controls', 2147483647, 1, 9),
-('bx_developer_nav_menu_add', 'do_submit', 2147483647, 1, 10),
-('bx_developer_nav_menu_add', 'cancel', 2147483647, 1, 11),
+('bx_developer_nav_menu_add', 'config_api', 2147483647, 1, 6),
+('bx_developer_nav_menu_add', 'deletable', 2147483647, 1, 7),
+('bx_developer_nav_menu_add', 'override_class_name', 2147483647, 1, 8),
+('bx_developer_nav_menu_add', 'override_class_file', 2147483647, 1, 9),
+('bx_developer_nav_menu_add', 'controls', 2147483647, 1, 10),
+('bx_developer_nav_menu_add', 'do_submit', 2147483647, 1, 11),
+('bx_developer_nav_menu_add', 'cancel', 2147483647, 1, 12),
+
 ('bx_developer_nav_menu_edit', 'id', 2147483647, 1, 1),
 ('bx_developer_nav_menu_edit', 'id', 2147483647, 1, 1),
 ('bx_developer_nav_menu_edit', 'object', 2147483647, 1, 2),
 ('bx_developer_nav_menu_edit', 'object', 2147483647, 1, 2),
 ('bx_developer_nav_menu_edit', 'module', 2147483647, 1, 3),
 ('bx_developer_nav_menu_edit', 'module', 2147483647, 1, 3),
 ('bx_developer_nav_menu_edit', 'title', 2147483647, 1, 4),
 ('bx_developer_nav_menu_edit', 'title', 2147483647, 1, 4),
 ('bx_developer_nav_menu_edit', 'set_name', 2147483647, 1, 5),
 ('bx_developer_nav_menu_edit', 'set_name', 2147483647, 1, 5),
 ('bx_developer_nav_menu_edit', 'template_id', 2147483647, 1, 6),
 ('bx_developer_nav_menu_edit', 'template_id', 2147483647, 1, 6),
-('bx_developer_nav_menu_edit', 'deletable', 2147483647, 1, 7),
-('bx_developer_nav_menu_edit', 'override_class_name', 2147483647, 1, 8),
-('bx_developer_nav_menu_edit', 'override_class_file', 2147483647, 1, 9),
-('bx_developer_nav_menu_edit', 'controls', 2147483647, 1, 10),
-('bx_developer_nav_menu_edit', 'do_submit', 2147483647, 1, 11),
-('bx_developer_nav_menu_edit', 'cancel', 2147483647, 1, 12);
+('bx_developer_nav_menu_edit', 'config_api', 2147483647, 1, 7),
+('bx_developer_nav_menu_edit', 'deletable', 2147483647, 1, 8),
+('bx_developer_nav_menu_edit', 'override_class_name', 2147483647, 1, 9),
+('bx_developer_nav_menu_edit', 'override_class_file', 2147483647, 1, 10),
+('bx_developer_nav_menu_edit', 'controls', 2147483647, 1, 11),
+('bx_developer_nav_menu_edit', 'do_submit', 2147483647, 1, 12),
+('bx_developer_nav_menu_edit', 'cancel', 2147483647, 1, 13);
 
 
 --
 --
 -- Navigation Builder -> Sets.
 -- Navigation Builder -> Sets.
@@ -532,6 +536,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 ('bx_developer_nav_item', @sName, 'hidden_on_pt', '', '', 0, 'select_multiple', '_bx_dev_nav_txt_sys_items_hidden_on_pt', '_bx_dev_nav_txt_items_hidden_on_pt', '', 0, 0, 0, '', '', '', '', '', '', 'Set', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'hidden_on_pt', '', '', 0, 'select_multiple', '_bx_dev_nav_txt_sys_items_hidden_on_pt', '_bx_dev_nav_txt_items_hidden_on_pt', '', 0, 0, 0, '', '', '', '', '', '', 'Set', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'hidden_on_col', '', '', 0, 'select_multiple', '_bx_dev_nav_txt_sys_items_hidden_on_col', '_bx_dev_nav_txt_items_hidden_on_col', '', 0, 0, 0, '', '', '', '', '', '', 'Set', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'hidden_on_col', '', '', 0, 'select_multiple', '_bx_dev_nav_txt_sys_items_hidden_on_col', '_bx_dev_nav_txt_items_hidden_on_col', '', 0, 0, 0, '', '', '', '', '', '', 'Set', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'hidden_on_cxt', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_hidden_on_cxt', '_bx_dev_nav_txt_items_hidden_on_cxt', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'hidden_on_cxt', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_hidden_on_cxt', '_bx_dev_nav_txt_items_hidden_on_cxt', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_developer_nav_item', @sName, 'config_api', '', '', 0, 'textarea', '_bx_dev_nav_txt_sys_items_config_api', '_bx_dev_nav_txt_items_config_api', '', 0, 0, 0, '', '', '', '', '', '', 'XssHtml', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'primary', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_primary', '_bx_dev_nav_txt_items_primary', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'primary', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_primary', '_bx_dev_nav_txt_items_primary', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'collapsed', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_collapsed', '_bx_dev_nav_txt_items_collapsed', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'collapsed', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_collapsed', '_bx_dev_nav_txt_items_collapsed', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'copyable', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_copyable', '_bx_dev_nav_txt_items_copyable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_nav_item', @sName, 'copyable', '1', '', 0, 'switcher', '_bx_dev_nav_txt_sys_items_copyable', '_bx_dev_nav_txt_items_copyable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
@@ -558,13 +563,14 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_developer_nav_item_add', 'hidden_on_pt', 2147483647, 1, 15),
 ('bx_developer_nav_item_add', 'hidden_on_pt', 2147483647, 1, 15),
 ('bx_developer_nav_item_add', 'hidden_on_col', 2147483647, 1, 16),
 ('bx_developer_nav_item_add', 'hidden_on_col', 2147483647, 1, 16),
 ('bx_developer_nav_item_add', 'hidden_on_cxt', 2147483647, 1, 17),
 ('bx_developer_nav_item_add', 'hidden_on_cxt', 2147483647, 1, 17),
-('bx_developer_nav_item_add', 'primary', 2147483647, 1, 18),
-('bx_developer_nav_item_add', 'collapsed', 2147483647, 1, 19),
-('bx_developer_nav_item_add', 'copyable', 2147483647, 1, 20),
-('bx_developer_nav_item_add', 'active_api', 2147483647, 1, 21),
-('bx_developer_nav_item_add', 'controls', 2147483647, 1, 22),
-('bx_developer_nav_item_add', 'do_submit', 2147483647, 1, 23),
-('bx_developer_nav_item_add', 'cancel', 2147483647, 1, 24),
+('bx_developer_nav_item_add', 'config_api', 2147483647, 1, 18),
+('bx_developer_nav_item_add', 'primary', 2147483647, 1, 19),
+('bx_developer_nav_item_add', 'collapsed', 2147483647, 1, 20),
+('bx_developer_nav_item_add', 'copyable', 2147483647, 1, 21),
+('bx_developer_nav_item_add', 'active_api', 2147483647, 1, 22),
+('bx_developer_nav_item_add', 'controls', 2147483647, 1, 23),
+('bx_developer_nav_item_add', 'do_submit', 2147483647, 1, 24),
+('bx_developer_nav_item_add', 'cancel', 2147483647, 1, 25),
 
 
 ('bx_developer_nav_item_edit', 'id', 2147483647, 1, 1),
 ('bx_developer_nav_item_edit', 'id', 2147483647, 1, 1),
 ('bx_developer_nav_item_edit', 'module', 2147483647, 1, 2),
 ('bx_developer_nav_item_edit', 'module', 2147483647, 1, 2),
@@ -584,13 +590,14 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_developer_nav_item_edit', 'hidden_on_pt', 2147483647, 1, 16),
 ('bx_developer_nav_item_edit', 'hidden_on_pt', 2147483647, 1, 16),
 ('bx_developer_nav_item_edit', 'hidden_on_col', 2147483647, 1, 17),
 ('bx_developer_nav_item_edit', 'hidden_on_col', 2147483647, 1, 17),
 ('bx_developer_nav_item_edit', 'hidden_on_cxt', 2147483647, 1, 18),
 ('bx_developer_nav_item_edit', 'hidden_on_cxt', 2147483647, 1, 18),
-('bx_developer_nav_item_edit', 'primary', 2147483647, 1, 19),
-('bx_developer_nav_item_edit', 'collapsed', 2147483647, 1, 20),
-('bx_developer_nav_item_edit', 'copyable', 2147483647, 1, 21),
-('bx_developer_nav_item_edit', 'active_api', 2147483647, 1, 22),
-('bx_developer_nav_item_edit', 'controls', 2147483647, 1, 23),
-('bx_developer_nav_item_edit', 'do_submit', 2147483647, 1, 24),
-('bx_developer_nav_item_edit', 'cancel', 2147483647, 1, 25);
+('bx_developer_nav_item_edit', 'config_api', 2147483647, 1, 19),
+('bx_developer_nav_item_edit', 'primary', 2147483647, 1, 20),
+('bx_developer_nav_item_edit', 'collapsed', 2147483647, 1, 21),
+('bx_developer_nav_item_edit', 'copyable', 2147483647, 1, 22),
+('bx_developer_nav_item_edit', 'active_api', 2147483647, 1, 23),
+('bx_developer_nav_item_edit', 'controls', 2147483647, 1, 24),
+('bx_developer_nav_item_edit', 'do_submit', 2147483647, 1, 25),
+('bx_developer_nav_item_edit', 'cancel', 2147483647, 1, 26);
 
 
 --
 --
 -- Page Builder -> Page.
 -- Page Builder -> Page.
@@ -609,6 +616,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 ('bx_developer_bp_page', @sName, 'uri', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_uri', '_bx_dev_bp_txt_page_uri', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'uri', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_uri', '_bx_dev_bp_txt_page_uri', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'url', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_url', '_bx_dev_bp_txt_page_url', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'url', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_url', '_bx_dev_bp_txt_page_url', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'layout_id', '', '', 0, 'select', '_bx_dev_bp_txt_sys_page_layout_id', '_bx_dev_bp_txt_page_layout_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_bp_err_page_layout_id', 'Int', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'layout_id', '', '', 0, 'select', '_bx_dev_bp_txt_sys_page_layout_id', '_bx_dev_bp_txt_page_layout_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_bp_err_page_layout_id', 'Int', '', 0, 0),
+('bx_developer_bp_page', @sName, 'config_api', '', '', 0, 'textarea', '_bx_dev_bp_txt_sys_page_config_api', '_bx_dev_bp_txt_page_config_api', '', 0, 0, 0, '', '', '', '', '', '', 'XssHtml', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'deletable', '1', '', 0, 'switcher', '_bx_dev_bp_txt_sys_page_deletable', '_bx_dev_bp_txt_page_deletable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'deletable', '1', '', 0, 'switcher', '_bx_dev_bp_txt_sys_page_deletable', '_bx_dev_bp_txt_page_deletable', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'override_class_name', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_override_class_name', '_bx_dev_bp_txt_page_override_class_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'override_class_name', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_override_class_name', '_bx_dev_bp_txt_page_override_class_name', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'override_class_file', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_override_class_file', '_bx_dev_bp_txt_page_override_class_file', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_page', @sName, 'override_class_file', '', '', 0, 'text', '_bx_dev_bp_txt_sys_page_override_class_file', '_bx_dev_bp_txt_page_override_class_file', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
@@ -624,12 +632,13 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_developer_bp_page_add', 'uri', 2147483647, 1, 5),
 ('bx_developer_bp_page_add', 'uri', 2147483647, 1, 5),
 ('bx_developer_bp_page_add', 'url', 2147483647, 1, 6),
 ('bx_developer_bp_page_add', 'url', 2147483647, 1, 6),
 ('bx_developer_bp_page_add', 'layout_id', 2147483647, 1, 7),
 ('bx_developer_bp_page_add', 'layout_id', 2147483647, 1, 7),
-('bx_developer_bp_page_add', 'deletable', 2147483647, 1, 8),
-('bx_developer_bp_page_add', 'override_class_name', 2147483647, 1, 9),
-('bx_developer_bp_page_add', 'override_class_file', 2147483647, 1, 10),
-('bx_developer_bp_page_add', 'controls', 2147483647, 1, 11),
-('bx_developer_bp_page_add', 'do_submit', 2147483647, 1, 12),
-('bx_developer_bp_page_add', 'cancel', 2147483647, 1, 13);
+('bx_developer_bp_page_add', 'config_api', 2147483647, 1, 8),
+('bx_developer_bp_page_add', 'deletable', 2147483647, 1, 9),
+('bx_developer_bp_page_add', 'override_class_name', 2147483647, 1, 10),
+('bx_developer_bp_page_add', 'override_class_file', 2147483647, 1, 11),
+('bx_developer_bp_page_add', 'controls', 2147483647, 1, 12),
+('bx_developer_bp_page_add', 'do_submit', 2147483647, 1, 13),
+('bx_developer_bp_page_add', 'cancel', 2147483647, 1, 14);
 
 
 --
 --
 -- Page Builder -> Block.
 -- Page Builder -> Block.
@@ -648,6 +657,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 ('bx_developer_bp_block', @sName, 'title', '', '', 0, 'text', '_bx_dev_bp_txt_sys_block_title', '_bx_dev_bp_txt_block_title', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_bp_err_block_title', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'title', '', '', 0, 'text', '_bx_dev_bp_txt_sys_block_title', '_bx_dev_bp_txt_block_title', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_bp_err_block_title', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'designbox_id', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_designbox_id', '_bx_dev_bp_txt_block_designbox_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_bp_err_block_designbox_id', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'designbox_id', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_designbox_id', '_bx_dev_bp_txt_block_designbox_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_bp_err_block_designbox_id', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'class', '', '', 0, 'text', '_bx_dev_bp_txt_sys_block_class', '_bx_dev_bp_txt_block_class', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'class', '', '', 0, 'text', '_bx_dev_bp_txt_sys_block_class', '_bx_dev_bp_txt_block_class', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_developer_bp_block', @sName, 'config_api', '', '', 0, 'textarea', '_bx_dev_bp_txt_sys_block_config_api', '_bx_dev_bp_txt_block_config_api', '', 0, 0, 0, '', '', '', '', '', '', 'XssHtml', '', 0, 0),
 
 
 ('bx_developer_bp_block', @sName, 'async', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_async', '_bx_dev_bp_txt_block_async', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'async', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_async', '_bx_dev_bp_txt_block_async', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'submenu', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_submenu', '_bx_dev_bp_txt_block_submenu', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_developer_bp_block', @sName, 'submenu', '', '', 0, 'select', '_bx_dev_bp_txt_sys_block_submenu', '_bx_dev_bp_txt_block_submenu', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
@@ -679,14 +689,15 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_developer_bp_block_edit', 'visible_for', 2147483647, 1, 11),
 ('bx_developer_bp_block_edit', 'visible_for', 2147483647, 1, 11),
 ('bx_developer_bp_block_edit', 'visible_for_levels', 2147483647, 1, 12),
 ('bx_developer_bp_block_edit', 'visible_for_levels', 2147483647, 1, 12),
 ('bx_developer_bp_block_edit', 'class', 2147483647, 1, 13),
 ('bx_developer_bp_block_edit', 'class', 2147483647, 1, 13),
-('bx_developer_bp_block_edit', 'deletable', 2147483647, 1, 14),
-('bx_developer_bp_block_edit', 'copyable', 2147483647, 1, 15),
-('bx_developer_bp_block_edit', 'active', 2147483647, 1, 16),
-('bx_developer_bp_block_edit', 'active_api', 2147483647, 1, 17),
-('bx_developer_bp_block_edit', 'controls', 2147483647, 1, 18),
-('bx_developer_bp_block_edit', 'do_submit', 2147483647, 1, 19),
-('bx_developer_bp_block_edit', 'cancel', 2147483647, 1, 20),
-('bx_developer_bp_block_edit', 'delete', 2147483647, 1, 21);
+('bx_developer_bp_block_edit', 'config_api', 2147483647, 1, 14),
+('bx_developer_bp_block_edit', 'deletable', 2147483647, 1, 15),
+('bx_developer_bp_block_edit', 'copyable', 2147483647, 1, 16),
+('bx_developer_bp_block_edit', 'active', 2147483647, 1, 17),
+('bx_developer_bp_block_edit', 'active_api', 2147483647, 1, 18),
+('bx_developer_bp_block_edit', 'controls', 2147483647, 1, 19),
+('bx_developer_bp_block_edit', 'do_submit', 2147483647, 1, 20),
+('bx_developer_bp_block_edit', 'cancel', 2147483647, 1, 21),
+('bx_developer_bp_block_edit', 'delete', 2147483647, 1, 22);
 
 
 --
 --
 -- Polyglot -> Grid descriptors
 -- Polyglot -> Grid descriptors

+ 8 - 0
modules/boonex/russian/data/langs/bx_developer/ru.xml

@@ -283,6 +283,8 @@
     <string name="_bx_dev_nav_txt_menus_template_id"><![CDATA[Стиль]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id"><![CDATA[Стиль]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id_select"><![CDATA[Выбрать стиль...]]></string>
     <string name="_bx_dev_nav_txt_menus_template_id_select"><![CDATA[Выбрать стиль...]]></string>
     <string name="_bx_dev_nav_err_menus_template_id"><![CDATA[Нужно выбрать стиль]]></string>
     <string name="_bx_dev_nav_err_menus_template_id"><![CDATA[Нужно выбрать стиль]]></string>
+    <string name="_bx_dev_nav_txt_sys_menus_config_api"><![CDATA[Конфигурация (для приложения)]]></string>
+    <string name="_bx_dev_nav_txt_menus_config_api"><![CDATA[Конфигурация (для приложения в формате JSON)]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_nav_txt_menus_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_nav_txt_menus_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_override_class_name"><![CDATA[Имя класса]]></string>
     <string name="_bx_dev_nav_txt_sys_menus_override_class_name"><![CDATA[Имя класса]]></string>
@@ -373,6 +375,8 @@
     <string name="_bx_dev_nav_txt_items_hidden_on_col_full"><![CDATA[Полная]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_col_full"><![CDATA[Полная]]></string>
     <string name="_bx_dev_nav_txt_sys_items_hidden_on_cxt"><![CDATA[Скрыть в контекстах]]></string>
     <string name="_bx_dev_nav_txt_sys_items_hidden_on_cxt"><![CDATA[Скрыть в контекстах]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_cxt"><![CDATA[Скрыть в контекстах]]></string>
     <string name="_bx_dev_nav_txt_items_hidden_on_cxt"><![CDATA[Скрыть в контекстах]]></string>
+    <string name="_bx_dev_nav_txt_sys_items_config_api"><![CDATA[Конфигурация (для приложения)]]></string>
+    <string name="_bx_dev_nav_txt_items_config_api"><![CDATA[Конфигурация (для приложения в формате JSON)]]></string>
     <string name="_bx_dev_nav_txt_sys_items_primary"><![CDATA[Основной]]></string>
     <string name="_bx_dev_nav_txt_sys_items_primary"><![CDATA[Основной]]></string>
     <string name="_bx_dev_nav_txt_items_primary"><![CDATA[Основной]]></string>
     <string name="_bx_dev_nav_txt_items_primary"><![CDATA[Основной]]></string>
     <string name="_bx_dev_nav_txt_sys_items_collapsed"><![CDATA[Свёрнутый]]></string>
     <string name="_bx_dev_nav_txt_sys_items_collapsed"><![CDATA[Свёрнутый]]></string>
@@ -412,6 +416,8 @@
     <string name="_bx_dev_bp_txt_page_layout_id"><![CDATA[Дизайн]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id"><![CDATA[Дизайн]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id_select"><![CDATA[Выбрать дизайн...]]></string>
     <string name="_bx_dev_bp_txt_page_layout_id_select"><![CDATA[Выбрать дизайн...]]></string>
     <string name="_bx_dev_bp_err_page_layout_id"><![CDATA[Нужно выбрать дизайн]]></string>
     <string name="_bx_dev_bp_err_page_layout_id"><![CDATA[Нужно выбрать дизайн]]></string>
+    <string name="_bx_dev_bp_txt_sys_page_config_api"><![CDATA[Конфигурация (для приложения)]]></string>
+    <string name="_bx_dev_bp_txt_page_config_api"><![CDATA[Конфигурация (для приложения в формате JSON)]]></string>
     <string name="_bx_dev_bp_txt_page_cache_editable"><![CDATA[Можно редактировать]]></string>
     <string name="_bx_dev_bp_txt_page_cache_editable"><![CDATA[Можно редактировать]]></string>
     <string name="_bx_dev_bp_txt_sys_page_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_bp_txt_sys_page_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_bp_txt_page_deletable"><![CDATA[Можно удалять]]></string>
     <string name="_bx_dev_bp_txt_page_deletable"><![CDATA[Можно удалять]]></string>
@@ -451,6 +457,8 @@
     <string name="_bx_dev_bp_err_block_designbox_id"><![CDATA[Нужно выбрать дизайн]]></string>
     <string name="_bx_dev_bp_err_block_designbox_id"><![CDATA[Нужно выбрать дизайн]]></string>
     <string name="_bx_dev_bp_txt_sys_block_class"><![CDATA[CSS класс]]></string>
     <string name="_bx_dev_bp_txt_sys_block_class"><![CDATA[CSS класс]]></string>
     <string name="_bx_dev_bp_txt_block_class"><![CDATA[CSS класс]]></string>
     <string name="_bx_dev_bp_txt_block_class"><![CDATA[CSS класс]]></string>
+    <string name="_bx_dev_bp_txt_sys_block_config_api"><![CDATA[Конфигурация (для приложения)]]></string>
+    <string name="_bx_dev_bp_txt_block_config_api"><![CDATA[Конфигурация (для приложения в формате JSON)]]></string>
     <string name="_bx_dev_bp_txt_sys_block_async"><![CDATA[Асинхронный режим]]></string>
     <string name="_bx_dev_bp_txt_sys_block_async"><![CDATA[Асинхронный режим]]></string>
     <string name="_bx_dev_bp_txt_block_async"><![CDATA[Асинхронный режим]]></string>
     <string name="_bx_dev_bp_txt_block_async"><![CDATA[Асинхронный режим]]></string>
     <string name="_bx_dev_bp_txt_sys_block_submenu"><![CDATA[Подменю блока]]></string>
     <string name="_bx_dev_bp_txt_sys_block_submenu"><![CDATA[Подменю блока]]></string>

+ 3 - 0
studio/classes/BxDolStudioBuilderPage.php

@@ -101,6 +101,9 @@ class BxDolStudioBuilderPage extends BxTemplStudioWidget
             return array('code' => 1, 'message' => _t('_adm_bp_err_cannot_process_action'));
             return array('code' => 1, 'message' => _t('_adm_bp_err_cannot_process_action'));
     }
     }
 
 
+    protected function onSavePage(&$oForm, &$aPage) 
+    {}
+
     protected function onSaveBlock(&$oForm, &$aBlock)
     protected function onSaveBlock(&$oForm, &$aBlock)
     {
     {
         $iDesignboxId = (int)str_replace($this->sSelectKeyPrefix, '', $oForm->getCleanValue('designbox_id'));
         $iDesignboxId = (int)str_replace($this->sSelectKeyPrefix, '', $oForm->getCleanValue('designbox_id'));

+ 2 - 0
studio/classes/BxDolStudioBuilderPageQuery.php

@@ -83,6 +83,7 @@ class BxDolStudioBuilderPageQuery extends BxDolStudioPageQuery
             `tp`.`inj_head` AS `inj_head`,
             `tp`.`inj_head` AS `inj_head`,
             `tp`.`inj_footer` AS `inj_footer`,
             `tp`.`inj_footer` AS `inj_footer`,
             `tp`.`sticky_columns` AS `sticky_columns`,
             `tp`.`sticky_columns` AS `sticky_columns`,
+            `tp`.`config_api` AS `config_api`,
             `tp`.`deletable` AS `deletable`,
             `tp`.`deletable` AS `deletable`,
             `tp`.`override_class_name` AS `override_class_name`,
             `tp`.`override_class_name` AS `override_class_name`,
             `tp`.`override_class_file` AS `override_class_file`";
             `tp`.`override_class_file` AS `override_class_file`";
@@ -388,6 +389,7 @@ class BxDolStudioBuilderPageQuery extends BxDolStudioPageQuery
             `tpb`.`content` AS `content`,
             `tpb`.`content` AS `content`,
             `tpb`.`content_empty` AS `content_empty`,
             `tpb`.`content_empty` AS `content_empty`,
             `tpb`.`help` AS `help`,
             `tpb`.`help` AS `help`,
+            `tpb`.`config_api` AS `config_api`,
             `tpb`.`deletable` AS `deletable`,
             `tpb`.`deletable` AS `deletable`,
             `tpb`.`copyable` AS `copyable`,
             `tpb`.`copyable` AS `copyable`,
             `tpb`.`active` AS `active`,
             `tpb`.`active` AS `active`,

+ 6 - 4
studio/classes/BxDolStudioNavigationQuery.php

@@ -24,6 +24,7 @@ class BxDolStudioNavigationQuery extends BxDolDb
             `tm`.`set_name` AS `set_name`,
             `tm`.`set_name` AS `set_name`,
             `tm`.`module` AS `module`,
             `tm`.`module` AS `module`,
             `tm`.`template_id` AS `template_id`,
             `tm`.`template_id` AS `template_id`,
+            `tm`.`config_api` AS `config_api`,
             `tm`.`persistent` AS `persistent`,
             `tm`.`persistent` AS `persistent`,
             `tm`.`deletable` AS `deletable`,
             `tm`.`deletable` AS `deletable`,
             `tm`.`active` AS `active`,
             `tm`.`active` AS `active`,
@@ -282,16 +283,17 @@ class BxDolStudioNavigationQuery extends BxDolDb
             `tmi`.`submenu_popup` AS `submenu_popup`,
             `tmi`.`submenu_popup` AS `submenu_popup`,
             `tmi`.`visible_for_levels` AS `visible_for_levels`,
             `tmi`.`visible_for_levels` AS `visible_for_levels`,
             `tmi`.`visibility_custom` AS `visibility_custom`,
             `tmi`.`visibility_custom` AS `visibility_custom`,
+            `tmi`.`hidden_on` AS `hidden_on`,
+            `tmi`.`hidden_on_cxt` AS `hidden_on_cxt`,
+            `tmi`.`hidden_on_pt` AS `hidden_on_pt`,
+            `tmi`.`hidden_on_col` AS `hidden_on_col`,
+            `tmi`.`config_api` AS `config_api`,
             `tmi`.`primary` AS `primary`,
             `tmi`.`primary` AS `primary`,
             `tmi`.`collapsed` AS `collapsed`,
             `tmi`.`collapsed` AS `collapsed`,
             `tmi`.`active` AS `active`,
             `tmi`.`active` AS `active`,
             `tmi`.`active_api` AS `active_api`,
             `tmi`.`active_api` AS `active_api`,
             `tmi`.`copyable` AS `copyable`,
             `tmi`.`copyable` AS `copyable`,
             `tmi`.`editable` AS `editable`,
             `tmi`.`editable` AS `editable`,
-            `tmi`.`hidden_on` AS `hidden_on`,
-            `tmi`.`hidden_on_cxt` AS `hidden_on_cxt`,
-            `tmi`.`hidden_on_pt` AS `hidden_on_pt`,
-            `tmi`.`hidden_on_col` AS `hidden_on_col`,
             `tmi`.`order` AS `order`";
             `tmi`.`order` AS `order`";
         $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
         $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
 
 

+ 4 - 0
studio/template/scripts/BxBaseStudioBuilderPage.php

@@ -341,6 +341,8 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
             BxDolForm::setSubmittedValue('visible_for_levels', $iVisibleFor, $aForm['form_attrs']['method']);
             BxDolForm::setSubmittedValue('visible_for_levels', $iVisibleFor, $aForm['form_attrs']['method']);
             unset($oForm->aInputs['visible_for']);
             unset($oForm->aInputs['visible_for']);
 
 
+            $this->onSavePage($oForm);
+
             $iId = (int)$oForm->insert(array('author' => bx_get_logged_profile_id(), 'added' => time(), 'object' => $sObject, 'url' => $this->sPageBaseUrl . $sUri));
             $iId = (int)$oForm->insert(array('author' => bx_get_logged_profile_id(), 'added' => time(), 'object' => $sObject, 'url' => $this->sPageBaseUrl . $sUri));
             if($iId != 0)
             if($iId != 0)
                 return array('eval' => $sJsObject . '.onCreatePage(\'' . $sModule . '\', \'' . $sObject . '\')');
                 return array('eval' => $sJsObject . '.onCreatePage(\'' . $sModule . '\', \'' . $sObject . '\')');
@@ -402,6 +404,8 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
                 unset($oForm->aInputs['visible_for']);
                 unset($oForm->aInputs['visible_for']);
             }
             }
 
 
+            $this->onSavePage($oForm, $this->aPageRebuild);
+
             if($oForm->update($this->aPageRebuild['id'])) {
             if($oForm->update($this->aPageRebuild['id'])) {
                 $iLevelId = $oForm->getCleanValue('layout_id');
                 $iLevelId = $oForm->getCleanValue('layout_id');
                 if(!empty($iLevelId) && $iLevelId != $this->aPageRebuild['layout_id']) {
                 if(!empty($iLevelId) && $iLevelId != $this->aPageRebuild['layout_id']) {

+ 2 - 0
template/scripts/BxBaseMenu.php

@@ -85,6 +85,7 @@ class BxBaseMenu extends BxDolMenu
 
 
         return [
         return [
             'object' => $this->_sObject, 
             'object' => $this->_sObject, 
+            'config' => $this->_aObject['config_api'],
             'persistent' => $this->_aObject['persistent'],
             'persistent' => $this->_aObject['persistent'],
             'params' => $this->getContentParams(),
             'params' => $this->getContentParams(),
             'items' => $aItems
             'items' => $aItems
@@ -204,6 +205,7 @@ class BxBaseMenu extends BxDolMenu
                 'image' => $sIconUrl ? $sIconUrl : '',
                 'image' => $sIconUrl ? $sIconUrl : '',
                 'submenu' => !empty($a['submenu_object']) ? $a['submenu_object'] : '',
                 'submenu' => !empty($a['submenu_object']) ? $a['submenu_object'] : '',
                 'addon' => $this->_bDisplayAddons ? $this->_getMenuAddon($a) : '',
                 'addon' => $this->_bDisplayAddons ? $this->_getMenuAddon($a) : '',
+                'config' => $a['config_api'],
                 'primary' => isset($a['primary']) ? $a['primary'] : 0,
                 'primary' => isset($a['primary']) ? $a['primary'] : 0,
             ];
             ];
 
 

+ 1 - 0
template/scripts/BxBasePage.php

@@ -538,6 +538,7 @@ class BxBasePage extends BxDolPage
             'menu' => '',
             'menu' => '',
             'menu_bottom' => '',
             'menu_bottom' => '',
             'menu_add' => '',
             'menu_add' => '',
+            'config' => $this->_aObject['config_api'],
             'elements' => $this->getPageBlocksAPI($aBlocks),
             'elements' => $this->getPageBlocksAPI($aBlocks),
         ];
         ];