diff --git a/README.md b/README.md index 39d0cd6..c39f585 100644 --- a/README.md +++ b/README.md @@ -51,10 +51,10 @@ class MainMenu extends \Tatter\Menus\Menu public function get(): string { return $this->builder - ->link('/', 'Home') - ->link('/about', 'About') + ->link(site_url('/'), 'Home') + ->link(site_url('/about'), 'About') ->html('
') - ->link('/contact', 'Contact') + ->link(site_url('/contact'), 'Contact') ->render(); } } @@ -68,6 +68,11 @@ class FruitMenu extends \Tatter\Menus\Menu } ``` +Note: `$builder` is initialized with "set active" to the current URL. You may call `setActive()` +again to remove or change the active menu item. Due to a limitation in `Spatie\Menu` with mixing +relative and absolute URLs you must supply full URL values (e.g. with `site_url()`) to your +`Menu` if you want to use this default "active" URL. + ### Deploying Since `Menu->get()` returns a `string` it can be used in your view or layout files as is. diff --git a/src/Menu.php b/src/Menu.php index ebcc75b..4d0b30f 100644 --- a/src/Menu.php +++ b/src/Menu.php @@ -2,7 +2,6 @@ use CodeIgniter\HTTP\URI; use Spatie\Menu\Menu as BaseMenu; -use Tatter\Menus\Interfaces\MenuInterface; /** * Menu Class @@ -22,21 +21,33 @@ abstract class Menu /** * Initializes the Spatie Menu and * sets the current URL to be "active". + * Calls any additional functions + * from traits. * * @param BaseMenu|null $builder */ public function __construct(BaseMenu $builder = null) { - $this->builder = $builder ?? BaseMenu::new()->setActive( - current_url(true)->getPath(), - (new URI(base_url()))->getPath() ?? '/' - ); + $this->builder = $builder ?? BaseMenu::new()->setActive( + current_url(), + (new URI(base_url()))->getPath() ?? '/' + ); + + foreach (class_uses_recursive($this) as $trait) + { + $method = 'apply' . class_basename($trait); + + if (method_exists($this, $method)) + { + $this->$method(); + } + } } /** * Returns the underlying Spatie Menu. */ - public function builder(): BaseMenu + public function builder(): BaseMenu { return $this->builder; } diff --git a/src/Traits/Bootstrap.php b/src/Traits/Bootstrap.php new file mode 100644 index 0000000..14635a4 --- /dev/null +++ b/src/Traits/Bootstrap.php @@ -0,0 +1,22 @@ +builder->registerFilter(function (Link $link) { + $link->addParentClass('nav-item'); + $link->addClass('nav-link'); + }); + } +} diff --git a/tests/_support/MenusTestCase.php b/tests/_support/MenusTestCase.php index c482d70..782ca55 100644 --- a/tests/_support/MenusTestCase.php +++ b/tests/_support/MenusTestCase.php @@ -1,7 +1,10 @@ baseURL = 'http://example.com'; + $config->indexPage = ''; + Factories::injectMock('config', 'App', $config); + + // Set a current URL for checking "active" links + $request = Services::request(); + $request->uri = new URI(site_url('current')); + Services::injectMock('request', $request); + + // Create some Menu aliases for testing $config = new MenusConfig(); $config->aliases = [ 'test' => TestMenu::class, diff --git a/tests/menu/MenuTest.php b/tests/menu/MenuTest.php index c19b011..37f0441 100644 --- a/tests/menu/MenuTest.php +++ b/tests/menu/MenuTest.php @@ -1,7 +1,5 @@ uri = new URI('http://example.com/bulgar'); - Services::injectMock('request', $request); - $this->menu = new class extends Menu { public function get(): string { return $this->builder - ->link('/', 'Home') - ->link('/bulgar', 'Grain') + ->link(site_url('/'), 'Home') + ->link(site_url('/current'), 'Grain') ->render(); } }; @@ -46,7 +40,7 @@ public function testGetBuilder() public function testUsesBuilder() { - $menu = new class(BaseMenu::new()->link('/home', 'asparagus')) extends Menu { + $menu = new class(BaseMenu::new()->link(site_url('/home'), 'asparagus')) extends Menu { public function get(): string { @@ -56,12 +50,12 @@ public function get(): string $result = $menu->get(); - $this->assertSame('', $result); + $this->assertSame('', $result); } public function testGetUsesCurrentUrl() { - $expected = ''; + $expected = ''; $result = $this->menu->get(); $this->assertSame($expected, $result); diff --git a/tests/menu/TraitsTest.php b/tests/menu/TraitsTest.php new file mode 100644 index 0000000..a87ab06 --- /dev/null +++ b/tests/menu/TraitsTest.php @@ -0,0 +1,29 @@ +builder + ->link(site_url('/'), 'Home') + ->link(site_url('/current'), 'Grain') + ->render(); + } + }; + + $result = $menu->get(); + + $this->assertStringContainsString('li class="nav-item"', $result); + $this->assertStringContainsString('class="nav-link"', $result); + } +}