Skip to content

Commit 254fb64

Browse files
authored
Fix currentAsLink not working when determining state via voters. (#328)
The renderer was checking the items "current" state using its `isCurrent()` method instead of the matcher, hence it would only work when the state was manually set on the item via its `setCurrent()` method.
1 parent 85b6546 commit 254fb64

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/Knp/Menu/Renderer/ListRenderer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ protected function renderItem(ItemInterface $item, array $options): string
188188
*/
189189
protected function renderLink(ItemInterface $item, array $options = []): string
190190
{
191-
if ($item->getUri() && (!$item->isCurrent() || $options['currentAsLink'])) {
191+
if ($item->getUri() && (!$this->matcher->isCurrent($item) || $options['currentAsLink'])) {
192192
$text = $this->renderLinkElement($item, $options);
193193
} else {
194194
$text = $this->renderSpanElement($item, $options);

tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Knp\Menu\Matcher\Matcher;
66
use Knp\Menu\Matcher\MatcherInterface;
7+
use Knp\Menu\Matcher\Voter\UriVoter;
78
use Knp\Menu\MenuFactory;
89
use Knp\Menu\MenuItem;
910
use Knp\Menu\Tests\MenuTestCase;
@@ -223,6 +224,18 @@ public function testRenderWithCurrentItemAsLink(): void
223224
$this->assertEquals($rendered, $this->renderer->render($menu));
224225
}
225226

227+
public function testRenderWithCurrentItemAsLinkUsingMatcherWithVoters(): void
228+
{
229+
$matcher = new Matcher([new UriVoter('/about')]);
230+
$this->renderer = $this->createRenderer($matcher);
231+
232+
$menu = new MenuItem('test', new MenuFactory());
233+
$menu->addChild('About', ['uri' => '/about']);
234+
235+
$rendered = '<ul><li class="current first last"><a href="/about">About</a></li></ul>';
236+
$this->assertEquals($rendered, $this->renderer->render($menu));
237+
}
238+
226239
public function testRenderWithCurrentItemNotAsLink(): void
227240
{
228241
$menu = new MenuItem('test', new MenuFactory());
@@ -233,6 +246,18 @@ public function testRenderWithCurrentItemNotAsLink(): void
233246
$this->assertEquals($rendered, $this->renderer->render($menu, ['currentAsLink' => false]));
234247
}
235248

249+
public function testRenderWithCurrentItemNotAsLinkUsingMatcherWithVoters(): void
250+
{
251+
$matcher = new Matcher([new UriVoter('/about')]);
252+
$this->renderer = $this->createRenderer($matcher);
253+
254+
$menu = new MenuItem('test', new MenuFactory());
255+
$menu->addChild('About', ['uri' => '/about']);
256+
257+
$rendered = '<ul><li class="current first last"><span>About</span></li></ul>';
258+
$this->assertEquals($rendered, $this->renderer->render($menu, ['currentAsLink' => false]));
259+
}
260+
236261
public function testRenderSubMenuPortionWithClassAndTitle(): void
237262
{
238263
$this->pt2->setChildrenAttribute('class', 'parent2_class')->setChildrenAttribute('title', 'parent2 title');

0 commit comments

Comments
 (0)