diff --git a/Nav.php b/Nav.php index 7bd411c..b50ad7f 100644 --- a/Nav.php +++ b/Nav.php @@ -192,9 +192,7 @@ class Nav extends Widget $label .= ' ' . $this->dropDownCaret; } if (is_array($items)) { - if ($this->activateItems) { - $items = $this->isChildActive($items, $active); - } + $items = $this->isChildActive($items, $active); $items = $this->renderDropdown($items, $item); } } @@ -258,6 +256,9 @@ class Nav extends Widget */ protected function isItemActive($item) { + if (!$this->activateItems) { + return false; + } if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) { $route = $item['url'][0]; if ($route[0] !== '/' && Yii::$app->controller) { diff --git a/tests/NavTest.php b/tests/NavTest.php index f70296d..c6df667 100644 --- a/tests/NavTest.php +++ b/tests/NavTest.php @@ -1,7 +1,10 @@ mockWebApplication([ + 'components' => [ + 'request' => [ + 'class' => 'yii\web\Request', + 'scriptUrl' => '/base/index.php', + 'hostInfo' => 'http://example.com/', + 'url' => '/base/index.php&r=site%2Fcurrent&id=42' + ], + 'urlManager' => [ + 'class' => 'yii\web\UrlManager', + 'baseUrl' => '/base', + 'scriptUrl' => '/base/index.php', + 'hostInfo' => 'http://example.com/', + ] + ], + ]); + } + public function testIds() { Nav::$counter = 0; @@ -125,27 +148,150 @@ EXPECTED; */ public function testExplicitActive() { + $this->mockAction('site', 'index'); + Nav::$counter = 0; $out = Nav::widget([ 'activateItems' => false, 'items' => [ [ 'label' => 'Item1', - //'url' => ['some/route1'], 'active' => true, ], [ 'label' => 'Item2', - //'url' => ['some/route2'], + 'url' => ['site/index'], + ], + ], + ]); + + $expected = <<
  • Item1
  • +
  • Item2
  • +EXPECTED; + + $this->assertEqualsWithoutLE($expected, $out); + $this->removeMockedAction(); + } + + /** + * @see https://github.com/yiisoft/yii2-bootstrap/issues/162 + */ + public function testImplicitActive() + { + $this->mockAction('site', 'index'); + + Nav::$counter = 0; + $out = Nav::widget([ + 'items' => [ + [ + 'label' => 'Item1', + 'active' => true, + ], + [ + 'label' => 'Item2', + 'url' => ['site/index'], ], ], ]); $expected = <<
  • Item1
  • -
  • Item2
  • +
  • Item2
  • +EXPECTED; + + $this->assertEqualsWithoutLE($expected, $out); + $this->removeMockedAction(); + } + + /** + * @see https://github.com/yiisoft/yii2-bootstrap/issues/162 + */ + public function testExplicitActiveSubitems() + { + $this->mockAction('site', 'index'); + + Nav::$counter = 0; + $out = Nav::widget([ + 'activateItems' => false, + 'items' => [ + [ + 'label' => 'Item1', + ], + [ + 'label' => 'Item2', + 'items' => [ + ['label' => 'Page2', 'content' => 'Page2', 'url' => ['site/index']], + ['label' => 'Page3', 'content' => 'Page3', 'active' => true], + ], + ], + ], + ]); + + $expected = <<
  • Item1
  • + +EXPECTED; + + $this->assertEqualsWithoutLE($expected, $out); + $this->removeMockedAction(); + } + + /** + * @see https://github.com/yiisoft/yii2-bootstrap/issues/162 + */ + public function testImplicitActiveSubitems() + { + $this->mockAction('site', 'index'); + + Nav::$counter = 0; + $out = Nav::widget([ + 'items' => [ + [ + 'label' => 'Item1', + ], + [ + 'label' => 'Item2', + 'items' => [ + ['label' => 'Page2', 'content' => 'Page2', 'url' => ['site/index']], + ['label' => 'Page3', 'content' => 'Page3', 'active' => true], + ], + ], + ], + ]); + + $expected = <<
  • Item1
  • + EXPECTED; $this->assertEqualsWithoutLE($expected, $out); + $this->removeMockedAction(); } + + /** + * Mocks controller action with parameters + * + * @param string $controllerId + * @param string $actionID + * @param string $moduleID + * @param array $params + */ + protected function mockAction($controllerId, $actionID, $moduleID = null, $params = []) + { + \Yii::$app->controller = $controller = new Controller($controllerId, \Yii::$app); + $controller->actionParams = $params; + $controller->action = new Action($actionID, $controller); + + if ($moduleID !== null) { + $controller->module = new Module($moduleID); + } + } + + protected function removeMockedAction() + { + \Yii::$app->controller = null; + } }