Skip to content

Commit c5ecbda

Browse files
committed
LatteExtension: added option 'variables'
1 parent 0aecfbe commit c5ecbda

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

src/Bridges/ApplicationDI/LatteExtension.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public function getConfigSchema(): Nette\Schema\Schema
3838
'strictTypes' => Expect::bool(false),
3939
'strictParsing' => Expect::bool(false),
4040
'phpLinter' => Expect::string(),
41+
'variables' => Expect::array([]),
4142
]);
4243
}
4344

@@ -75,8 +76,10 @@ public function loadConfiguration(): void
7576
}
7677

7778
$builder->addDefinition($this->prefix('templateFactory'))
78-
->setFactory(ApplicationLatte\TemplateFactory::class)
79-
->setArguments(['templateClass' => $config->templateClass]);
79+
->setFactory(ApplicationLatte\TemplateFactory::class, [
80+
'templateClass' => $config->templateClass,
81+
'configVars' => $config->variables,
82+
]);
8083

8184
if ($this->name === 'latte') {
8285
$builder->addAlias('nette.latteFactory', $this->prefix('latteFactory'));

src/Bridges/ApplicationLatte/DefaultTemplate.php

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ final class DefaultTemplate extends Template
2929

3030
/** @var \stdClass[] */
3131
public array $flashes = [];
32+
public \stdClass $config;
3233

3334

3435
/**

src/Bridges/ApplicationLatte/TemplateFactory.php

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public function __construct(
2828
private readonly ?Nette\Http\IRequest $httpRequest = null,
2929
private readonly ?Nette\Security\User $user = null,
3030
$templateClass = null,
31+
private array $configVars = [],
3132
) {
3233
if ($templateClass && (!class_exists($templateClass) || !is_a($templateClass, Template::class, true))) {
3334
throw new Nette\InvalidArgumentException("Class $templateClass does not implement " . Template::class . ' or it does not exist.');
@@ -63,6 +64,7 @@ public function createTemplate(?UI\Control $control = null, ?string $class = nul
6364
'flashes' => $flashes,
6465
'control' => $control,
6566
'presenter' => $presenter,
67+
'config' => $control instanceof UI\Presenter && $this->configVars ? (object) $this->configVars : null,
6668
];
6769

6870
foreach ($params as $key => $value) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
/**
4+
* Test: LatteExtension v3
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Nette\DI;
10+
use Tester\Assert;
11+
12+
require __DIR__ . '/../bootstrap.php';
13+
14+
Tester\Environment::bypassFinals();
15+
16+
17+
test('no variables', function () {
18+
$loader = new DI\Config\Loader;
19+
$config = $loader->load(Tester\FileMock::create('
20+
latte:
21+
variables:
22+
', 'neon'));
23+
24+
$compiler = new DI\Compiler;
25+
$compiler->addExtension('latte', new Nette\Bridges\ApplicationDI\LatteExtension('', false));
26+
$code = $compiler
27+
->addConfig($config)
28+
->setClassName('Container1')
29+
->compile();
30+
eval($code);
31+
32+
$container = new Container1;
33+
$latteFactory = $container->getService('latte.templateFactory');
34+
$presenter = Mockery::mock(Nette\Application\UI\Presenter::class);
35+
$presenter->shouldReceive('getHttpResponse')->andReturn(Mockery::mock(Nette\Http\IResponse::class)->shouldIgnoreMissing());
36+
$presenter->shouldIgnoreMissing();
37+
38+
$template = $latteFactory->createTemplate($presenter);
39+
Assert::notContains('config', $template->getParameters());
40+
});
41+
42+
43+
test('presenter presence', function () {
44+
$loader = new DI\Config\Loader;
45+
$config = $loader->load(Tester\FileMock::create('
46+
latte:
47+
variables:
48+
foo: bar
49+
', 'neon'));
50+
51+
$compiler = new DI\Compiler;
52+
$compiler->addExtension('latte', new Nette\Bridges\ApplicationDI\LatteExtension('', false));
53+
$code = $compiler
54+
->addConfig($config)
55+
->setClassName('Container2')
56+
->compile();
57+
eval($code);
58+
59+
$container = new Container2;
60+
$latteFactory = $container->getService('latte.templateFactory');
61+
$template = $latteFactory->createTemplate();
62+
Assert::notContains('config', $template->getParameters());
63+
64+
65+
$presenter = Mockery::mock(Nette\Application\UI\Presenter::class);
66+
$presenter->shouldReceive('getHttpResponse')->andReturn(Mockery::mock(Nette\Http\IResponse::class)->shouldIgnoreMissing());
67+
$presenter->shouldIgnoreMissing();
68+
69+
$template = $latteFactory->createTemplate($presenter);
70+
Assert::equal(
71+
(object) ['foo' => 'bar'],
72+
$template->getParameters()['config'],
73+
);
74+
});

0 commit comments

Comments
 (0)