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);
+ }
+}