Skip to content

Commit b829097

Browse files
authored
Merge pull request #2 from nurmanhabib/feature/v5
Feature/v5
2 parents 2ac90f4 + 5fab6ee commit b829097

23 files changed

+511
-177
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+

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
],
1818
"require": {
1919
"php": ">=5.5.9",
20-
"illuminate/support": "5.*"
20+
"ext-json": "*"
2121
},
2222
"autoload": {
2323
"psr-4": {

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/NavActivator.php

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
abstract class NavActivator
1010
{
11-
abstract public function isActive(Nav $nav);
12-
1311
/**
1412
* @param NavCollection $menu
1513
* @return NavCollection
@@ -21,6 +19,20 @@ public function apply(NavCollection $menu)
2119
});
2220
}
2321

22+
public function hasActive(NavCollection $menu)
23+
{
24+
$result = false;
25+
26+
foreach ($menu->getItems() as $nav) {
27+
if ($this->checkActive($nav)) {
28+
$result = true;
29+
break;
30+
}
31+
}
32+
33+
return $result;
34+
}
35+
2436
protected function checkActive(Nav $nav)
2537
{
2638
if ($nav->hasChild()) {
@@ -30,12 +42,11 @@ protected function checkActive(Nav $nav)
3042
return $this->isActive($nav);
3143
}
3244

33-
public function hasActive(NavCollection $menu)
34-
{
35-
return false !== $menu->getItems()->search(function (Nav $nav) {
36-
return $this->checkActive($nav);
37-
});
38-
}
45+
/**
46+
* @param Nav $nav
47+
* @return bool
48+
*/
49+
abstract public function isActive(Nav $nav);
3950

4051
public function makeActive(Nav $nav)
4152
{

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: 12 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);
@@ -90,4 +96,10 @@ public function hasData($key);
9096
* @return array
9197
*/
9298
public function toArray();
99+
100+
/**
101+
* @param int $options
102+
* @return string
103+
*/
104+
public function toJson($options = 0);
93105
}

src/Items/NavItem.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22

33
namespace Nurmanhabib\Navigator\Items;
44

5-
use Illuminate\Contracts\Support\Arrayable;
6-
use Illuminate\Contracts\Support\Jsonable;
75
use Nurmanhabib\Navigator\Exceptions\NavChildException;
86
use Nurmanhabib\Navigator\NavCollection;
97

10-
abstract class NavItem implements Nav, Arrayable, Jsonable
8+
abstract class NavItem implements Nav
119
{
1210
use NavDataTrait;
1311

1412
protected $active = false;
1513

1614
protected $visible = true;
1715

16+
protected $pattern;
17+
1818
abstract public function getText();
1919

2020
abstract public function getUrl();
@@ -77,6 +77,22 @@ public function add(Nav $item)
7777
throw new NavChildException($this);
7878
}
7979

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+
8096
public function toJson($options = 0)
8197
{
8298
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: 10 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';
@@ -65,4 +70,9 @@ public function toArray()
6570
'type' => $this->getType(),
6671
];
6772
}
73+
74+
public function toJson($options = 0)
75+
{
76+
return json_encode($this->toArray(), $options);
77+
}
6878
}

0 commit comments

Comments
 (0)