Skip to content

Commit 189d55e

Browse files
committed
Latte: added filter |absoluteUrl
1 parent db802b8 commit 189d55e

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"require": {
1818
"php": "8.1 - 8.4",
1919
"nette/component-model": "^3.1",
20-
"nette/http": "^3.3",
20+
"nette/http": "^3.3.2",
2121
"nette/routing": "^3.1",
2222
"nette/utils": "^4.0"
2323
},

src/Bridges/ApplicationLatte/UIExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@ public function __construct(
3232

3333
public function getFilters(): array
3434
{
35+
$presenter = $this->control?->getPresenterIfExists();
3536
return [
3637
'modifyDate' => fn($time, $delta, $unit = null) => $time
3738
? Nette\Utils\DateTime::from($time)->modify($delta . $unit)
3839
: null,
39-
];
40+
] + ($presenter ? [
41+
'absoluteUrl' => fn(\Stringable|string|null $link): ?string => $link === null
42+
? null
43+
: $presenter->getHttpRequest()->getUrl()->resolve((string) $link)->getAbsoluteUrl(),
44+
] : []);
4045
}
4146

4247

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
/**
4+
* Test: UIExtension filters
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Tester\Assert;
10+
11+
require __DIR__ . '/../bootstrap.php';
12+
13+
if (version_compare(Latte\Engine::VERSION, '3', '<')) {
14+
Tester\Environment::skip('Test for Latte 3');
15+
}
16+
17+
Tester\Environment::bypassFinals();
18+
19+
20+
$latte = new Latte\Engine;
21+
$latte->addExtension(new Nette\Bridges\ApplicationLatte\UIExtension(null));
22+
23+
$request = Mockery::mock(Nette\Http\IRequest::class);
24+
$request->shouldReceive('getUrl')->andReturn(new Nette\Http\UrlScript('https://nette.org/a/b'));
25+
$request->shouldIgnoreMissing();
26+
27+
$response = Mockery::mock(Nette\Http\IResponse::class);
28+
$response->shouldIgnoreMissing();
29+
30+
$presenter = Mockery::mock(Nette\Application\UI\Presenter::class);
31+
$presenter->shouldReceive('getPresenterIfExists')->andReturn($presenter);
32+
$presenter->shouldReceive('getHttpRequest')->andReturn($request);
33+
$presenter->shouldReceive('getHttpResponse')->andReturn($response);
34+
$presenter->shouldIgnoreMissing();
35+
36+
37+
$latte = new Latte\Engine;
38+
$latte->addExtension(new Nette\Bridges\ApplicationLatte\UIExtension($presenter));
39+
40+
Assert::null($latte->invokeFilter('absoluteUrl', [null]));
41+
Assert::same('https://nette.org/a/b', $latte->invokeFilter('absoluteUrl', ['']));
42+
Assert::same('https://nette.org/a/b#foo', $latte->invokeFilter('absoluteUrl', ['#foo']));
43+
Assert::same('https://nette.org/a/foo', $latte->invokeFilter('absoluteUrl', ['foo']));
44+
Assert::same('https://nette.org/foo', $latte->invokeFilter('absoluteUrl', ['/foo']));
45+
Assert::same('https://foo/', $latte->invokeFilter('absoluteUrl', ['//foo']));
46+
Assert::same('https://foo/', $latte->invokeFilter('absoluteUrl', ['https://foo']));
47+
48+
49+
class Foo
50+
{
51+
public function __toString()
52+
{
53+
return 'foo';
54+
}
55+
}
56+
57+
Assert::same('https://nette.org/a/foo', $latte->invokeFilter('absoluteUrl', [new Foo]));

0 commit comments

Comments
 (0)