Skip to content

Commit aed45d9

Browse files
committed
Presenter: support for templates without /template folder
1 parent 4aa67d9 commit aed45d9

File tree

6 files changed

+104
-30
lines changed

6 files changed

+104
-30
lines changed

src/Application/UI/Presenter.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -562,18 +562,28 @@ public function formatLayoutTemplateFiles(): array
562562
return [$this->layout];
563563
}
564564

565-
[$module, $presenter] = Helpers::splitName($this->getName());
566565
$layout = $this->layout ?: 'layout';
567566
$dir = dirname(static::getReflection()->getFileName());
568-
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
567+
$levels = substr_count($this->getName(), ':');
568+
if (!is_dir("$dir/templates")) {
569+
$dir = dirname($origDir = $dir);
570+
if (!is_dir("$dir/templates")) {
571+
$list = ["$origDir/@$layout.latte"];
572+
do {
573+
$list[] = "$dir/@$layout.latte";
574+
} while ($levels-- && ($dir = dirname($dir)));
575+
return $list;
576+
}
577+
}
578+
579+
[, $presenter] = Helpers::splitName($this->getName());
569580
$list = [
570581
"$dir/templates/$presenter/@$layout.latte",
571582
"$dir/templates/$presenter.@$layout.latte",
572583
];
573584
do {
574585
$list[] = "$dir/templates/@$layout.latte";
575-
$dir = dirname($dir);
576-
} while ($dir && $module && ([$module] = Helpers::splitName($module)));
586+
} while ($levels-- && ($dir = dirname($dir)));
577587

578588
return $list;
579589
}
@@ -584,9 +594,17 @@ public function formatLayoutTemplateFiles(): array
584594
*/
585595
public function formatTemplateFiles(): array
586596
{
587-
[, $presenter] = Helpers::splitName($this->getName());
588597
$dir = dirname(static::getReflection()->getFileName());
589-
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
598+
if (!is_dir("$dir/templates")) {
599+
$dir = dirname($origDir = $dir);
600+
if (!is_dir("$dir/templates")) {
601+
return [
602+
"$origDir/$this->view.latte",
603+
];
604+
}
605+
}
606+
607+
[, $presenter] = Helpers::splitName($this->getName());
590608
return [
591609
"$dir/templates/$presenter/$this->view.latte",
592610
"$dir/templates/$presenter.$this->view.latte",

tests/UI/Presenter.formatLayoutTemplateFiles.phpt

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ use Tester\Assert;
1111

1212
require __DIR__ . '/../bootstrap.php';
1313
require __DIR__ . '/one/APresenter.php';
14-
require __DIR__ . '/two/BPresenter.php';
14+
require __DIR__ . '/one/sub/BPresenter.php';
15+
require __DIR__ . '/two/CPresenter.php';
1516

1617

1718
test('with subdir templates', function () {
@@ -27,14 +28,26 @@ test('with subdir templates', function () {
2728
});
2829

2930

30-
test('without subdir templates', function () {
31+
test('with parent-dir templates', function () {
3132
$presenter = new BPresenter;
33+
$presenter->setParent(null, 'One');
34+
$presenter->setLayout('my');
35+
36+
Assert::same([
37+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One/@my.latte',
38+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/[email protected]',
39+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/@my.latte',
40+
], $presenter->formatLayoutTemplateFiles());
41+
});
42+
43+
44+
test('without subdir templates', function () {
45+
$presenter = new CPresenter;
3246
$presenter->setParent(null, 'Two');
3347

3448
Assert::same([
35-
__DIR__ . '/templates/Two/@layout.latte',
36-
__DIR__ . '/templates/[email protected]',
37-
__DIR__ . '/templates/@layout.latte',
49+
__DIR__ . DIRECTORY_SEPARATOR . 'two/@layout.latte',
50+
__DIR__ . '/@layout.latte',
3851
], $presenter->formatLayoutTemplateFiles());
3952
});
4053

@@ -53,16 +66,29 @@ test('with module & subdir templates', function () {
5366
});
5467

5568

56-
test('with module & without subdir templates', function () {
69+
test('with module & parent-dir templates', function () {
5770
$presenter = new BPresenter;
58-
$presenter->setParent(null, 'Module:SubModule:Two');
71+
$presenter->setParent(null, 'Module:SubModule:One');
5972

6073
Assert::same([
61-
__DIR__ . '/templates/Two/@layout.latte',
62-
__DIR__ . '/templates/[email protected]',
74+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One/@layout.latte',
75+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/[email protected]',
76+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/@layout.latte',
6377
__DIR__ . '/templates/@layout.latte',
6478
dirname(__DIR__) . '/templates/@layout.latte',
65-
dirname(__DIR__, 2) . '/templates/@layout.latte',
79+
], $presenter->formatLayoutTemplateFiles());
80+
});
81+
82+
83+
test('with module & without subdir templates', function () {
84+
$presenter = new CPresenter;
85+
$presenter->setParent(null, 'Module:SubModule:Two');
86+
87+
Assert::same([
88+
__DIR__ . DIRECTORY_SEPARATOR . 'two/@layout.latte',
89+
__DIR__ . '/@layout.latte',
90+
dirname(__DIR__) . '/@layout.latte',
91+
dirname(__DIR__, 2) . '/@layout.latte',
6692
], $presenter->formatLayoutTemplateFiles());
6793
});
6894

tests/UI/Presenter.formatTemplateFiles.phpt

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ use Tester\Assert;
1111

1212
require __DIR__ . '/../bootstrap.php';
1313
require __DIR__ . '/one/APresenter.php';
14-
require __DIR__ . '/two/BPresenter.php';
14+
require __DIR__ . '/one/sub/BPresenter.php';
15+
require __DIR__ . '/two/CPresenter.php';
1516

1617

1718
test('with subdir templates', function () {
@@ -26,14 +27,25 @@ test('with subdir templates', function () {
2627
});
2728

2829

29-
test('without subdir templates', function () {
30+
test('with parent-dir templates', function () {
3031
$presenter = new BPresenter;
32+
$presenter->setParent(null, 'One');
33+
$presenter->setView('view');
34+
35+
Assert::same([
36+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One/view.latte',
37+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One.view.latte',
38+
], $presenter->formatTemplateFiles());
39+
});
40+
41+
42+
test('without subdir templates', function () {
43+
$presenter = new CPresenter;
3144
$presenter->setParent(null, 'Two');
3245
$presenter->setView('view');
3346

3447
Assert::same([
35-
__DIR__ . '/templates/Two/view.latte',
36-
__DIR__ . '/templates/Two.view.latte',
48+
__DIR__ . DIRECTORY_SEPARATOR . 'two/view.latte',
3749
], $presenter->formatTemplateFiles());
3850
});
3951

@@ -50,13 +62,24 @@ test('with module & subdir templates', function () {
5062
});
5163

5264

53-
test('with module & without subdir templates', function () {
65+
test('with module & parent-dir templates', function () {
5466
$presenter = new BPresenter;
67+
$presenter->setParent(null, 'Module:One');
68+
$presenter->setView('view');
69+
70+
Assert::same([
71+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One/view.latte',
72+
__DIR__ . DIRECTORY_SEPARATOR . 'one/templates/One.view.latte',
73+
], $presenter->formatTemplateFiles());
74+
});
75+
76+
77+
test('with module & without subdir templates', function () {
78+
$presenter = new CPresenter;
5579
$presenter->setParent(null, 'Module:Two');
5680
$presenter->setView('view');
5781

5882
Assert::same([
59-
__DIR__ . '/templates/Two/view.latte',
60-
__DIR__ . '/templates/Two.view.latte',
83+
__DIR__ . DIRECTORY_SEPARATOR . 'two/view.latte',
6184
], $presenter->formatTemplateFiles());
6285
});

tests/UI/one/sub/BPresenter.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
class BPresenter extends Nette\Application\UI\Presenter
6+
{
7+
}

tests/UI/two/BPresenter.php

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/UI/two/CPresenter.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
class CPresenter extends Nette\Application\UI\Presenter
6+
{
7+
}

0 commit comments

Comments
 (0)