From ec91641ce89e8275e570faf7448d2172fe91e836 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 13 Nov 2023 21:45:17 +0100 Subject: [PATCH] Latte: compatible with latest blueprint --- .../Nodes/TemplatePrintNode.php | 53 ++++++++----------- src/Bridges/ApplicationLatte/Template.php | 10 ++++ 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/Bridges/ApplicationLatte/Nodes/TemplatePrintNode.php b/src/Bridges/ApplicationLatte/Nodes/TemplatePrintNode.php index a3421d976..6e56b61ce 100644 --- a/src/Bridges/ApplicationLatte/Nodes/TemplatePrintNode.php +++ b/src/Bridges/ApplicationLatte/Nodes/TemplatePrintNode.php @@ -12,10 +12,8 @@ use Latte; use Latte\Compiler\PhpHelpers; use Latte\Compiler\PrintContext; -use Nette\Application\UI\Presenter; +use Nette\Application\UI; use Nette\Bridges\ApplicationLatte\Template; -use Nette\PhpGenerator as Php; - /** * {templatePrint [ClassName]} @@ -24,42 +22,37 @@ class TemplatePrintNode extends Latte\Essential\Nodes\TemplatePrintNode { public function print(PrintContext $context): string { - return self::class . '::printClass($this, ' . PhpHelpers::dump($this->template) . '); exit;'; + return self::class . '::printClass($this->getParameters(), ' . PhpHelpers::dump($this->template ?? Template::class) . '); exit;'; } - public static function printClass(Latte\Runtime\Template $template, ?string $parent = null): void + public static function printClass(array $params, string $parentClass): void { - $blueprint = new Latte\Essential\Blueprint; - $name = 'Template'; - $params = $template->getParameters(); + $bp = new Latte\Essential\Blueprint; $control = $params['control'] ?? $params['presenter'] ?? null; - if ($control) { + $name = 'Template'; + if ($control instanceof UI\Control) { $name = preg_replace('#(Control|Presenter)$#', '', $control::class) . 'Template'; - unset($params[$control instanceof Presenter ? 'control' : 'presenter']); + unset($params[$control instanceof UI\Presenter ? 'control' : 'presenter']); } - - if ($parent) { - if (!class_exists($parent)) { - $blueprint->printHeader("{templatePrint}: Class '$parent' doesn't exist."); - return; + $class = $bp->generateTemplateClass($params, $name, $parentClass); + $code = (string) $class->getNamespace(); + + $bp->printBegin(); + $bp->printCode($code); + + if ($control instanceof UI\Control) { + $file = dirname((new \ReflectionClass($control))->getFileName()) . '/' . $class->getName() . '.php'; + $_file = '' . htmlspecialchars($file) . ''; + if (file_exists($file)) { + echo "unsaved, file $_file already exists"; + } else { + echo "saved to file $_file"; + file_put_contents($file, "global->fn, (new Latte\Essential\CoreExtension)->getFunctions()); - unset($funcs['isLinkCurrent'], $funcs['isModuleCurrent']); - - $namespace = new Php\PhpNamespace(Php\Helpers::extractNamespace($name)); - $class = $namespace->addClass(Php\Helpers::extractShortName($name)); - $class->setExtends($parent ?: Template::class); - - $blueprint->addProperties($class, $params); - $blueprint->addFunctions($class, $funcs); - - $end = $blueprint->printCanvas(); - $blueprint->printCode((string) $namespace); - echo $end; + $bp->printEnd(); + exit; } } diff --git a/src/Bridges/ApplicationLatte/Template.php b/src/Bridges/ApplicationLatte/Template.php index 4912b27c2..c07ea9975 100644 --- a/src/Bridges/ApplicationLatte/Template.php +++ b/src/Bridges/ApplicationLatte/Template.php @@ -19,6 +19,7 @@ class Template implements Nette\Application\UI\Template { private ?string $file = null; + private ?string $blueprint; public function __construct( @@ -39,6 +40,9 @@ final public function getLatte(): Latte\Engine public function render(?string $file = null, array $params = []): void { Nette\Utils\Arrays::toObject($params, $this); + if (isset($this->blueprint)) { + Nodes\TemplatePrintNode::printClass($this->getParameters(), $this->blueprint); + } $this->latte->render($file ?: $this->file, $this); } @@ -139,6 +143,12 @@ final public function getParameters(): array } + public function blueprint(?string $parentClass = null): void + { + $this->blueprint = $parentClass ?? self::class; + } + + /** * Prevents unserialization. */