1
0
AntonLV 6 жил өмнө
parent
commit
3bed943a62

+ 5 - 0
inc/classes/BxDolMenu.php

@@ -225,6 +225,11 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
     	return $bVisible;
     	return $bVisible;
     }
     }
 
 
+    public function setTemplate ($sTemplate)
+    {
+        $this->_aObject['template'] = $sTemplate;
+    }
+
     /**
     /**
      * Set selected menu item for current menu object only.
      * Set selected menu item for current menu object only.
      * @param $sModule menu item module to set as selected
      * @param $sModule menu item module to set as selected

+ 5 - 1
install/sql/system.sql

@@ -3961,7 +3961,9 @@ INSERT INTO `sys_menu_templates` (`id`, `template`, `title`, `visible`) VALUES
 (21, 'menu_profile_stats.html', '_sys_menu_template_title_profile_stats', 0),
 (21, 'menu_profile_stats.html', '_sys_menu_template_title_profile_stats', 0),
 (22, 'menu_interactive.html', '_sys_menu_template_title_interactive', 0),
 (22, 'menu_interactive.html', '_sys_menu_template_title_interactive', 0),
 (23, 'menu_buttons_icon_hor.html', '_sys_menu_template_title_buttons_icon_hor', 1),
 (23, 'menu_buttons_icon_hor.html', '_sys_menu_template_title_buttons_icon_hor', 1),
-(24, 'menu_floating_blocks_dash.html', '_sys_menu_template_title_floating_blocks_dash', 0);
+(24, 'menu_floating_blocks_dash.html', '_sys_menu_template_title_floating_blocks_dash', 0),
+(25, 'menu_block_submenu_hor.html', '_sys_menu_template_title_block_submenu_hor', 1),
+(26, 'menu_block_submenu_ver.html', '_sys_menu_template_title_block_submenu_ver', 1);
 
 
 CREATE TABLE IF NOT EXISTS `sys_objects_menu` (
 CREATE TABLE IF NOT EXISTS `sys_objects_menu` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -4889,6 +4891,8 @@ CREATE TABLE IF NOT EXISTS `sys_pages_blocks` (
   `title_system` varchar(255) NOT NULL,
   `title_system` varchar(255) NOT NULL,
   `title` varchar(255) NOT NULL,
   `title` varchar(255) NOT NULL,
   `designbox_id` int(11) NOT NULL DEFAULT '11',
   `designbox_id` int(11) NOT NULL DEFAULT '11',
+  `submenu` varchar(64) NOT NULL DEFAULT '',
+  `tabs` tinyint(4) NOT NULL DEFAULT '0',
   `visible_for_levels` int(11) NOT NULL DEFAULT '2147483647',
   `visible_for_levels` int(11) NOT NULL DEFAULT '2147483647',
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
   `type` enum('raw','html','lang','image','rss','menu','custom','service','wiki') NOT NULL DEFAULT 'raw',
   `type` enum('raw','html','lang','image','rss','menu','custom','service','wiki') NOT NULL DEFAULT 'raw',

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

@@ -536,6 +536,8 @@
 	<string name="_adm_bp_txt_block_hidden_on_desktop"><![CDATA[desktop]]></string>
 	<string name="_adm_bp_txt_block_hidden_on_desktop"><![CDATA[desktop]]></string>
         <string name="_adm_bp_txt_block_hidden_on_mobile"><![CDATA[mobile app]]></string>
         <string name="_adm_bp_txt_block_hidden_on_mobile"><![CDATA[mobile app]]></string>
 	<string name="_adm_bp_txt_block_selected"><![CDATA[blocks selected]]></string>
 	<string name="_adm_bp_txt_block_selected"><![CDATA[blocks selected]]></string>
+        <string name="_adm_bp_txt_block_submenu"><![CDATA[Block submenu]]></string>
+        <string name="_adm_bp_txt_block_tabs"><![CDATA[Use 'tabs' based block submenu]]></string>
 	<string name="_adm_bp_txt_block_title"><![CDATA[Title]]></string>
 	<string name="_adm_bp_txt_block_title"><![CDATA[Title]]></string>
 	<string name="_adm_bp_txt_block_visible_for"><![CDATA[Visible For]]></string>
 	<string name="_adm_bp_txt_block_visible_for"><![CDATA[Visible For]]></string>
 	<string name="_adm_bp_txt_block_visible_for_all"><![CDATA[Anyone]]></string>
 	<string name="_adm_bp_txt_block_visible_for_all"><![CDATA[Anyone]]></string>
@@ -2675,6 +2677,8 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_menu_set_title_toolbar_member"><![CDATA[Toolbar Member]]></string>
 	<string name="_sys_menu_set_title_toolbar_member"><![CDATA[Toolbar Member]]></string>
 	<string name="_sys_menu_set_title_toolbar_site"><![CDATA[Toolbar Site]]></string>
 	<string name="_sys_menu_set_title_toolbar_site"><![CDATA[Toolbar Site]]></string>
 	<string name="_sys_menu_set_title_snippet_meta"><![CDATA[Snippet Meta Info]]></string>
 	<string name="_sys_menu_set_title_snippet_meta"><![CDATA[Snippet Meta Info]]></string>
+        <string name="_sys_menu_template_title_block_submenu_hor"><![CDATA[Horizontal Block Submenu]]></string>
+        <string name="_sys_menu_template_title_block_submenu_ver"><![CDATA[Vertical Block Submenu]]></string>
 	<string name="_sys_menu_template_title_buttons_hor"><![CDATA[Horizontal Buttons]]></string>
 	<string name="_sys_menu_template_title_buttons_hor"><![CDATA[Horizontal Buttons]]></string>
         <string name="_sys_menu_template_title_buttons_icon_hor"><![CDATA[Horizontal Buttons (icons only)]]></string>
         <string name="_sys_menu_template_title_buttons_icon_hor"><![CDATA[Horizontal Buttons (icons only)]]></string>
 	<string name="_sys_menu_template_title_buttons_ver"><![CDATA[Vertical Buttons]]></string>
 	<string name="_sys_menu_template_title_buttons_ver"><![CDATA[Vertical Buttons]]></string>

+ 6 - 4
modules/boonex/polls/classes/BxPollsTemplate.php

@@ -111,10 +111,12 @@ class BxPollsTemplate extends BxBaseModTextTemplate
         $aTmplVars = parent::getTmplVarsText($aData);
         $aTmplVars = parent::getTmplVarsText($aData);
         $aTmplVars = array_merge($aTmplVars, array(
         $aTmplVars = array_merge($aTmplVars, array(
             'menu' => BxTemplFunctions::getInstance()->designBoxMenu($oMenu, array(
             'menu' => BxTemplFunctions::getInstance()->designBoxMenu($oMenu, array(
-                'menu' => array(
-                    'id' => $sMenuId, 
-                    'class' => $sMenu, 
-                    'onclick' => "bx_menu_slide_inline('#" . $sMenuId . "', this, $(this).parents('.bx-db-menu:first'))"
+                array(
+                    'menu' => array(
+                        'id' => $sMenuId, 
+                        'class' => $sMenu, 
+                        'onclick' => "bx_menu_slide_inline('#" . $sMenuId . "', this, $(this).parents('.bx-db-menu:first'))"
+                    )
                 )
                 )
             )),
             )),
             'bx_if:show_subentries' => array(
             'bx_if:show_subentries' => array(

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

@@ -536,6 +536,8 @@
 	<string name="_adm_bp_txt_block_hidden_on_desktop"><![CDATA[настольном компьютере]]></string>
 	<string name="_adm_bp_txt_block_hidden_on_desktop"><![CDATA[настольном компьютере]]></string>
         <string name="_adm_bp_txt_block_hidden_on_mobile"><![CDATA[мобильное приложение]]></string>
         <string name="_adm_bp_txt_block_hidden_on_mobile"><![CDATA[мобильное приложение]]></string>
 	<string name="_adm_bp_txt_block_selected"><![CDATA[блоков выбрано]]></string>
 	<string name="_adm_bp_txt_block_selected"><![CDATA[блоков выбрано]]></string>
+        <string name="_adm_bp_txt_block_submenu"><![CDATA[Подменю блока]]></string>
+        <string name="_adm_bp_txt_block_tabs"><![CDATA[Использовать подменю блока в виде вкладок]]></string>
 	<string name="_adm_bp_txt_block_title"><![CDATA[Заголовок]]></string>
 	<string name="_adm_bp_txt_block_title"><![CDATA[Заголовок]]></string>
 	<string name="_adm_bp_txt_block_visible_for"><![CDATA[Видимо для]]></string>
 	<string name="_adm_bp_txt_block_visible_for"><![CDATA[Видимо для]]></string>
 	<string name="_adm_bp_txt_block_visible_for_all"><![CDATA[Всех]]></string>
 	<string name="_adm_bp_txt_block_visible_for_all"><![CDATA[Всех]]></string>
@@ -2631,6 +2633,8 @@
 	<string name="_sys_menu_set_title_toolbar_member"><![CDATA[Панель инструментов - Пользователь]]></string>
 	<string name="_sys_menu_set_title_toolbar_member"><![CDATA[Панель инструментов - Пользователь]]></string>
 	<string name="_sys_menu_set_title_toolbar_site"><![CDATA[Панель инструментов - Сайт]]></string>
 	<string name="_sys_menu_set_title_toolbar_site"><![CDATA[Панель инструментов - Сайт]]></string>
 	<string name="_sys_menu_set_title_snippet_meta"><![CDATA[Мета информация в карточке]]></string>
 	<string name="_sys_menu_set_title_snippet_meta"><![CDATA[Мета информация в карточке]]></string>
+        <string name="_sys_menu_template_title_block_submenu_hor"><![CDATA[Горизонтальное подменю блолка]]></string>
+        <string name="_sys_menu_template_title_block_submenu_ver"><![CDATA[Вертикальное подменю блолка]]></string>
 	<string name="_sys_menu_template_title_buttons_hor"><![CDATA[Горизонтальные кнопки]]></string>
 	<string name="_sys_menu_template_title_buttons_hor"><![CDATA[Горизонтальные кнопки]]></string>
         <string name="_sys_menu_template_title_buttons_icon_hor"><![CDATA[Горизонтальные кнопки (только иконки)]]></string>
         <string name="_sys_menu_template_title_buttons_icon_hor"><![CDATA[Горизонтальные кнопки (только иконки)]]></string>
 	<string name="_sys_menu_template_title_buttons_ver"><![CDATA[Вертикальные кнопки]]></string>
 	<string name="_sys_menu_template_title_buttons_ver"><![CDATA[Вертикальные кнопки]]></string>

+ 15 - 2
studio/classes/BxDolStudioBuilderPageQuery.php

@@ -229,9 +229,20 @@ class BxDolStudioBuilderPageQuery extends BxDolStudioPageQuery
         return (int)$this->getOne("SELECT FOUND_ROWS()");
         return (int)$this->getOne("SELECT FOUND_ROWS()");
     }
     }
 
 
-    function getSubmenus()
+    function getSubmenus($mixedTemplateIds = 8)
     {
     {
-        return BxDolDb::getInstance()->getPairs('SELECT `object`, `title` FROM `sys_objects_menu` WHERE `template_id` = 8', 'object', 'title');
+        if(!is_array($mixedTemplateIds))
+            $mixedTemplateIds = array($mixedTemplateIds);
+
+        return BxDolDb::getInstance()->getPairs('SELECT `object`, `title` FROM `sys_objects_menu` WHERE `template_id` IN (' . $this->implode_escape($mixedTemplateIds) . ')', 'object', 'title');
+    }
+
+    function getBlockSubmenus($mixedTemplateIds = array(25, 26))
+    {
+        if(!is_array($mixedTemplateIds))
+            $mixedTemplateIds = array($mixedTemplateIds);
+        
+        return BxDolDb::getInstance()->getPairs('SELECT `object`, `title` FROM `sys_objects_menu` WHERE `template_id` IN (' . $this->implode_escape($mixedTemplateIds) . ')', 'object', 'title');
     }
     }
 
 
     function getLayouts($aParams, &$aItems, $bReturnCount = true)
     function getLayouts($aParams, &$aItems, $bReturnCount = true)
@@ -404,6 +415,8 @@ class BxDolStudioBuilderPageQuery extends BxDolStudioPageQuery
                 `tpb`.`title_system` AS `title_system`,
                 `tpb`.`title_system` AS `title_system`,
                 `tpb`.`title` AS `title`,
                 `tpb`.`title` AS `title`,
                 `tpb`.`designbox_id` AS `designbox_id`,
                 `tpb`.`designbox_id` AS `designbox_id`,
+                `tpb`.`submenu` AS `submenu`,
+                `tpb`.`tabs` AS `tabs`,
                 `tpb`.`hidden_on` AS `hidden_on`,
                 `tpb`.`hidden_on` AS `hidden_on`,
                 `tpb`.`visible_for_levels` AS `visible_for_levels`,
                 `tpb`.`visible_for_levels` AS `visible_for_levels`,
                 `tpb`.`type` AS `type`,
                 `tpb`.`type` AS `type`,

+ 28 - 1
studio/template/scripts/BxBaseStudioBuilderPage.php

@@ -638,7 +638,7 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
         if(empty($aBlock) || !is_array($aBlock))
         if(empty($aBlock) || !is_array($aBlock))
             return array('msg' => _t('_adm_bp_err_block_not_found'));
             return array('msg' => _t('_adm_bp_err_block_not_found'));
 
 
-		bx_import('BxDolStudioUtils');
+        bx_import('BxDolStudioUtils');
         $aForm = array(
         $aForm = array(
             'form_attrs' => array(
             'form_attrs' => array(
                 'id' => 'adm-bp-block-edit',
                 'id' => 'adm-bp-block-edit',
@@ -698,6 +698,28 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
                         'error' => _t('_adm_bp_err_block_designbox'),
                         'error' => _t('_adm_bp_err_block_designbox'),
                     ),
                     ),
                 ),
                 ),
+                'submenu' => array(
+                    'type' => 'select',
+                    'name' => 'submenu',
+                    'caption' => _t('_adm_bp_txt_block_submenu'),
+                    'info' => '',
+                    'value' => isset($aBlock['submenu']) ? $aBlock['submenu'] : '',
+                    'required' => '0',
+                    'db' => array (
+                        'pass' => 'Xss',
+                    ),
+                ),
+                'tabs' => array(
+                    'type' => 'switcher',
+                    'name' => 'tabs',
+                    'caption' => _t('_adm_bp_txt_block_tabs'),
+                    'info' => '',
+                    'value' => '1',
+                    'checked' => $aBlock['tabs'] == '1',
+                    'db' => array (
+                        'pass' => 'Int',
+                    )
+                ),
                 'hidden_on' => array(
                 'hidden_on' => array(
                     'type' => 'select_multiple',
                     'type' => 'select_multiple',
                     'name' => 'hidden_on',
                     'name' => 'hidden_on',
@@ -783,6 +805,11 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
         foreach($aDBoxes as $aDBox)
         foreach($aDBoxes as $aDBox)
             $aForm['inputs']['designbox_id']['values'][] = array('key' => $this->sSelectKeyPrefix . $aDBox['id'], 'value' => _t($aDBox['title']));
             $aForm['inputs']['designbox_id']['values'][] = array('key' => $this->sSelectKeyPrefix . $aDBox['id'], 'value' => _t($aDBox['title']));
 
 
+        $aSubmenus = $this->oDb->getBlockSubmenus();
+        $aForm['inputs']['submenu']['values'][] = array('key' => '', 'value' => _t('_sys_no_menu'));
+        foreach ($aSubmenus as $sObject => $sTitle)
+            $aForm['inputs']['submenu']['values'][] = array('key' => $sObject, 'value' => _t($sTitle));
+
         BxDolStudioUtils::getVisibilityValues($aBlock['visible_for_levels'], $aForm['inputs']['visible_for_levels']['values'], $aForm['inputs']['visible_for_levels']['value']);
         BxDolStudioUtils::getVisibilityValues($aBlock['visible_for_levels'], $aForm['inputs']['visible_for_levels']['values'], $aForm['inputs']['visible_for_levels']['value']);
 
 
         $aForm['inputs'] = $this->addInArray($aForm['inputs'], 'visible_for_levels', $this->getBlockContent($aBlock));
         $aForm['inputs'] = $this->addInArray($aForm['inputs'], 'visible_for_levels', $this->getBlockContent($aBlock));

+ 3 - 0
template/designbox_menu.html

@@ -0,0 +1,3 @@
+<div class="bx-db-menu">
+    <div class="bx-db-menu-tab bx-db-menu-tab-btn">__content__</div>
+</div>

+ 5 - 0
template/designbox_menu_button.html

@@ -0,0 +1,5 @@
+<a href="javascript:void(0);" __attrs__>
+    <bx_if:show_icon><i class="sys-icon __icon__ bx-def-font-h2"></i></bx_if:show_icon>
+    <bx_if:show_icon_a><i class="sys-icon-a" data-rotate="down" data-icon="__icon_a__"></i></bx_if:show_icon_a>
+    <bx_if:show_title>__title__</bx_if:show_title>
+</a>

+ 1 - 0
template/menu_block_submenu_hor.html

@@ -0,0 +1 @@
+<bx_include_auto:menu_horizontal.html />

+ 1 - 0
template/menu_block_submenu_ver.html

@@ -0,0 +1 @@
+<bx_include_auto:menu_vertical.html />

+ 134 - 51
template/scripts/BxBaseFunctions.php

@@ -10,7 +10,13 @@
 class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
 class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
 {
 {
     protected $_oTemplate;
     protected $_oTemplate;
-    protected $_sDesignBoxIcon = 'chevron';
+
+    protected $_sDesignBoxMenuIcon;
+    protected $_sDesignBoxMenuIconType;
+    protected $_sDesignBoxMenuClick;
+    protected $_sDesignBoxMenuTmplTabs;
+    protected $_sDesignBoxMenuTmplPopup;
+    
 
 
     protected function __construct($oTemplate)
     protected function __construct($oTemplate)
     {
     {
@@ -20,6 +26,12 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
         parent::__construct();
         parent::__construct();
 
 
         $this->_oTemplate = $oTemplate ? $oTemplate : BxDolTemplate::getInstance();
         $this->_oTemplate = $oTemplate ? $oTemplate : BxDolTemplate::getInstance();
+
+        $this->_sDesignBoxMenuIcon = 'chevron';
+        $this->_sDesignBoxMenuIconType = 'icon-a';
+        $this->_sDesignBoxMenuClick = "bx_menu_slide_inline('#{design_box_menu}', this)";
+        $this->_sDesignBoxMenuTmplTabs = 'menu_block_submenu_hor.html';
+        $this->_sDesignBoxMenuTmplPopup = 'menu_block_submenu_ver.html';
     }
     }
 
 
     /**
     /**
@@ -201,6 +213,9 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
      *      - object: instance of BxTemplMenu class
      *      - object: instance of BxTemplMenu class
      *      - string: menu object identifier
      *      - string: menu object identifier
      *      - array: array of menu links to create menu from
      *      - array: array of menu links to create menu from
+     * @param $mixedButtons - design box menu representation, it can be:
+     *      - false: design box menu will be used as horizontal menu (tabs)
+     *      - array: array of menu links to create menu from. If empty array is used and 'design box menu' isn't empty, then 'design box menu' will be added as one of menu items automatically. If non-empty array is used and 'design box menu' isn't empty then it should be added as one of menu items. Use array('menu' => 1) to define menu item for 'design box menu'.
      * @return string
      * @return string
      *
      *
      * @see BX_DB_CONTENT_ONLY
      * @see BX_DB_CONTENT_ONLY
@@ -211,87 +226,155 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
      * @see BX_DB_PADDING_DEF
      * @see BX_DB_PADDING_DEF
      * @see BX_DB_PADDING_NO_CAPTION
      * @see BX_DB_PADDING_NO_CAPTION
      */
      */
-    function designBoxContent ($sTitle, $sContent, $iTemplateNum = BX_DB_DEF, $mixedMenu = false)
+    function designBoxContent ($sTitle, $sContent, $iTemplateNum = BX_DB_DEF, $mixedMenu = false, $mixedButtons = array())
     {
     {
         return $this->_oTemplate->parseHtmlByName('designbox_' . (int)$iTemplateNum . '.html', array(
         return $this->_oTemplate->parseHtmlByName('designbox_' . (int)$iTemplateNum . '.html', array(
             'title' => $sTitle,
             'title' => $sTitle,
             'designbox_content' => $sContent,
             'designbox_content' => $sContent,
-            'caption_item' => $this->designBoxMenu ($mixedMenu, array (array('menu' => 1))),
+            'caption_item' => $this->designBoxMenu($mixedMenu, $mixedButtons),
         ));
         ));
     }
     }
 
 
-    function designBoxMenu ($mixedMenu, $aButtons = array ())
+    function designBoxMenu ($mixedMenu, $mixedButtons = array())
     {
     {
-        $sCode = '';
-        $aButtonMenu = false;
-        if ($mixedMenu) {
-
-            $sMenu = '';
-
-            if (is_string($mixedMenu)) {
+        $bUseTabs = is_bool($mixedButtons) && $mixedButtons === true;
 
 
+        $sMenu = '';
+        if(!empty($mixedMenu)) {
+            if(is_string($mixedMenu)) {
                 $oMenu = BxTemplMenu::getObjectInstance($mixedMenu);
                 $oMenu = BxTemplMenu::getObjectInstance($mixedMenu);
-                $sMenu = $oMenu ? $oMenu->getCode () : $mixedMenu;
-
-            } elseif (is_object($mixedMenu) && is_a($mixedMenu, 'BxTemplMenu')) {
-
-                $sMenu = $mixedMenu->getCode();
-
-            } elseif (is_array($mixedMenu)) {
+                if($oMenu) {
+                    if($bUseTabs)
+                        $oMenu->setTemplate($this->_sDesignBoxMenuTmplTabs);
 
 
-                if (isset($mixedMenu['template']) && isset($mixedMenu['menu_items']))
+                    $sMenu = $oMenu->getCode();
+                }
+                else
+                    $sMenu = $mixedMenu;
+            } 
+            else if(is_array($mixedMenu)) {
+                if(isset($mixedMenu['template']) && isset($mixedMenu['menu_items']))
                     $aMenu = $mixedMenu;
                     $aMenu = $mixedMenu;
                 else
                 else
-                    $aMenu = array ('template' => 'menu_vertical.html', 'menu_items' => $mixedMenu);
+                    $aMenu = array('template' => $this->_sDesignBoxMenuTmplPopup, 'menu_items' => $mixedMenu);
+
+                if($bUseTabs)
+                    $aMenu['template'] = $this->_sDesignBoxMenuTmplTabs;
 
 
                 $oMenu = new BxTemplMenu($aMenu, $this->_oTemplate);
                 $oMenu = new BxTemplMenu($aMenu, $this->_oTemplate);
-                $sMenu = $oMenu->getCode ();
+                $sMenu = $oMenu ? $oMenu->getCode() : '';
             }
             }
+            else if(is_object($mixedMenu) && is_a($mixedMenu, 'BxTemplMenu')) {
+                if($bUseTabs)
+                    $mixedMenu->setTemplate($this->_sDesignBoxMenuTmplTabs);
 
 
-            if ($sMenu) {
-                $bButtonMenu = !empty($aButtons['menu']) && is_array($aButtons['menu']);
-
-                $sId = $bButtonMenu && !empty($aButtons['menu']['id']) ? $aButtons['menu']['id'] : 'bx-menu-db-' . time() . rand(0, PHP_INT_MAX);
-                $sCode .= $this->slideBox($sId, $sMenu, true);
-
-                $aButtonMenu = array('icon-a' => $this->_sDesignBoxIcon, 'onclick' => "bx_menu_slide_inline('#" . $sId . "', this)");
-                if($bButtonMenu) {
-                    $aButtonMenu = array_merge($aButtonMenu, $aButtons['menu']);
-                    $aButtons[] = array('menu' => 1);
+                $sMenu = $mixedMenu->getCode();
+            }
+        }
+        $bMenu = !empty($sMenu);
 
 
-                    unset($aButtons['menu']);
+        $sResult = '';
+        if($bUseTabs && $bMenu)
+            $sResult = $sMenu;
+        else if(is_array($mixedButtons)) {
+            $sPopup = '';
+
+            if($bMenu) {
+                $aButton = array();
+                if(empty($mixedButtons))
+                    list($aButton, $sPopup) = $this->_designBoxMenuButton($sMenu);
+                //--- For backward compatibility
+                else if(!empty($mixedButtons['menu']) && is_array($mixedButtons['menu'])) {
+                    list($aButton, $sPopup) = $this->_designBoxMenuButton($sMenu, $mixedButtons['menu']);
+                    unset($mixedButtons['menu']);
                 }
                 }
+
+                if(!empty($aButton))
+                    $mixedButtons[] = $aButton;
             }
             }
 
 
-        }
+            foreach($mixedButtons as $aButton) {
+                if($bMenu && isset($aButton['menu'])) {
+                    if(is_numeric($aButton['menu']) && (int)$aButton['menu'] == 1)
+                        list($aButton, $sPopup) = $this->_designBoxMenuButton($sMenu);
+                    else if(is_array($aButton['menu']))
+                        list($aButton, $sPopup) = $this->_designBoxMenuButton($sMenu, $aButton['menu']);
 
 
-        if ($aButtons) {
-            $sCode .= '<div class="bx-db-menu"><div class="bx-db-menu-tab bx-db-menu-tab-btn">';
-            foreach ($aButtons as $aButton) {
-                if (isset($aButton['menu']) && $aButton['menu']) {
-                    if (!$aButtonMenu)
+                    if(isset($aButton['menu']))
                         continue;
                         continue;
-
-                    $aButton = $aButtonMenu;
                 }
                 }
 
 
-                $aAttrs = array ();
-                if (!empty($aButton['onclick']))
+                $aAttrs = array();
+                if(!empty($aButton['onclick']))
                     $aAttrs['onclick'] = $aButton['onclick'];
                     $aAttrs['onclick'] = $aButton['onclick'];
-                if (!empty($aButton['class']))
+                if(!empty($aButton['class']))
                     $aAttrs['class'] = $aButton['class'];
                     $aAttrs['class'] = $aButton['class'];
-                $sAttrs = bx_convert_array2attrs ($aAttrs, 'bx-def-margin-sec-left');
 
 
-                $sCode .= '<a href="javascript:void(0);" ' . $sAttrs . '>';
-                $sCode .= !empty($aButton['icon']) ? '<i class="sys-icon ' . $aButton['icon'] . ' bx-def-font-h2"></i>' : '';
-                $sCode .= !empty($aButton['icon-a']) ? '<i class="sys-icon-a" data-rotate="down" data-icon="' . $aButton['icon-a'] . '"></i>' : '';
-                $sCode .= !empty($aButton['title']) ? $aButton['title'] : '';
-                $sCode .= '</a>';
+                $bTmplVarsButtonIcon = !empty($aButton['icon']);
+                $aTmplVarsButtonIcon = !$bTmplVarsButtonIcon ? array() : array(
+                    'icon' => $aButton['icon']
+                );
+
+                $bTmplVarsButtonIconA = !empty($aButton['icon-a']);
+                $aTmplVarsButtonIconA = !$bTmplVarsButtonIconA ? array() : array(
+                    'icon_a' => $aButton['icon-a']
+                );
+
+                $bTmplVarsButtonTitle = !empty($aButton['title']);
+                $aTmplVarsButtonTitle = !$bTmplVarsButtonTitle ? array() : array(
+                    'title' => $aButton['title']
+                );
+
+                $sResult .= $this->_oTemplate->parseHtmlByName('designbox_menu_button.html', array(
+                    'attrs' => bx_convert_array2attrs($aAttrs, 'bx-def-margin-sec-left'),
+                    'bx_if:show_icon' => array(
+                        'condition' => $bTmplVarsButtonIcon,
+                        'content' => $aTmplVarsButtonIcon
+                    ),
+                    'bx_if:show_icon_a' => array(
+                        'condition' => $bTmplVarsButtonIconA,
+                        'content' => $aTmplVarsButtonIconA
+                    ),
+                    'bx_if:show_title' => array(
+                        'condition' => $bTmplVarsButtonTitle,
+                        'content' => $aTmplVarsButtonTitle
+                    )
+                ));
             }
             }
-            $sCode .= '</div></div>';
+
+            $sResult .= $sPopup;
         }
         }
 
 
-        return $sCode;
+        if(!empty($sResult))
+            $sResult = $this->_oTemplate->parseHtmlByName('designbox_menu.html', array(
+                'content' => $sResult
+            ));
+
+        return $sResult;
+    }
+
+    protected function _designBoxMenuId ()
+    {
+        return 'bx-menu-db-' . time() . rand(0, PHP_INT_MAX);
+    }
+
+    protected function _designBoxMenuButton ($sMenu, $aParams = array())
+    {
+        $sId = $this->_designBoxMenuId();
+        $aButton = array($this->_sDesignBoxMenuIconType => $this->_sDesignBoxMenuIcon, 'onclick' => $this->_sDesignBoxMenuClick);
+
+        if(!empty($aParams)) {
+            if(!empty($aParams['id']))
+                $sId = $aParams['id'];
+
+            $aButton = array_merge($aButton, $aParams);
+        }
+
+        $aButton['onclick'] = bx_replace_markers($aButton['onclick'], array(
+            'design_box_menu' => $sId
+        ));
+
+        return array($aButton, $this->slideBox($sId, $sMenu, true));
     }
     }
 
 
     /**
     /**

+ 33 - 9
template/scripts/BxBasePage.php

@@ -373,17 +373,41 @@ class BxBasePage extends BxDolPage
 
 
             $sTitle = $this->getBlockTitle($aBlock);
             $sTitle = $this->getBlockTitle($aBlock);
 
 
-            if (is_array($mixedContent) && !empty($mixedContent['content'])) {
-				$sContentWithBox = $oFunctions->designBoxContent(
-                	isset($mixedContent['title']) ? $mixedContent['title'] : $sTitle,
+            if(is_array($mixedContent) && !empty($mixedContent['content'])) {
+                $aParams = array(
+                    isset($mixedContent['title']) ? $mixedContent['title'] : $sTitle,
                     $mixedContent['content'],
                     $mixedContent['content'],
-                    isset($mixedContent['designbox_id']) ? $mixedContent['designbox_id'] : $aBlock['designbox_id'],
-                    isset($mixedContent['menu']) ? $mixedContent['menu'] : false
-				);
-            } 
-            elseif (is_string($mixedContent) && !empty($mixedContent)) {                    
-                $sContentWithBox = $oFunctions->designBoxContent($sTitle, $mixedContent, $aBlock['designbox_id']);
+                    isset($mixedContent['designbox_id']) ? $mixedContent['designbox_id'] : $aBlock['designbox_id']
+                );
+
+                $mixedMenu = false;
+                if(isset($mixedContent['menu']))
+                    $mixedMenu = $mixedContent['menu'];
+                else if(!empty($aBlock['submenu']))
+                    $mixedMenu = $aBlock['submenu'];
+                $aParams[] = $mixedMenu;
+
+                if(isset($mixedContent['buttons']))
+                    $aParams[] = $mixedContent['buttons'];
+                else if($mixedMenu)
+                    $aParams[] = (int)$aBlock['tabs'] == 1 ? true : array();
             }
             }
+            else if(is_string($mixedContent) && !empty($mixedContent)) {
+                $aParams = array(
+                    $sTitle,
+                    $mixedContent,
+                    $aBlock['designbox_id']
+                );
+
+                $mixedMenu = !empty($aBlock['submenu']) ? $aBlock['submenu'] : false;
+                $aParams[] = $mixedMenu;
+
+                if($mixedMenu)
+                    $aParams[] = (int)$aBlock['tabs'] == 1 ? true : array();
+            }
+
+            if(!empty($aParams))
+                $sContentWithBox = call_user_func_array(array($oFunctions, 'designBoxContent'), $aParams);
         }
         }
 
 
         if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endPageBlock($aBlock['id'], $sContentWithBox ? false : true, false );
         if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endPageBlock($aBlock['id'], $sContentWithBox ? false : true, false );