Skip to content

Commit b01244b

Browse files
committed
UIExtension: added filter |absoluteUrl
1 parent cee6954 commit b01244b

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public function __construct(
3232

3333
public function getFilters(): array
3434
{
35+
$baseUrl = $this->control?->getPresenterIfExists()?->getHttpRequest()->getUrl();
3536
return [
37+
'absoluteUrl' => fn(\Stringable $link): ?string => $baseUrl?->resolve((string) $link)->getAbsoluteUrl(),
3638
'modifyDate' => fn($time, $delta, $unit = null) => $time
3739
? Nette\Utils\DateTime::from($time)->modify($delta . $unit)
3840
: null,
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
Assert::same(null, $latte->invokeFilter('absoluteUrl', ['']));
24+
25+
26+
$request = Mockery::mock(Nette\Http\IRequest::class);
27+
$request->shouldReceive('getUrl')->andReturn(new Nette\Http\UrlScript('https://nette.org/a/b'));
28+
$request->shouldIgnoreMissing();
29+
30+
$response = Mockery::mock(Nette\Http\IResponse::class);
31+
$response->shouldIgnoreMissing();
32+
33+
$presenter = Mockery::mock(Nette\Application\UI\Presenter::class);
34+
$presenter->shouldReceive('getPresenterIfExists')->andReturn($presenter);
35+
$presenter->shouldReceive('getHttpRequest')->andReturn($request);
36+
$presenter->shouldReceive('getHttpResponse')->andReturn($response);
37+
$presenter->shouldIgnoreMissing();
38+
39+
40+
$latte = new Latte\Engine;
41+
$latte->addExtension(new Nette\Bridges\ApplicationLatte\UIExtension($presenter));
42+
43+
Assert::same('https://nette.org/a/b', $latte->invokeFilter('absoluteUrl', ['']));
44+
Assert::same('https://nette.org/a/b#foo', $latte->invokeFilter('absoluteUrl', ['#foo']));
45+
Assert::same('https://nette.org/a/foo', $latte->invokeFilter('absoluteUrl', ['foo']));
46+
Assert::same('https://nette.org/foo', $latte->invokeFilter('absoluteUrl', ['/foo']));
47+
Assert::same('https://foo/', $latte->invokeFilter('absoluteUrl', ['//foo']));
48+
Assert::same('https://foo/', $latte->invokeFilter('absoluteUrl', ['https://foo']));
49+
50+
51+
class Foo
52+
{
53+
public function __toString()
54+
{
55+
return 'foo';
56+
}
57+
}
58+
59+
Assert::same('https://nette.org/a/foo', $latte->invokeFilter('absoluteUrl', [new Foo]));

0 commit comments

Comments
 (0)