Przeglądaj źródła

Ticket #4340 - Menus: Allow to filter out items depending on context.

AntonLV 3 lat temu
rodzic
commit
b3a61a747e

+ 1 - 0
install/sql/system.sql

@@ -4558,6 +4558,7 @@ CREATE TABLE IF NOT EXISTS `sys_menu_items` (
   `visible_for_levels` int(11) NOT NULL DEFAULT '2147483647',
   `visibility_custom` text NOT NULL,
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
+  `hidden_on_cxt` varchar(255) NOT NULL DEFAULT '',
   `hidden_on_pt` int(11) NOT NULL DEFAULT '0',
   `hidden_on_col` int(11) NOT NULL DEFAULT '0',    
   `primary` tinyint(4) NOT NULL DEFAULT '0',

+ 1 - 0
modules/base/general/classes/BxBaseModGeneralMenuSnippetMeta.php

@@ -41,6 +41,7 @@ class BxBaseModGeneralMenuSnippetMeta extends BxTemplMenuUnitMeta
 
     public function setContentId($iContentId)
     {
+        $this->_iButtons = 0;
         $this->_iContentId = (int)$iContentId;
 
         $this->_aContentInfo = $this->_oModule->_oDb->getContentInfoById($this->_iContentId);

+ 27 - 43
modules/base/groups/classes/BxBaseModGroupsMenuSnippetMeta.php

@@ -16,33 +16,34 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
         parent::__construct($aObject, $oTemplate);
 
         $CNF = &$this->_oModule->_oConfig->CNF;
-        if (isset($CNF['OBJECT_CONNECTIONS'])){
-            $this->_aConnectionToFunctionCheck[$CNF['OBJECT_CONNECTIONS']] = array(
+
+        if(isset($CNF['OBJECT_CONNECTIONS']))
+            $this->_aConnectionToFunctionCheck[$CNF['OBJECT_CONNECTIONS']] = [
                 'add' => 'checkAllowedFanAdd', 
                 'remove' => 'checkAllowedFanRemove'
-            );
-
-            $this->_aConnectionToFunctionTitle[$CNF['OBJECT_CONNECTIONS']] = '_getMenuItemConnectionsTitle';
-        }
+            ];
     }
 
     protected function _getMenuItemJoinPaid($aItem)
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
 
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
+
         if(!isLogged() || $this->_oModule->checkAllowedFanAdd($this->_aContentInfo) !== CHECK_ACTION_RESULT_ALLOWED)
             return false;
 
         $oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']);
         if(!$oConnection)
             return false;
-        
-        $sTitle = $this->_getMenuItemConnectionsTitle('add', $oConnection);
+
+        $sTitle = $this->_oModule->getMenuItemTitleByConnection($CNF['OBJECT_CONNECTIONS'], 'add', $this->_oContentProfile->id());
         if(empty($sTitle))
             return false;
 
         return [
-            $this->getUnitMetaItemButton(_t('_bx_groups_menu_item_title_pay_and_join'), [
+            $this->getUnitMetaItemButton(_t(!empty($CNF['T']['menu_item_title_sm_join_paid']) ? $CNF['T']['menu_item_title_sm_join_paid'] : '_sys_menu_item_title_sm_join_paid'), [
                 'href' => bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_JOIN_ENTRY'], [
                     'profile_id' => $this->_oContentProfile->id()
                 ]))
@@ -53,15 +54,22 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
 
     protected function _getMenuItemJoin($aItem)
     {
-        if (isset($this->_oModule->_oConfig->CNF['OBJECT_CONNECTIONS']))
-            return $this->_getMenuItemConnection($this->_oModule->_oConfig->CNF['OBJECT_CONNECTIONS'], 'add', $aItem);
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(!isset($CNF['OBJECT_CONNECTIONS']))
+            return false;
 
-        return false;
+        return $this->_getMenuItemConnection($CNF['OBJECT_CONNECTIONS'], 'add', $aItem);
     }
 
     protected function _getMenuItemLeave($aItem)
     {
-        return $this->_getMenuItemConnection($this->_oModule->_oConfig->CNF['OBJECT_CONNECTIONS'], 'remove', $aItem);
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(!isset($CNF['OBJECT_CONNECTIONS']))
+            return false;
+
+        return $this->_getMenuItemConnection($CNF['OBJECT_CONNECTIONS'], 'remove', $aItem);
     }
 
     protected function _getMenuItemPrivacy($aItem)
@@ -82,6 +90,9 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
 
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
+
         if(!$this->_bContentPublic || !$this->_oContentProfile || empty($CNF['OBJECT_CONNECTIONS']))
             return false;
 
@@ -106,36 +117,6 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
         ], BX_CONNECTIONS_CONTENT_TYPE_INITIATORS));
     }
 
-    protected function _getMenuItemConnectionsTitle($sAction, &$oConnection)
-    {
-        $iProfile = bx_get_logged_profile_id();
-        $iContentProfile = $this->_oContentProfile->id();
-
-        $aResult = array();
-        if($oConnection->isConnectedNotMutual($iProfile, $iContentProfile))
-            $aResult = array(
-                'add' => '',
-                'remove' => _t('_sys_menu_item_title_sm_leave_cancel'),
-            );
-        else if($oConnection->isConnectedNotMutual($iContentProfile, $iProfile))
-            $aResult = array(
-                'add' => _t('_sys_menu_item_title_sm_join_confirm'),
-                'remove' => _t('_sys_menu_item_title_sm_leave_reject'),
-            );
-        else if($oConnection->isConnected($iProfile, $iContentProfile, true))
-            $aResult = array(
-                'add' => '',
-                'remove' => _t('_sys_menu_item_title_sm_leave'),
-            );
-        else
-            $aResult = array(
-                'add' => _t('_sys_menu_item_title_sm_join'),
-                'remove' => '',
-            );
-
-        return !empty($sAction) && isset($aResult[$sAction]) ? $aResult[$sAction] : $aResult;
-    }
-
     protected function _getMenuItemCountry($aItem)
     {
         return $this->_getMenuItemLocation($aItem, true);
@@ -150,6 +131,9 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
 
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
+
         if(!$this->_bContentPublic || !$this->_oContentProfile || empty($CNF['OBJECT_CONNECTIONS']))
             return false;
 

+ 41 - 1
modules/base/groups/classes/BxBaseModGroupsModule.php

@@ -506,7 +506,7 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
     {
         $CNF = &$this->_oConfig->CNF;
 
-        if(bx_is_api()) {
+        if(!bx_is_api()) {
             $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
             if(!$iProfileId)
                 return [];
@@ -1922,6 +1922,46 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
         return $aResult;
     }
 
+    public function getMenuItemTitleByConnection($sConnection, $sAction, $iContentProfileId, $iInitiatorProfileId = 0)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aResult = parent::getMenuItemTitleByConnection($sConnection, $sAction, $iContentProfileId, $iInitiatorProfileId);
+        if(!empty($aResult))
+            return $aResult;
+
+        $oConnection = BxDolConnection::getObjectInstance($sConnection);
+        if(!$oConnection)
+            return false;
+
+        if(!$iInitiatorProfileId)
+            $iInitiatorProfileId = bx_get_logged_profile_id();
+
+        $aResult = [];
+        if($oConnection->isConnectedNotMutual($iInitiatorProfileId, $iContentProfileId))
+            $aResult = [
+                'add' => '',
+                'remove' => _t(!empty($CNF['T']['menu_item_title_sm_leave_cancel']) ? $CNF['T']['menu_item_title_sm_leave_cancel'] : '_sys_menu_item_title_sm_leave_cancel'),
+            ];
+        else if($oConnection->isConnectedNotMutual($iContentProfileId, $iInitiatorProfileId))
+            $aResult = [
+                'add' => _t(!empty($CNF['T']['menu_item_title_sm_join_confirm']) ? $CNF['T']['menu_item_title_sm_join_confirm'] : '_sys_menu_item_title_sm_join_confirm'),
+                'remove' => _t(!empty($CNF['T']['menu_item_title_sm_leave_reject']) ? $CNF['T']['menu_item_title_sm_leave_reject'] : '_sys_menu_item_title_sm_leave_reject'),
+            ];
+        else if($oConnection->isConnected($iInitiatorProfileId, $iContentProfileId, true))
+            $aResult = [
+                'add' => '',
+                'remove' => _t(!empty($CNF['T']['menu_item_title_sm_leave']) ? $CNF['T']['menu_item_title_sm_leave'] : '_sys_menu_item_title_sm_leave'),
+            ];
+        else
+            $aResult = [
+                'add' => _t(!empty($CNF['T']['menu_item_title_sm_join']) ? $CNF['T']['menu_item_title_sm_join'] : '_sys_menu_item_title_sm_join'),
+                'remove' => '',
+            ];
+
+        return !empty($sAction) && isset($aResult[$sAction]) ? $aResult[$sAction] : $aResult;
+    }
+
     protected function _getImagesForTimelinePost($aEvent, $aContentInfo, $sUrl, $aBrowseParams = array())
     {
         $CNF = &$this->_oConfig->CNF;

+ 27 - 12
modules/base/profile/classes/BxBaseModProfileMenuSnippetMeta.php

@@ -20,8 +20,11 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
     {
         parent::__construct($aObject, $oTemplate);
 
+        $this->_iButtonsMax = 2;
         $this->_bShowZeros = true;
+
         $this->_bContentPublic = false;
+        $this->_oContentProfile = null;
 
         $this->_aConnectionToFunctionCheck = $this->_oModule->_oConfig->getConnectionToFunctionCheck();
     }
@@ -66,7 +69,8 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
 
     protected function _getMenuItemFriends($aItem)
     {
-        $CNF = &$this->_oModule->_oConfig->CNF;
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
 
         if(!$this->_bContentPublic || !$this->_oContentProfile)
             return false;
@@ -86,12 +90,19 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
                 'title' => $sTitle
             ]);
 
-        return $this->getUnitMetaItemText($sTitle);
+        //return $this->getUnitMetaItemText($sTitle);
+        $mixedItem = $this->getUnitMetaItemButton($sTitle, [
+            'class' => !empty($aItem['primary']) ? 'bx-btn-primary' : '',
+            'href' => $this->_oContentProfile->getUrl()
+        ]);
+
+        return $mixedItem !== false ? [$mixedItem, 'bx-menu-item-button'] : false;
     }
 
     protected function _getMenuItemFriendsMutual($aItem)
     {
-        $CNF = &$this->_oModule->_oConfig->CNF;
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
 
         if(!$this->_bContentPublic || !$this->_oContentProfile)
             return false;
@@ -116,7 +127,8 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
 
     protected function _getMenuItemSubscribers($aItem)
     {
-        $CNF = &$this->_oModule->_oConfig->CNF;
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
 
         if(!$this->_bContentPublic || !$this->_oContentProfile)
             return false;
@@ -142,6 +154,9 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
 
     protected function _getMenuItemConnection($sConnection, $sAction, &$aItem)
     {
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
+
         if(!isLogged() || $this->_oModule->{$this->_aConnectionToFunctionCheck[$sConnection][$sAction]}($this->_aContentInfo) !== CHECK_ACTION_RESULT_ALLOWED)
             return false;
 
@@ -164,18 +179,18 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
                 ]
             ]);
 
-        return [
-            $this->getUnitMetaItemButton($sTitle, array(
-                'class' => !empty($aItem['primary']) ? 'bx-btn-primary' : '',
-                'onclick' => $this->getMenuItemConnectionJsCode($sConnection, $sAction, $iContentProfile, $aItem)
-            )),
-            'bx-menu-item-button'
-        ];
+        $mixedItem = $this->getUnitMetaItemButton($sTitle, [
+            'class' => !empty($aItem['primary']) ? 'bx-btn-primary' : '',
+            'onclick' => $this->getMenuItemConnectionJsCode($sConnection, $sAction, $iContentProfile, $aItem)
+        ]);
+
+        return $mixedItem !== false ? [$mixedItem, 'bx-menu-item-button'] : false;
     }
 
     protected function _getMenuItemMembership($aItem)
     {
-        $CNF = &$this->_oModule->_oConfig->CNF;
+        if(!$this->_isVisibleInContext($aItem))
+            return false;
 
         if(!$this->_bContentPublic || !$this->_oContentProfile)
             return false;

+ 25 - 20
modules/base/profile/classes/BxBaseModProfileModule.php

@@ -333,12 +333,12 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
         return '';
     }
 
-    public function serviceGetSnippetMenuVars($iProfileId, $bPublic = null)
+    public function serviceGetSnippetMenuVars($iProfileId, $bPublic = null, $aParams = [])
     {
-        return $this->_oTemplate->getSnippetMenuVars($iProfileId, $bPublic);
+        return $this->_oTemplate->getSnippetMenuVars($iProfileId, $bPublic, $aParams);
     }
-        
-	public function serviceGetPageObjectForPageTrigger ($sPageTriggerName)
+
+    public function serviceGetPageObjectForPageTrigger ($sPageTriggerName)
     {
         if (isset($this->_oConfig->CNF['TRIGGER_PAGE_VIEW_ENTRY']) && $this->_oConfig->CNF['TRIGGER_PAGE_VIEW_ENTRY'] == $sPageTriggerName)
         	return $this->_oConfig->CNF['OBJECT_PAGE_VIEW_ENTRY'];
@@ -388,7 +388,7 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
         return $this->serviceProfileUnit ($iContentId, $aParams);
     }
 
-    public function serviceProfileUnit ($iContentId, $aParams = array())
+    public function serviceProfileUnit ($iContentId, $aParams = [])
     {
         $mixedContent = $this->_getContent($iContentId);
         if($mixedContent === false)
@@ -398,28 +398,33 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
 
         $bCheckPrivateContent = isset($aParams['check_private_content']) ? (bool)$aParams['check_private_content'] : true;
 
-        $sTemplate = 'unit.html';
-        $sTemplateSize = false;
-        $aTemplateVars = array();
+        $aUnitTemplate = ['name' => 'unit.html', 'size' => false, 'vars' => []];
         if(!empty($aParams['template'])) {
-            if(is_string($aParams['template']))
-                $sTemplate = $aParams['template'] . '.html';
-            else if(is_array($aParams['template'])) {
-                if(!empty($aParams['template']['name']))
-                    $sTemplate = $aParams['template']['name'] . '.html';
+            $mixedTemplate = $aParams['template'];
+            unset($aParams['template']);
 
-                if(!empty($aParams['template']['size']))
-                    $sTemplateSize = $aParams['template']['size'];
+            if(is_string($mixedTemplate))
+                $aUnitTemplate['name'] = $mixedTemplate . '.html';
+            else if(is_array($mixedTemplate)) {
+                if(!empty($mixedTemplate['name']))
+                    $aUnitTemplate['name'] = $mixedTemplate['name'] . '.html';
 
-                if(!empty($aParams['template']['vars']))
-                    $aTemplateVars = $aParams['template']['vars'];
+                if(!empty($mixedTemplate['size']))
+                    $aUnitTemplate['size'] = $mixedTemplate['size'];
+
+                if(!empty($mixedTemplate['vars']))
+                    $aUnitTemplate['vars'] = $mixedTemplate['vars'];
             }
         }
 
-        return $this->_oTemplate->unit($aContentInfo, $bCheckPrivateContent, array($sTemplate, $sTemplateSize, $aTemplateVars));
+        $aUnitParams = [];
+        if(!empty($aParams))
+            $aUnitParams = $aParams;
+
+        return $this->_oTemplate->unit($aContentInfo, $bCheckPrivateContent, array_values($aUnitTemplate), $aUnitParams);
     }
 
-    public function serviceProfileUnitApi ($iContentId, $aParams = array())
+    public function serviceProfileUnitApi ($iContentId, $aParams = [])
     {
         $mixedContent = $this->_getContent($iContentId);
         if($mixedContent === false)
@@ -427,7 +432,7 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
 
         list($iContentId, $aContentInfo) = $mixedContent;
 
-        return $this->_oTemplate->unitAPI($aContentInfo);
+        return $this->_oTemplate->unitAPI($aContentInfo, $aParams);
     }
 
     public function serviceHasImage ($iContentId)

+ 26 - 23
modules/base/profile/classes/BxBaseModProfileTemplate.php

@@ -54,7 +54,7 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
     /**
      * Get profile unit
      */
-    function unit ($aData, $isCheckPrivateContent = true, $mixedTemplate = false, $aParams = array())
+    function unit ($aData, $isCheckPrivateContent = true, $mixedTemplate = false, $aParams = [])
     {
         list($sTemplate) = is_array($mixedTemplate) ? $mixedTemplate : array($mixedTemplate);
 
@@ -94,7 +94,7 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
         return $this->parseHtmlByName($sTemplate, $aVars);
     }
 
-    public function unitAPI($aData)
+    public function unitAPI($aData, $aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
 
@@ -122,13 +122,16 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
 
             $oMetaMenu->setContentId($iContentId);
             $oMetaMenu->setContentPublic($bPublic);
+            if(isset($aParams['context']))
+                $oMetaMenu->setContext($aParams['context']);
+
             $aResult['meta'] = $oMetaMenu->getCodeAPI();
         }
 
         return $aResult;
     }
 
-    function unitVars ($aData, $isCheckPrivateContent = true, $mixedTemplate = false, $aParams = array())
+    function unitVars ($aData, $isCheckPrivateContent = true, $mixedTemplate = false, $aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
 
@@ -223,7 +226,7 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
 
         $aTmplVarsMeta = array();
         if(substr($sTemplate, 0, 8) != 'unit_wo_')
-            $aTmplVarsMeta = $this->getSnippetMenuVars ($iProfile, $bPublic);
+            $aTmplVarsMeta = $this->getSnippetMenuVars ($iProfile, $bPublic, $aParams);
         
         $sCoverData = isset($aData['cover_data']) ? $aData['cover_data'] : '';
 
@@ -271,31 +274,31 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
         return true;
     }
 
-    function getSnippetMenuVars ($iProfileId, $bPublic = null)
+    function getSnippetMenuVars ($iProfileId, $bPublic = null, $aParams = [])
     {
-        if (!($oProfile = BxDolProfile::getInstance($iProfileId)))
-            return array();
-        
         $CNF = &$this->_oConfig->CNF;
-        
-        if (null === $bPublic) {
+
+        $oProfile = false;
+        if(empty($CNF['OBJECT_MENU_SNIPPET_META']) || !($oProfile = BxDolProfile::getInstance($iProfileId)))
+            return [];
+
+        $oMetaMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SNIPPET_META'], $this);
+        if(!$oMetaMenu) 
+            return [];
+
+        if ($bPublic === null) {
             $aData = $this->getModule()->serviceGetContentInfoById($oProfile->getContentId());
             $bPublic = $this->isProfilePublic($aData);
         }
-        
-        $aTmplVarsMeta = array();
-        if (!empty($CNF['OBJECT_MENU_SNIPPET_META'])) {
-            $oMenuMeta = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SNIPPET_META'], $this);
-            if($oMenuMeta) {
-                $oMenuMeta->setContentId($oProfile->getContentId());
-                $oMenuMeta->setContentPublic($bPublic);
-                $aTmplVarsMeta = array(
-                    'meta' => $oMenuMeta->getCode()
-                );
-            }
-        }
 
-        return $aTmplVarsMeta;
+        $oMetaMenu->setContentId($oProfile->getContentId());
+        $oMetaMenu->setContentPublic($bPublic);
+        if(isset($aParams['context']))
+            $oMetaMenu->setContext($aParams['context']);
+
+        return [
+            'meta' => $oMetaMenu->getCode()
+        ];
     }
 
     function getBlockCover($aData, $aParams = [])

+ 6 - 3
modules/base/text/classes/BxBaseModTextTemplate.php

@@ -900,14 +900,17 @@ class BxBaseModTextTemplate extends BxBaseModGeneralTemplate
             $sText = $oMetatags->metaParse($aData[$CNF['FIELD_ID']], $sText);
         }
 
-        $aTmplVarsMeta = array();
+        $aTmplVarsMeta = [];
         if(!empty($CNF['OBJECT_MENU_SNIPPET_META'])) {
             $oMenuMeta = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SNIPPET_META'], $this);
             if($oMenuMeta) {
                 $oMenuMeta->setContentId($aData[$CNF['FIELD_ID']]);
-                $aTmplVarsMeta = array(
+                if(isset($aParams['context']))
+                    $oMenuMeta->setContext($aParams['context']);
+
+                $aTmplVarsMeta = [
                     'meta' => $oMenuMeta->getCode()
-                );
+                ];
             }
         }
 

+ 9 - 8
template/scripts/BxBaseMenuMoreAuto.php

@@ -76,7 +76,8 @@ class BxBaseMenuMoreAuto extends BxTemplMenu
         if(is_bool($this->_bMoreAuto))
             return $this->_bMoreAuto;
 
-        $aResult = $this->getMenuItems();
+        if(!isset($this->_aObject['menu_items']))
+            $this->_aObject['menu_items'] = $this->getMenuItemsRaw();
 
         $sItem = BX_DEF_MENU_ITEM_MORE_AUTO;
         if(!empty($this->_aObject['menu_items'][$sItem]) && is_array($this->_aObject['menu_items'][$sItem]) && (int)$this->_aObject['menu_items'][$sItem]['active'] == 1)
@@ -89,18 +90,18 @@ class BxBaseMenuMoreAuto extends BxTemplMenu
 
     protected function _getTemplateVars()
     {
+        $aResult = parent::_getTemplateVars();
+
         $bMoreAuto = $this->_isMoreAuto();
 
-        $aResult = array_merge(parent::_getTemplateVars(), array(
+        return array_merge($aResult, [
             'html_id' => $this->_getHtmlIdMain(),
-            'bx_if:show_more_auto_class' => array(
+            'bx_if:show_more_auto_class' => [
                 'condition' => $bMoreAuto,
-                'content' => array()
-            ),
+                'content' => []
+            ],
             'js_code' => $bMoreAuto ? $this->_getJsCodeMoreAuto() : ''
-        ));
-
-        return $aResult;
+        ]);
     }
 
     protected function _getJsCodeMoreAuto()

+ 64 - 2
template/scripts/BxBaseMenuUnitMeta.php

@@ -15,11 +15,26 @@ class BxBaseMenuUnitMeta extends BxTemplMenuCustom
 {
     protected $_sStylePrefix;
 
+    protected $_sContext;
+
+    protected $_iButtons;
+    protected $_iButtonsMax;
+
     public function __construct ($aObject, $oTemplate)
     {
         parent::__construct ($aObject, $oTemplate);
 
         $this->_sStylePrefix = 'sys-meta';
+
+        $this->_sContext = '';
+
+        $this->_iButtons = 0;
+        $this->_iButtonsMax = false;
+    }
+
+    public function setContext($sContext)
+    {
+        $this->_sContext = $sContext;
     }
 
     public function getUnitMetaItemLink($sContent, $aAttrs = array())
@@ -34,12 +49,26 @@ class BxBaseMenuUnitMeta extends BxTemplMenuCustom
 
     public function getUnitMetaItemButton($sContent, $aAttrs = array())
     {
-        return $this->getUnitMetaItemButtonOrLink('button', $sContent, $aAttrs);
+        if(!$this->_buttonsCounterCheck())
+            return false;
+
+        $sResult = $this->getUnitMetaItemButtonOrLink('button', $sContent, $aAttrs);
+        if(!empty($sResult))
+            $this->_buttonsCounterIncrement();
+
+        return $sResult;
     }
 
     public function getUnitMetaItemButtonSmall($sContent, $aAttrs = array())
     {
-        return $this->getUnitMetaItemButtonOrLink('sbutton', $sContent, $aAttrs);
+        if(!$this->_buttonsCounterCheck())
+            return false;
+
+        $sResult = $this->getUnitMetaItemButtonOrLink('sbutton', $sContent, $aAttrs);
+        if(!empty($sResult))
+            $this->_buttonsCounterIncrement();
+
+        return $sResult;
     }
 
     public function getUnitMetaItemNl($sContent = '')
@@ -201,6 +230,39 @@ class BxBaseMenuUnitMeta extends BxTemplMenuCustom
 
         return $aItemData;
     }
+
+    protected function _buttonsCounterReset()
+    {
+        if($this->_iButtonsMax === false)
+            return;
+
+        $this->_iButtons = 0;
+    }
+
+    protected function _buttonsCounterIncrement()
+    {
+        if($this->_iButtonsMax === false)
+            return;
+
+        $this->_iButtons++;
+    }
+
+    protected function _buttonsCounterCheck()
+    {
+        if($this->_iButtonsMax === false)
+            return true;
+
+        return $this->_iButtons < $this->_iButtonsMax;
+    }
+
+    protected function _isVisibleInContext($aItem)
+    {
+        if(empty($this->_sContext) || empty($aItem['hidden_on_cxt']))
+            return true;
+
+        $aContexts = explode(',', $aItem['hidden_on_cxt']);
+        return !in_array($this->_sContext, $aContexts);
+    }
 }
 
 /** @} */

+ 5 - 2
template/scripts/BxBaseProfileSearchResult.php

@@ -165,10 +165,13 @@ class BxBaseProfileSearchResult extends BxTemplSearchResult
         if(!$oProfile)
             return '';
 
+        $aParams = $this->aUnitParams;
+
         if($this->_bIsApi)
-            return $oProfile->getUnitAPI();
+            return $oProfile->getUnitAPI(0, $aParams);
 
-        return $oProfile->getUnit(0, ['template' => substr($this->sUnitTemplate, 0, -5)]);
+        $aParams['template'] = substr($this->sUnitTemplate, 0, -5);
+        return $oProfile->getUnit(0, $aParams);
     }
 
     function getAlterOrder()

+ 1 - 0
template/scripts/BxBaseServiceProfiles.php

@@ -774,6 +774,7 @@ class BxBaseServiceProfiles extends BxDol
         $o->setDesignBoxTemplateId($iDesignBox);
         $o->setDisplayEmptyMsg($bDisplayEmptyMsg);
         $o->setAjaxPaginate($bAjaxPaginate);
+        $o->setUnitParams(['context' => $sMode]);
 
         if ($o->isError)
             return '';