diff --git a/src/Bridges/ApplicationDI/LatteExtension.php b/src/Bridges/ApplicationDI/LatteExtension.php index 079a217b7..40402f223 100644 --- a/src/Bridges/ApplicationDI/LatteExtension.php +++ b/src/Bridges/ApplicationDI/LatteExtension.php @@ -19,6 +19,7 @@ class LatteExtension extends Nette\DI\CompilerExtension public $defaults = [ 'xhtml' => FALSE, 'macros' => [], + 'templateClass' => NULL ]; /** @var bool */ @@ -52,9 +53,12 @@ public function loadConfiguration() ->addSetup('Nette\Utils\Html::$xhtml = ?', [(bool) $config['xhtml']]) ->setImplement(Nette\Bridges\ApplicationLatte\ILatteFactory::class); - $builder->addDefinition($this->prefix('templateFactory')) + $templateFactory = $builder->addDefinition($this->prefix('templateFactory')) ->setClass(Nette\Application\UI\ITemplateFactory::class) ->setFactory(Nette\Bridges\ApplicationLatte\TemplateFactory::class); + if ($config['templateClass'] !== NULL) { + $templateFactory->addSetup('?->setTemplateClass(?)', ['@self', $config['templateClass']]); + } foreach ($config['macros'] as $macro) { if (strpos($macro, '::') === FALSE && class_exists($macro)) { diff --git a/src/Bridges/ApplicationLatte/TemplateFactory.php b/src/Bridges/ApplicationLatte/TemplateFactory.php index e28e86674..b80469a8f 100644 --- a/src/Bridges/ApplicationLatte/TemplateFactory.php +++ b/src/Bridges/ApplicationLatte/TemplateFactory.php @@ -31,6 +31,9 @@ class TemplateFactory implements UI\ITemplateFactory /** @var Nette\Caching\IStorage */ private $cacheStorage; + /** @var string */ + private $templateClass = Template::class; + public function __construct(ILatteFactory $latteFactory, Nette\Http\IRequest $httpRequest = NULL, Nette\Security\User $user = NULL, Nette\Caching\IStorage $cacheStorage = NULL) @@ -48,7 +51,7 @@ public function __construct(ILatteFactory $latteFactory, Nette\Http\IRequest $ht public function createTemplate(UI\Control $control = NULL) { $latte = $this->latteFactory->create(); - $template = new Template($latte); + $template = new $this->templateClass($latte); $presenter = $control ? $control->getPresenter(FALSE) : NULL; if ($control instanceof UI\Presenter) { @@ -112,4 +115,12 @@ public function createTemplate(UI\Control $control = NULL) return $template; } + public function setTemplateClass($templateClass) + { + if (!class_exists($templateClass) || !is_a($templateClass, Template::class, TRUE)) { + throw new Nette\InvalidArgumentException("Class $templateClass does not extend " . Template::class . ' or it does not exist.'); + } + $this->templateClass = $templateClass; + } + } diff --git a/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt b/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt new file mode 100644 index 000000000..d002b869a --- /dev/null +++ b/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt @@ -0,0 +1,73 @@ +engine = $engine; + } + + public function create() + { + return $this->engine; + } +} + +class TemplateMockWithoutImplement +{ + +} + +class TemplateMock extends Nette\Bridges\ApplicationLatte\Template +{ + private $file = 'ko'; + + public function render() + { + return strrev($this->file); + } + + public function setFile($file) + { + $this->file = $file; + } + + public function getFile() + { + return $this->file; + } +} + + +$factory = new TemplateFactory(new LatteFactoryMock(new Latte\Engine)); +Assert::type(Template::class, $factory->createTemplate()); + + +Assert::exception(function () use ($factory) { + $factory->setTemplateClass(TemplateMockWithoutImplement::class); +}, \Nette\InvalidArgumentException::class, 'Class TemplateMockWithoutImplement does not extend Nette\Bridges\ApplicationLatte\Template or it does not exist.'); + + +$factory->setTemplateClass(TemplateMock::class); +$template = $factory->createTemplate(); +Assert::type(TemplateMock::class, $template); +Assert::type(UI\ITemplate::class, $template); +Assert::same([], $template->flashes); +Assert::same('ok', $template->render()); +$template->setFile('bla'); +Assert::same('alb', $template->render());