Skip to content

Commit 82c7752

Browse files
committed
UIMacros: added macro {templatePrint}
1 parent a88364e commit 82c7752

2 files changed

Lines changed: 79 additions & 0 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the Nette Framework (https://nette.org)
5+
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Nette\Bridges\ApplicationLatte;
11+
12+
use Latte;
13+
use Latte\Runtime\TemplatePrinter as Helpers;
14+
use Nette;
15+
use Nette\Application\UI\Presenter;
16+
17+
18+
/**
19+
* Generates blueprint of template class.
20+
*/
21+
final class TemplatePrinter
22+
{
23+
use Nette\SmartObject;
24+
25+
public function print(Latte\Runtime\Template $template, string $class = null): string
26+
{
27+
$types = array_map([Helpers::class, 'getType'], $template->getParameters());
28+
if ($template->getParameter('control') instanceof Presenter) {
29+
unset($types['control']);
30+
$subject = $template->getParameter('presenter');
31+
$class = $class ?: preg_replace('#Presenter$#', '', get_class($subject)) . ucfirst($subject->getView()) . 'Template';
32+
} else {
33+
unset($types['presenter']);
34+
$subject = $template->getParameter('control');
35+
$class = $class ?: preg_replace('#Control$#', '', get_class($subject)) . 'Template';
36+
}
37+
unset($types['user'], $types['baseUrl'], $types['basePath'], $types['flashes']);
38+
39+
$funcs = [];
40+
foreach ($template->global as $name => $val) {
41+
if (substr($name, 0, 3) === '_fn') {
42+
$name = substr($name, 3);
43+
$funcs[$name] = Helpers::printFunction($name, $val, true);
44+
}
45+
}
46+
unset($funcs['islinkcurrent'], $funcs['ismodulecurrent']);
47+
48+
$parts = explode('\\', $class);
49+
$name = array_pop($parts);
50+
$namespace = implode('\\', $parts);
51+
$parent = Template::class;
52+
$subject = explode('\\', get_class($subject));
53+
$subject = end($subject);
54+
return
55+
($namespace ? "namespace $namespace;\n\n" : '')
56+
. "class $name extends $parent\n"
57+
. "{\n" . Helpers::printProperties($types, true) . "\n}\n"
58+
. "\n\n"
59+
. "/**\n" . Helpers::printProperties($types, false) . "\n"
60+
. implode("\n", $funcs) . "\n */\n"
61+
. "class $name extends $parent\n"
62+
. "{\n}\n"
63+
. "\n\n"
64+
. "/**\n * @property $name \$template\n */\n"
65+
. "class $subject\n"
66+
. "{\n}\n";
67+
}
68+
}

src/Bridges/ApplicationLatte/UIMacros.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public static function install(Latte\Compiler $compiler): void
4444
$me->addMacro('extends', [$me, 'macroExtends']);
4545
$me->addMacro('layout', [$me, 'macroExtends']);
4646
$me->addMacro('nonce', null, null, 'echo $this->global->uiNonce ? " nonce=\"{$this->global->uiNonce}\"" : "";');
47+
$me->addMacro('templatePrint', [$me, 'macroTemplatePrint'], null, null, self::ALLOWED_IN_HEAD);
4748
}
4849

4950

@@ -147,4 +148,14 @@ public function macroExtends(MacroNode $node, PhpWriter $writer)
147148
}
148149
$this->extends = $writer->write('$this->parentName = $this->global->uiPresenter->findLayoutTemplateFile();');
149150
}
151+
152+
153+
/**
154+
* {templatePrint [ClassName]}
155+
*/
156+
public function macroTemplatePrint(MacroNode $node, PhpWriter $writer)
157+
{
158+
$class = $node->tokenizer->fetchWord() ?: null;
159+
return $writer->write('ob_end_clean(); header("Content-Type: text/plain"); echo (new Nette\Bridges\ApplicationLatte\TemplatePrinter)->print($this, %var); exit;', $class);
160+
}
150161
}

0 commit comments

Comments
 (0)