Skip to content

Commit 503817e

Browse files
committed
Support nested submenus with active classes
1 parent fc27444 commit 503817e

2 files changed

Lines changed: 71 additions & 23 deletions

File tree

spec/Menu/MenuGeneratorSpec.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,62 @@ function it_generates_submenu_items()
344344
$menu->getItems()->shouldReturn($items);
345345
}
346346

347+
function it_generates_nested_submenu_items_with_active_classes()
348+
{
349+
// Generate new menu
350+
$menu = $this->make([
351+
'home' => [],
352+
'pages' => [
353+
'submenu' => [
354+
'about' => [
355+
'submenu' => [
356+
'company' => ['url' => 'company']
357+
]
358+
]
359+
]
360+
]
361+
]);
362+
363+
$items = [
364+
'home' => [
365+
'class' => '',
366+
'submenu' => null,
367+
'id' => 'home',
368+
'active' => false,
369+
'title' => 'Home',
370+
'url' => '#'
371+
],
372+
'pages' => [
373+
'class' => 'active dropdown',
374+
'submenu' =>[
375+
'about' => [
376+
'class' => 'active dropdown',
377+
'submenu' => [
378+
'company' => [
379+
'class' => 'active',
380+
'submenu' => null,
381+
'id' => 'company',
382+
'active' => true,
383+
'url' => null,
384+
'title' => 'Company'
385+
],
386+
],
387+
'id' => 'about',
388+
'active' => true,
389+
'title' => 'About',
390+
'url' => '#',
391+
'id' => 'about'
392+
],
393+
],
394+
'id' => 'pages',
395+
'active' => true,
396+
'title' => 'Pages',
397+
'url' => '#'
398+
]
399+
];
400+
$menu->getItems()->shouldReturn($items);
401+
}
402+
347403
function it_supports_the_exact_option_to_set_active_menu_items($url)
348404
{
349405
$url->current()->shouldBeCalled()->willReturn('http://example/contact/london');

src/Menu/Menu.php

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,9 @@ public function checkAccess(array $options)
292292
* This method will called itself if an item has a 'submenu' key.
293293
*
294294
* @param array $items
295-
* @param array|null $parentItem
296295
* @return array
297296
*/
298-
protected function generateItems($items, &$parentItem = null)
297+
protected function generateItems($items)
299298
{
300299
foreach ($items as $id => &$values) {
301300
$values = $this->setDefaultValues($id, $values);
@@ -309,13 +308,22 @@ protected function generateItems($items, &$parentItem = null)
309308

310309
$values['url'] = $this->generateUrl($values);
311310

312-
if ($this->isActiveUrl($values)) {
313-
$this->markAsActive($values, $parentItem);
314-
$this->currentId = $id;
311+
if (isset($values['submenu'])) {
312+
$values['submenu'] = $this->generateItems($values['submenu']);
315313
}
316314

317-
if (isset($values['submenu'])) {
318-
$values['submenu'] = $this->generateItems($values['submenu'], $values);
315+
if ($this->isActiveUrl($values)) {
316+
$values['active'] = true;
317+
$this->currentId = $id;
318+
} elseif (isset ($values['submenu'])) {
319+
// Check if there is an active item in the submenu, if
320+
// so it'll mark the current item as active as well.
321+
foreach ($values['submenu'] as $subitem) {
322+
if ($subitem['active']) {
323+
$values['active'] = true;
324+
break;
325+
}
326+
}
319327
}
320328

321329
if ($values['active']) {
@@ -377,22 +385,6 @@ protected function isActiveUrl(array $values)
377385
return strpos($this->activeUrl, $values['url']) === 0;
378386
}
379387

380-
/**
381-
* Marks an item an it's optional parent item as active
382-
*
383-
* @param array $values
384-
* @param array|null $parentItem
385-
*/
386-
protected function markAsActive(&$values, &$parentItem = null)
387-
{
388-
// Set this item as active
389-
$values['active'] = true;
390-
// If this is a submenu, set the parent's item as active as well
391-
if ($parentItem != null) {
392-
$parentItem['active'] = true;
393-
}
394-
}
395-
396388
/**
397389
* Returns the menu's title. The title is determined following this order:
398390
*

0 commit comments

Comments
 (0)