Преглед изворни кода

Ticket #4148 - Build-in API support: Menu Items / Page Blocks visibility and related changes.

AntonLV пре 3 година
родитељ
комит
20563c6cb7

+ 1 - 1
inc/classes/BxDolMenu.php

@@ -403,7 +403,7 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
      */
     protected function _isVisible ($a)
     {
-        if($this->_bIsApi && isset($a['hidden_on']) && ((1 << 3) & (int)$a['hidden_on']))
+        if($this->_bIsApi && (int)$a['active_api'] == 0)
             return false;
 
         if(isset($a['visible_for_levels']) && !BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']))

+ 2 - 0
install/sql/system.sql

@@ -4553,6 +4553,7 @@ CREATE TABLE IF NOT EXISTS `sys_menu_items` (
   `primary` tinyint(4) NOT NULL DEFAULT '0',
   `collapsed` tinyint(4) NOT NULL DEFAULT '0',
   `active` tinyint(4) NOT NULL DEFAULT '1',
+  `active_api` tinyint(4) NOT NULL DEFAULT '0',
   `copyable` tinyint(4) NOT NULL DEFAULT '1',
   `editable` tinyint(4) NOT NULL DEFAULT '1',
   `order` int(11) NOT NULL,
@@ -5607,6 +5608,7 @@ CREATE TABLE IF NOT EXISTS `sys_pages_blocks` (
   `deletable` tinyint(4) NOT NULL DEFAULT '1',
   `copyable` tinyint(4) NOT NULL DEFAULT '1',
   `active` tinyint(4) NOT NULL DEFAULT '1',
+  `active_api` tinyint(4) NOT NULL DEFAULT '0',
   `order` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `object` (`object`),

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

@@ -532,6 +532,7 @@
 	<string name="_adm_bp_mi_page_visibility"><![CDATA[Visibility]]></string>
 	<string name="_adm_bp_scs_save"><![CDATA[The changes were successfully saved]]></string>
 	<string name="_adm_bp_txt_block_active"><![CDATA[Active]]></string>
+        <string name="_adm_bp_txt_block_active_api"><![CDATA[Active (for App)]]></string>
 	<string name="_adm_bp_txt_block_async"><![CDATA[Asynchronous Mode]]></string>
 	<string name="_adm_bp_txt_block_cache_lifetime"><![CDATA[Block Cache Lifetime (in seconds)]]></string>
 	<string name="_adm_bp_txt_block_content_attachments_html"><![CDATA[Attachments]]></string>
@@ -1225,6 +1226,7 @@
         <string name="_adm_nav_txt_items_parent_id"><![CDATA[Parent Item]]></string>
         <string name="_adm_nav_txt_items_parent_id_empty"><![CDATA[No Parent Item]]></string>
         <string name="_adm_nav_txt_items_primary"><![CDATA[Primary]]></string>
+        <string name="_adm_nav_txt_items_active_api"><![CDATA[Active (for App)]]></string>
 	<string name="_adm_nav_txt_items_show_to_popup"><![CDATA[Show "{0}" menu item to: ]]></string>
 	<string name="_adm_nav_txt_items_submenu"><![CDATA[Submenu]]></string>
 	<string name="_adm_nav_txt_items_submenu_empty"><![CDATA[No Submenu]]></string>
@@ -1810,6 +1812,7 @@
 	<string name="_adm_tmi_cpt_site"><![CDATA[Go To Site]]></string>
 	<string name="_adm_tmi_cpt_tour"><![CDATA[Tour]]></string>
 	<string name="_adm_tmi_cpt_launcher"><![CDATA[Launcher]]></string>
+        <string name="_adm_txt_active_api"><![CDATA[Available in App]]></string>
 	<string name="_adm_txt_confirm_cancel"><![CDATA[Cancel]]></string>
 	<string name="_adm_txt_confirm_ok"><![CDATA[OK]]></string>
 	<string name="_adm_txt_forgot_password"><![CDATA[Forgot password?]]></string>

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

@@ -532,6 +532,7 @@
 	<string name="_adm_bp_mi_page_visibility"><![CDATA[Видимость]]></string>
 	<string name="_adm_bp_scs_save"><![CDATA[Изменения успешно сохранены]]></string>
 	<string name="_adm_bp_txt_block_active"><![CDATA[Активный]]></string>
+        <string name="_adm_bp_txt_block_active_api"><![CDATA[Активный (для приложения)]]></string>
         <string name="_adm_bp_txt_block_async"><![CDATA[Асинхронный режим]]></string>
         <string name="_adm_bp_txt_block_cache_lifetime"><![CDATA[Кэш для блока (в секундах)]]></string>
 	<string name="_adm_bp_txt_block_content_attachments_html"><![CDATA[Вложения]]></string>
@@ -1209,6 +1210,7 @@
         <string name="_adm_nav_txt_items_parent_id"><![CDATA[Родительский пункт]]></string>
         <string name="_adm_nav_txt_items_parent_id_empty"><![CDATA[Нет родительского пункта]]></string>
         <string name="_adm_nav_txt_items_primary"><![CDATA[Основная]]></string>
+        <string name="_adm_nav_txt_items_active_api"><![CDATA[Активный (для приложения)]]></string>
 	<string name="_adm_nav_txt_items_show_to_popup"><![CDATA[Отображать "{0}" элемент меню для: ]]></string>
 	<string name="_adm_nav_txt_items_submenu"><![CDATA[Подменю]]></string>
 	<string name="_adm_nav_txt_items_submenu_empty"><![CDATA[Без подменю]]></string>
@@ -1788,6 +1790,7 @@
 	<string name="_adm_tmi_cpt_site"><![CDATA[Перейти на сайт]]></string>
 	<string name="_adm_tmi_cpt_tour"><![CDATA[Инструкции]]></string>
 	<string name="_adm_tmi_cpt_launcher"><![CDATA[Загрузчик]]></string>
+        <string name="_adm_txt_active_api"><![CDATA[Доступно в приложении]]></string>
 	<string name="_adm_txt_confirm_cancel"><![CDATA[Отменить]]></string>
 	<string name="_adm_txt_confirm_ok"><![CDATA[OK]]></string>
 	<string name="_adm_txt_forgot_password"><![CDATA[Забыли пароль?]]></string>

+ 1 - 0
studio/classes/BxDolStudioBuilderPageQuery.php

@@ -431,6 +431,7 @@ class BxDolStudioBuilderPageQuery extends BxDolStudioPageQuery
                 `tpb`.`deletable` AS `deletable`,
                 `tpb`.`copyable` AS `copyable`,
                 `tpb`.`active` AS `active`,
+                `tpb`.`active_api` AS `active_api`,
                 `tpb`.`order` AS `order`" . $sSelectClause . "
             FROM `sys_pages_blocks` AS `tpb` " . $sJoinClause . "
             WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;

+ 1 - 0
studio/classes/BxDolStudioNavigationQuery.php

@@ -285,6 +285,7 @@ class BxDolStudioNavigationQuery extends BxDolDb
                 `tmi`.`primary` AS `primary`,
                 `tmi`.`collapsed` AS `collapsed`,
                 `tmi`.`active` AS `active`,
+                `tmi`.`active_api` AS `active_api`,
                 `tmi`.`copyable` AS `copyable`,
                 `tmi`.`editable` AS `editable`,
                 `tmi`.`hidden_on` AS `hidden_on`,

+ 3 - 0
studio/template/bp_blocks.html

@@ -19,6 +19,9 @@
                         <a href="javascript:void(0)" onclick="javascript:__onclick__">__title__</a>
                     </bx_if:show_link>
                     <bx_if:show_text>__title__</bx_if:show_text>
+                    <bx_if:show_api>
+                        <i class="sys-icon sys-colored fa-mobile col-gray" title="<bx_text_attribute:_adm_txt_active_api />"></i>
+                    </bx_if:show_api>
                 </div>
                 <div class="adm-bpb-description bx-def-font-grayed">__module__ &bull; __visible_for__</div>
             </div>

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

@@ -202,6 +202,10 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
                             'condition' => false,
                             'content' => array()
                         ),
+                        'bx_if:show_api' => [
+                            'condition' => (int)$aBlock['active_api'] != 0,
+                            'content' => []
+                        ],
                         'bx_if:image' => array (
                             'condition' => (bool)$sIconUrl,
                             'content' => array('icon_url' => $sIconUrl),
@@ -825,6 +829,17 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
                         'pass' => 'Int',
                     )
                 ),
+                'active_api' => array(
+                    'type' => 'switcher',
+                    'name' => 'active_api',
+                    'caption' => _t('_adm_bp_txt_block_active_api'),
+                    'info' => '',
+                    'value' => '1',
+                    'checked' => $aBlock['active_api'] == '1',
+                    'db' => array (
+                        'pass' => 'Int',
+                    )
+                ),
                 'controls' => array(
                     'name' => 'controls',
                     'type' => 'input_set',

+ 17 - 0
studio/template/scripts/BxBaseStudioNavigationItems.php

@@ -416,6 +416,12 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
         if(empty($mixedValue))
             $mixedValue = _t($aRow['title']);
 
+        if((int)$aRow['active_api'] != 0)
+            $mixedValue .= ' ' . $this->_oTemplate->parseIcon('fa-mobile', [
+                'class' => 'sys-colored col-gray',
+                'title' => bx_html_attribute(_t('_adm_txt_active_api'))
+            ]);
+
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     }
 
@@ -799,6 +805,17 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                         'pass' => 'Int',
                     )
                 ),
+                'active_api' => array(
+                    'type' => 'switcher',
+                    'name' => 'active_api',
+                    'caption' => _t('_adm_nav_txt_items_active_api'),
+                    'info' => '',
+                    'value' => '1',
+                    'checked' => isset($aItem['active_api']) && (int)$aItem['active_api'] == 1,
+                    'db' => array (
+                        'pass' => 'Int',
+                    )
+                ),
                 'controls' => array(
                     'name' => 'controls',
                     'type' => 'input_set',

+ 25 - 14
template/scripts/BxBasePage.php

@@ -398,7 +398,7 @@ class BxBasePage extends BxDolPage
     /**
      * Get page array with all cells and blocks
      */
-    public function getPageAPI ()
+    public function getPageAPI ($aBlocks = [])
     {
         $a = [
             'id' => $this->_aObject['id'],
@@ -413,7 +413,7 @@ class BxBasePage extends BxDolPage
             'menu_top' => '',
             'menu' => '',
             'menu_bottom' => '',
-            'elements' => $this->getPageBlocksAPI(),
+            'elements' => $this->getPageBlocksAPI($aBlocks),
         ];
         
         
@@ -468,14 +468,15 @@ class BxBasePage extends BxDolPage
         return $a;
     }
 
-    public function getPageBlocksAPI()
+    public function getPageBlocksAPI($aBlocks = [])
     {
-        $aFieldsUnset = ['cell_id', 'active', 'copyable', 'deletable', 'object', 'text', 'text_updated', 'title_system', 'visible_for_levels'];
+        $bBlocks = !empty($aBlocks) && is_array($aBlocks);
+        $aFieldsUnset = ['object', 'cell_id', 'title_system', 'class', 'submenu', 'tabs', 'async', 'visible_for_levels', 'hidden_on', 'type', 'text', 'text_updated', 'help', 'cache_lifetime', 'active', 'active_api', 'copyable', 'deletable', 'order'];
 
         $aCells = $this->_oQuery->getPageBlocks();
         foreach($aCells as $sKey => &$aCell) {
             foreach($aCell as $i => $aBlock) {     
-                if(!$this->_isVisibleBlock($aBlock) || ($aCells[$sKey][$i]['hidden_on'] > 0 && ((int)$aCells[$sKey][$i]['hidden_on'] & 8) > 0)) {
+                if((int)$aBlock['active_api'] == 0 || !$this->_isVisibleBlock($aBlock)) {
                     unset($aCells[$sKey][$i]);
                     continue;
                 }
@@ -483,17 +484,27 @@ class BxBasePage extends BxDolPage
                 $this->processPageBlock($aCells[$sKey][$i], true);
                 $aBlock = $aCells[$sKey][$i];
 
+                $sSource = '';
+                if($aBlock['type'] == 'service') {
+                    $aContent = @unserialize($aBlock['content']);
+                    if(isset($aContent['module'], $aContent['method']))
+                        $sSource = $aContent['module'] . ':' . $aContent['method'];
+                }
+
+                if($bBlocks && !in_array($sSource, $aBlocks)) {
+                    unset($aCells[$sKey][$i]);
+                    continue;
+                }
+
                 $sFunc = '_getBlock' . ucfirst($aBlock['type']);
                 $mBlock = method_exists($this, $sFunc) ? $this->$sFunc($aBlock) : $aBlock['content'];
-                $aSrc = '';
-                if(method_exists($this, $sFunc)){
-                    $aSrc = @unserialize($aBlock['content']) ;
-                }
-                
-                $aCells[$sKey][$i]['title'] = isset($mBlock['title']) ? $mBlock['title'] : $this->getBlockTitle($aBlock);
-                $aCells[$sKey][$i]['content'] = isset($mBlock['content']) ? $mBlock['content'] : $mBlock;
-                $aCells[$sKey][$i]['menu'] = isset($mBlock['menu']) ? $mBlock['menu'] : '';
-                $aCells[$sKey][$i]['source'] = isset($aSrc['module']) ? $aSrc['module'] . '-' . $aSrc['method'] : '';
+
+                $aCells[$sKey][$i] = array_merge($aCells[$sKey][$i], [
+                    'title' => isset($mBlock['title']) ? $mBlock['title'] : $this->getBlockTitle($aBlock),
+                    'content' => isset($mBlock['content']) ? $mBlock['content'] : $mBlock,
+                    'menu' => isset($mBlock['menu']) ? $mBlock['menu'] : '',
+                    'source' => $sSource
+                ]);
                 $aCells[$sKey][$i] = array_diff_key($aCells[$sKey][$i], array_flip($aFieldsUnset));
             }
         }

+ 6 - 2
template/scripts/BxBaseServicePages.php

@@ -34,7 +34,7 @@ class BxBaseServicePages extends BxDol
     /** 
      * @ref bx_system_general-get_page_by_request "get_page_by_request"
      */
-    public function serviceGetPageByRequest ($sRequest)
+    public function serviceGetPageByRequest ($sRequest, $sBlocks = '')
     {
         $mixed = BxDolPage::getPageBySeoLink($sRequest);
 
@@ -42,7 +42,11 @@ class BxBaseServicePages extends BxDol
             $aRes = ['redirect' => $sUrl];
         }
         elseif (($oPage = $mixed) && is_object($oPage)) {
-            return $oPage->getPageAPI();
+            $aBlocks = [];
+            if(!empty($sBlocks))
+                $aBlocks = explode(',', $sBlocks);
+
+            return $oPage->getPageAPI($aBlocks);
         }
         else {
             $aRes = ['code' => 404, 'error' => _t("_sys_request_page_not_found_cpt")];