Browse Source

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

AntonLV 3 years ago
parent
commit
eb8b697e50

+ 19 - 9
inc/classes/BxDolMenu.php

@@ -239,15 +239,15 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
             return false;
 
     	if(!isset($this->_aObject['menu_items']))
-			$this->_aObject['menu_items'] = $this->_oQuery->getMenuItems();
+            $this->_aObject['menu_items'] = $this->_oQuery->getMenuItems();
 
     	$bVisible = false;
     	foreach ($this->_aObject['menu_items'] as $a) {
-    		if((isset($a['active']) && !$a['active']) || (isset($a['visible_for_levels']) && !$this->_isVisible($a)))
-				continue;
-			
-			$bVisible = true;
-			break;
+            if(!$this->_isActive($a) || !$this->_isVisible($a))
+                continue;
+
+            $bVisible = true;
+            break;
     	}
 
     	return $bVisible;
@@ -396,6 +396,19 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         return (!isset($a['module']) || $a['module'] == self::$SEL_MODULE) && (isset($a['name']) && $a['name'] == self::$SEL_NAME) ? true : false;
     }
 
+    /**
+     * Check if menu items is active.
+     * @param $a menu item array
+     * @return boolean
+     */
+    protected function _isActive ($a)
+    {
+        if($this->_bIsApi)
+            return !isset($a['active_api']) || (int)$a['active_api'] !=0;
+        else
+            return !isset($a['active']) || (int)$a['active'] != 0;
+    }
+
     /**
      * Check if menu items is visible.
      * @param $a menu item array
@@ -403,9 +416,6 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
      */
     protected function _isVisible ($a)
     {
-        if($this->_bIsApi && (!isset($a['active_api']) || (int)$a['active_api'] == 0))
-            return false;
-
         if(isset($a['visible_for_levels']) && !BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']))
             return false;
 

+ 10 - 6
inc/classes/BxDolPageQuery.php

@@ -111,13 +111,17 @@ class BxDolPageQuery extends BxDolDb
         return BxDolDb::getInstance()->getAll("SELECT * FROM `sys_pages_types` WHERE 1");
     }
 
-    public function getPageBlocks()
+    public function getPageBlocks($bIsApi = false)
     {
-        $aRet = array ();
-        for ($i = 1 ; $i <= $this->_aObject['cells_number'] ; ++$i) {
-            $sQuery = $this->prepare("SELECT * FROM `sys_pages_blocks` WHERE `object` = ? AND `cell_id` = ? AND `active` = 1 ORDER BY `order` ASC", $this->_aObject['object'], $i);
-            $aRet['cell_'.$i] = $this->getAll($sQuery);
-        }
+        $sActiveClause = $bIsApi ? "`active_api` = 1" : "`active` = 1";
+
+        $aRet = [];
+        for($i = 1; $i <= $this->_aObject['cells_number']; ++$i)
+            $aRet['cell_'.$i] = $this->getAll("SELECT * FROM `sys_pages_blocks` WHERE `object` = :object AND `cell_id` = :cell_id AND " . $sActiveClause . " ORDER BY `order` ASC", [
+                'object' => $this->_aObject['object'],
+                'cell_id' => $i
+            ]);
+
         return $aRet;
     }
 

+ 1 - 4
template/scripts/BxBaseMenu.php

@@ -168,10 +168,7 @@ class BxBaseMenu extends BxDolMenu
 
     protected function _getMenuItem ($a)
     {
-        if (isset($a['active']) && !$a['active'])
-            return false;
-
-        if (!$this->_isVisible($a))
+        if (!$this->_isActive($a) || !$this->_isVisible($a))
             return false;
 
         if ($this->_bIsApi) {

+ 2 - 2
template/scripts/BxBasePage.php

@@ -473,10 +473,10 @@ class BxBasePage extends BxDolPage
         $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();
+        $aCells = $this->_oQuery->getPageBlocks(true);
         foreach($aCells as $sKey => &$aCell) {
             foreach($aCell as $i => $aBlock) {     
-                if((int)$aBlock['active_api'] == 0 || !$this->_isVisibleBlock($aBlock)) {
+                if(!$this->_isVisibleBlock($aBlock)) {
                     unset($aCells[$sKey][$i]);
                     continue;
                 }