Skip to content

Commit 5fab6ee

Browse files
author
Habib Nurrahman
committed
Improve renderer
1 parent 392edfa commit 5fab6ee

17 files changed

+413
-120
lines changed

README.md

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,65 @@ composer require nurmanhabib/navigator
1616

1717
#### Penggunaan
1818

19-
1. Cukup membuat _object_ `NavCollection` dengan menambahkan beberapa `NavItem`
20-
21-
```php
22-
$menu = new NavCollection;
23-
$menu->addHome();
24-
$menu->addLink('Berita', 'berita');
25-
$menu->addSeparator();
26-
$menu->addParent('Kategori', function (NavCollection $menu) {
27-
$menu->addLink('Teknologi', 'kategori/teknologi');
28-
$menu->addLink('Otomotif', 'kategori/otomotif');
29-
$menu->addParent('Lifestyle', function (NavCollection $menu) {
30-
$menu->addLink('Pria', 'lifestyle-pria');
31-
$menu->addLink('Wanita', 'lifestyle-wanita');
32-
});
33-
});
34-
```
35-
36-
2. Selanjutnya membuat object `Navigator`
37-
38-
```php
39-
$navigator = new Navigator($menu);
40-
```
41-
42-
3. Set NavItem yang aktif berdasarkan url
43-
44-
```php
45-
$navigator->setActive('lifestyle-wanita');
46-
```
47-
48-
4. Render Navigator
49-
50-
```php
51-
return $navigator->render();
52-
```
53-
19+
Cukup membuat _object_ `Nurmanhabib\Navigator\NavCollection` dengan menambahkan beberapa `Nurmanhabib\Navigator\NavItem`
20+
21+
```php
22+
use Nurmanhabib\Navigator\NavCollection;
23+
use Nurmanhabib\Navigator\Navigator;
24+
25+
$menu = new NavCollection;
26+
$menu->addHome();
27+
$menu->addLink('Berita', '/berita')->match('berita*');
28+
$menu->addSeparator();
29+
$menu->addParent('Kategori', function (NavCollection $menu) {
30+
$menu->addLink('Teknologi', '/kategori/teknologi');
31+
$menu->addLink('Otomotif', '/kategori/otomotif');
32+
$menu->addParent('Lifestyle', function (NavCollection $menu) {
33+
$menu->addLink('Pria', '/lifestyle-pria');
34+
$menu->addLink('Wanita', '/lifestyle-wanita');
35+
});
36+
});
37+
38+
$menu->addHeading('Configuration');
39+
$menu->addLink('Application', '/config/app');
40+
41+
$menu->addHeading('Account');
42+
$menu->addLink('My Profile', '/profile');
43+
$menu->addLink('Logout', '/logout');
44+
45+
$navigator = new Navigator($menu);
46+
47+
echo $navigator->render();
48+
```
49+
50+
#### API
51+
52+
1. match
53+
54+
```php
55+
$menu->addLink('Teknologi', 'kategori/teknologi')->match('kategori/*');
56+
```
57+
58+
Item akan aktif untuk path uri berikut:
59+
60+
- `kategori/teknologi`
61+
- `kategori/otomotif`
62+
63+
2. setData
64+
65+
```php
66+
$menu->addLink('Teknologi', 'kategori/teknologi')->setData(['key' => 'value']);
67+
```
68+
69+
Anda bisa menambahkan data pada item menu untuk digunakan pada saat custom render.
70+
71+
3. hasData
72+
```php
73+
$item->hasData('key');
74+
```
75+
76+
4. getData
77+
```php
78+
echo $item->getData('key');
79+
```
80+

src/Activators/LinkActivator.php

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,46 @@
77

88
class LinkActivator extends NavActivator
99
{
10-
protected $url;
10+
protected $uri;
1111

1212
/**
1313
* LinkActivator constructor.
14-
* @param $url
14+
* @param $uri
1515
*/
16-
public function __construct($url)
16+
public function __construct($uri)
1717
{
18-
$this->url = $url;
18+
$this->uri = $uri;
1919
}
2020

2121
public function isActive(Nav $nav)
2222
{
23-
if ($nav instanceof NavModifier) {
24-
return $nav->getOriginalNav()->getUrl() === $this->url;
25-
}
23+
return $this->matchPath($nav) && $this->matchQuery($nav) && $this->matchFragment($nav);
24+
}
25+
26+
protected function matchPath(Nav $nav)
27+
{
28+
$pathPattern = ltrim(parse_url($this->uri, PHP_URL_PATH), '/');
29+
$navPath = ltrim(parse_url($nav->getPattern(), PHP_URL_PATH), '/');
30+
31+
return fnmatch($pathPattern, $navPath) || fnmatch($navPath, $pathPattern);
32+
}
33+
34+
protected function matchQuery(Nav $nav)
35+
{
36+
$expectedQuery = parse_url($this->uri, PHP_URL_QUERY);
37+
$navQuery = parse_url($nav->getPattern(), PHP_URL_QUERY);
38+
39+
parse_str($expectedQuery, $expectedQuery);
40+
parse_str($navQuery, $navQuery);
41+
42+
return empty(array_diff($expectedQuery, $navQuery));
43+
}
44+
45+
protected function matchFragment(Nav $nav)
46+
{
47+
$expectedFragment = parse_url($this->uri, PHP_URL_FRAGMENT);
48+
$navFragment = parse_url($nav->getPattern(), PHP_URL_FRAGMENT);
2649

27-
return $nav->getUrl() === $this->url;
50+
return $expectedFragment === $navFragment;
2851
}
2952
}

src/Activators/RequestActivator.php

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Nurmanhabib\Navigator\Activators;
4+
5+
class RequestUriActivator extends LinkActivator
6+
{
7+
public function __construct()
8+
{
9+
parent::__construct($_SERVER['REQUEST_URI']);
10+
}
11+
}

src/Items/Nav.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public function getChild();
5757
*/
5858
public function setChild(NavCollection $child);
5959

60+
/**
61+
* @return string
62+
*/
63+
public function getPattern();
64+
6065
/**
6166
* @param Nav $nav
6267
* @return Nav
@@ -82,6 +87,7 @@ public function setData(array $data);
8287
public function getData($key = null, $default = null);
8388

8489
/**
90+
* @param $key
8591
* @return array
8692
*/
8793
public function hasData($key);
@@ -92,6 +98,7 @@ public function hasData($key);
9298
public function toArray();
9399

94100
/**
101+
* @param int $options
95102
* @return string
96103
*/
97104
public function toJson($options = 0);

src/Items/NavItem.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ abstract class NavItem implements Nav
1313

1414
protected $visible = true;
1515

16+
protected $pattern;
17+
1618
abstract public function getText();
1719

1820
abstract public function getUrl();
@@ -75,6 +77,22 @@ public function add(Nav $item)
7577
throw new NavChildException($this);
7678
}
7779

80+
public function match($pattern)
81+
{
82+
$this->pattern = $pattern;
83+
84+
return $this;
85+
}
86+
87+
public function getPattern()
88+
{
89+
if (empty($this->pattern)) {
90+
$this->pattern = $this->getUrl();
91+
}
92+
93+
return $this->pattern;
94+
}
95+
7896
public function toJson($options = 0)
7997
{
8098
return json_encode($this->toArray(), $options);

src/Items/NavLink.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ public function getUrl()
2525
return $this->url;
2626
}
2727

28+
public function setIcon($icon)
29+
{
30+
$this->icon = $icon;
31+
32+
return $this;
33+
}
34+
2835
public function getIcon()
2936
{
3037
return $this->icon;

src/Items/NavSeparator.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public function add(Nav $nav)
5454
throw new NavChildException($this);
5555
}
5656

57+
public function getPattern()
58+
{
59+
return '';
60+
}
61+
5762
public function getType()
5863
{
5964
return 'separator';

src/Modifiers/NavModifier.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ public function getData($key = null, $default = null)
9292
return $this->nav->getData($key, $default);
9393
}
9494

95+
public function getPattern()
96+
{
97+
return $this->nav->getPattern();
98+
}
99+
95100
public function toArray()
96101
{
97102
return [

0 commit comments

Comments
 (0)