From d53780856a58f6ad4d4c090cce42ddacd7e0dbee Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 18 Mar 2016 13:09:49 +0100 Subject: [PATCH] (menu) add filter for menu items, creating space for https://github.com/opnsense/core/issues/508 Using this version, it will already be possible to "delete" (sub)menus from inherited structures, using the visibility="delete" tag on an item. --- .../models/OPNsense/Base/Menu/MenuItem.php | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/Menu/MenuItem.php b/src/opnsense/mvc/app/models/OPNsense/Base/Menu/MenuItem.php index 043089c08..fd6417fbb 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Base/Menu/MenuItem.php +++ b/src/opnsense/mvc/app/models/OPNsense/Base/Menu/MenuItem.php @@ -340,7 +340,7 @@ class MenuItem public function toggleSelected($url) { $this->selected = false ; - foreach ($this->children as $nodeId => $node) { + foreach ($this->getFilteredChildren() as $nodeId => $node) { $node->toggleSelected($url); if ($node->getUrl() != "") { $match = str_replace(array(".", "*","?"), array("\.", ".*","\?"), $node->getUrl()); @@ -351,6 +351,23 @@ class MenuItem } } + /** + * Menu items are pluggable and can override already existing sections. + * This function filters the available child items and only return the still existing ones. + * @return array filtered set of children + */ + private function getFilteredChildren() + { + $result = array(); + foreach ($this->children as $key => $node) { + if ($node->getVisibility() != 'delete') { + $result[$key] = $node; + } + } + ksort($result); + return $result; + } + /** * Recursive method to retrieve a simple ordered structure of all menu items * @return array named array containing menu items as simple objects to keep the api cleaner for our templates @@ -369,8 +386,7 @@ class MenuItem } // sort by order/id and map getters to array items - ksort($this->children); - foreach ($this->children as $key => $node) { + foreach ($this->getFilteredChildren() as $key => $node) { $result[$node->id] = new \stdClass(); foreach ($properties as $methodName => $propName) { $result[$node->id]->{$propName} = $node->$methodName(); @@ -387,7 +403,7 @@ class MenuItem */ public function findNodeById($id) { - foreach ($this->children as $key => $node) { + foreach ($this->getFilteredChildren() as $key => $node) { if (strtolower($node->getId()) == strtolower($id)) { return $node ; }