From 4d7947aa1bdc94405b9b4eac6a07a6b62919799d Mon Sep 17 00:00:00 2001 From: Andrej Rypo Date: Tue, 24 Mar 2020 13:43:29 +0100 Subject: [PATCH] LinkGenerator: allow semicolon destination prefix --- src/Application/LinkGenerator.php | 7 +++++++ tests/Routers/LinkGenerator.phpt | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/Application/LinkGenerator.php b/src/Application/LinkGenerator.php index 803300779..ec8d90531 100644 --- a/src/Application/LinkGenerator.php +++ b/src/Application/LinkGenerator.php @@ -50,6 +50,13 @@ public function link(string $dest, array $params = []): string } [, $presenter, $action, $frag] = $m; + if ($presenter[0] === ':') { // absolute + $presenter = substr($presenter, 1); + if (!$presenter) { + throw new UI\InvalidLinkException("Missing presenter name in '$dest'."); + } + } + try { $class = $this->presenterFactory ? $this->presenterFactory->getPresenterClass($presenter) : null; } catch (InvalidPresenterException $e) { diff --git a/tests/Routers/LinkGenerator.phpt b/tests/Routers/LinkGenerator.phpt index e3f1787c9..fe1d95174 100644 --- a/tests/Routers/LinkGenerator.phpt +++ b/tests/Routers/LinkGenerator.phpt @@ -52,9 +52,13 @@ namespace { test(function () use ($pf) { $generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/'), $pf); Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default')); + Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default')); Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default')); + Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default')); Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:')); + Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:')); Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:')); + Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:')); Assert::same('http://nette.org/en/?a=10&action=default&presenter=Homepage', $generator->link('Homepage:', [10])); Assert::same('http://nette.org/en/?id=20&b=10&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20])); Assert::same('http://nette.org/en/?action=default&presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment')); @@ -68,6 +72,18 @@ namespace { }, Nette\Application\UI\InvalidLinkException::class, "Invalid link destination 'default'."); + Assert::exception(function () use ($pf) { + $generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf); + $generator->link(':'); + }, Nette\Application\UI\InvalidLinkException::class, 'Invalid link destination \':\'.'); + + + Assert::exception(function () use ($pf) { + $generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf); + $generator->link('::'); + }, Nette\Application\UI\InvalidLinkException::class, 'Missing presenter name in \'::\'.'); + + Assert::exception(function () use ($pf) { $generator = new LinkGenerator(new Routers\Route('/', 'Product:'), new Http\UrlScript('http://nette.org/en/'), $pf); $generator->link('Homepage:default', ['id' => 10]); @@ -83,9 +99,13 @@ namespace { test(function () { $generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/')); Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default')); + Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default')); Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default')); + Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default')); Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:')); + Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:')); Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link('Homepage:')); + Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link(':Homepage:')); Assert::same('http://nette.org/en/?0=10&presenter=Homepage', $generator->link('Homepage:', [10])); Assert::same('http://nette.org/en/?0=10&id=20&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20])); Assert::same('http://nette.org/en/?presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment'));