From 7c2ef656155d3ce1035f43a8f3b1761cd8421bbf Mon Sep 17 00:00:00 2001 From: Art Avd Date: Tue, 12 Jan 2021 17:30:31 +0500 Subject: [PATCH] Impove code for dropdown menu generation --- src/Nav.php | 61 ++++++++++++++++++----------------------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/src/Nav.php b/src/Nav.php index 769722d..c8d7783 100644 --- a/src/Nav.php +++ b/src/Nav.php @@ -18,19 +18,20 @@ final class Nav extends Widget private bool $activateItems = true; private bool $activateParents = false; private string $currentPath = ''; - private bool $dropdown = false; private bool $encodeLabels = true; private array $items = []; protected function run(): string { - $html = $this->renderItems(); + $items = []; - if ($this->dropdown) { - $html .= Html::endTag('div'); + foreach ($this->items as $item) { + if (!isset($item['visible']) || $item['visible']) { + $items[] = $this->renderItem($item); + } } - return $html; + return implode("\n", $items); } /** @@ -136,14 +137,14 @@ public function items(array $value): self private function renderDropdown(array $items, array $parentItem): string { return Dropdown::widget() - ->dividerClass('navbar-divider') - ->itemClass('navbar-item') - ->itemsClass('navbar-dropdown') - ->encloseByContainer(false) - ->encodeLabels($this->encodeLabels) - ->items($items) - ->itemsOptions(ArrayHelper::getValue($parentItem, 'dropdownOptions', [])) - ->render() . "\n"; + ->dividerClass('navbar-divider') + ->itemClass('navbar-item') + ->itemsClass('navbar-dropdown') + ->encloseByContainer(false) + ->encodeLabels($this->encodeLabels) + ->items($items) + ->itemsOptions(ArrayHelper::getValue($parentItem, 'dropdownOptions', [])) + ->render() . "\n"; } /** @@ -218,26 +219,6 @@ private function renderIcon(string $label, string $icon, array $iconOptions): st return $label; } - /** - * Renders widget items. - * - * @throws InvalidArgumentException|JsonException - * - * @return string - */ - private function renderItems(): string - { - $items = []; - - foreach ($this->items as $item) { - if (!isset($item['visible']) || $item['visible']) { - $items[] = $this->renderItem($item); - } - } - - return implode("\n", $items); - } - /** * Renders a widget's item. * @@ -252,7 +233,7 @@ private function renderItem(array $item): string if (!isset($item['label'])) { throw new InvalidArgumentException('The "label" option is required.'); } - + $dropdown = false; $this->encodeLabels = $item['encode'] ?? $this->encodeLabels; if ($this->encodeLabels) { @@ -280,7 +261,7 @@ private function renderItem(array $item): string $active = $this->isItemActive($item); if (isset($items)) { - $this->dropdown = true; + $dropdown = true; Html::addCssClass($options, 'navbar-item has-dropdown is-hoverable'); @@ -301,12 +282,12 @@ private function renderItem(array $item): string Html::addCssClass($linkOptions, 'is-active'); } - - if ($this->dropdown) { + if ($dropdown) { return - html::beginTag('div', $options) . "\n" . - Html::a($label, $url, ['class' => 'navbar-link']) . "\n" . - $items; + Html::beginTag('div', $options) . "\n" . + Html::a($label, $url, ['class' => 'navbar-link']) . "\n" . + $items . + Html::endTag('div'); } return Html::a($label, $url, $linkOptions);