From 6e11e497092a54b6f3ba614bb9f8282788f98c05 Mon Sep 17 00:00:00 2001 From: Alex-Code Date: Wed, 5 Mar 2014 16:50:02 +0000 Subject: [PATCH] sub menus didn't get checked for being active. Based off the method in ```Menu.php``` I've updated ```Nav``` so it will check if sub menus are active or not. --- Nav.php | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Nav.php b/Nav.php index 9d4afc0..8e2075c 100644 --- a/Nav.php +++ b/Nav.php @@ -75,6 +75,10 @@ class Nav extends Widget */ public $activateItems = true; /** + * @var boolean whether to activate parent menu items when one of the corresponding child menu items is active. + */ + public $activateParents = false; + /** * @var string the route used to determine if a menu item is active or not. * If not set, it will use the route of the current request. * @see params @@ -110,11 +114,37 @@ class Nav extends Widget */ public function run() { + $this->activateItems($this->items, $hasActiveChild); echo $this->renderItems(); BootstrapAsset::register($this->getView()); } /** + * Check for active items adding the active class if found. + * @param array $items the items to check + * @param boolean $active does an item have an active child + */ + protected function activateItems(&$items, &$active) + { + foreach ($items as &$item) { + $hasActiveChild = false; + if (isset($item['items']) && is_array($item['items'])) { + $this->activateItems($item['items'], $hasActiveChild); + } + if (!isset($item['active'])) { + if ($this->activateParents && $hasActiveChild || $this->activateItems && $this->isItemActive($item)) { + $active = $item['active'] = true; + } + } elseif ($item['active']) { + $active = true; + } + if (ArrayHelper::remove($item, 'active', false)) { + Html::addCssClass($item['options'], 'active'); + } + } + } + + /** * Renders widget items. */ public function renderItems() @@ -151,16 +181,6 @@ class Nav extends Widget $url = ArrayHelper::getValue($item, 'url', '#'); $linkOptions = ArrayHelper::getValue($item, 'linkOptions', []); - if (isset($item['active'])) { - $active = ArrayHelper::remove($item, 'active', false); - } else { - $active = $this->isItemActive($item); - } - - if ($active) { - Html::addCssClass($options, 'active'); - } - if ($items !== null) { $linkOptions['data-toggle'] = 'dropdown'; Html::addCssClass($options, 'dropdown');