1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Bridges\ApplicationLatte;
9:
10: use Nette;
11: use Nette\Application\UI;
12: use Latte;
13:
14:
15: 16: 17:
18: class TemplateFactory implements UI\ITemplateFactory
19: {
20: use Nette\SmartObject;
21:
22:
23: private $latteFactory;
24:
25:
26: private $httpRequest;
27:
28:
29: private $user;
30:
31:
32: private $cacheStorage;
33:
34:
35: public function __construct(ILatteFactory $latteFactory, Nette\Http\IRequest $httpRequest = NULL,
36: Nette\Security\User $user = NULL, Nette\Caching\IStorage $cacheStorage = NULL)
37: {
38: $this->latteFactory = $latteFactory;
39: $this->httpRequest = $httpRequest;
40: $this->user = $user;
41: $this->cacheStorage = $cacheStorage;
42: }
43:
44:
45: 46: 47:
48: public function createTemplate(UI\Control $control = NULL)
49: {
50: $latte = $this->latteFactory->create();
51: $template = new Template($latte);
52: $presenter = $control ? $control->getPresenter(FALSE) : NULL;
53:
54: if ($control instanceof UI\Presenter) {
55: $latte->setLoader(new Loader($control));
56: }
57:
58: if ($latte->onCompile instanceof \Traversable) {
59: $latte->onCompile = iterator_to_array($latte->onCompile);
60: }
61:
62: array_unshift($latte->onCompile, function ($latte) use ($control, $template) {
63: $latte->getCompiler()->addMacro('cache', new Nette\Bridges\CacheLatte\CacheMacro($latte->getCompiler()));
64: UIMacros::install($latte->getCompiler());
65: if (class_exists(Nette\Bridges\FormsLatte\FormMacros::class)) {
66: Nette\Bridges\FormsLatte\FormMacros::install($latte->getCompiler());
67: }
68: if ($control) {
69: $control->templatePrepareFilters($template);
70: }
71: });
72:
73: $latte->addFilter('url', 'rawurlencode');
74: foreach (['normalize', 'toAscii', 'webalize', 'padLeft', 'padRight', 'reverse'] as $name) {
75: $latte->addFilter($name, 'Nette\Utils\Strings::' . $name);
76: }
77: $latte->addFilter('null', function () {});
78: $latte->addFilter('modifyDate', function ($time, $delta, $unit = NULL) {
79: return $time == NULL ? NULL : Nette\Utils\DateTime::from($time)->modify($delta . $unit);
80: });
81:
82: if (!isset($latte->getFilters()['translate'])) {
83: $latte->addFilter('translate', function (Latte\Runtime\FilterInfo $fi) {
84: throw new Nette\InvalidStateException('Translator has not been set. Set translator using $template->setTranslator().');
85: });
86: }
87:
88:
89: $template->user = $this->user;
90: $template->baseUri = $template->baseUrl = $this->httpRequest ? rtrim($this->httpRequest->getUrl()->getBaseUrl(), '/') : NULL;
91: $template->basePath = preg_replace('#https?://[^/]+#A', '', $template->baseUrl);
92: $template->flashes = [];
93: if ($control) {
94: $template->control = $control;
95: $template->presenter = $presenter;
96: $latte->addProvider('uiControl', $control);
97: $latte->addProvider('uiPresenter', $presenter);
98: $latte->addProvider('snippetBridge', new Nette\Bridges\ApplicationLatte\SnippetBridge($control));
99: }
100: $latte->addProvider('cacheStorage', $this->cacheStorage);
101:
102:
103: $template->_control = $control;
104: $template->_presenter = $presenter;
105: $template->netteCacheStorage = $this->cacheStorage;
106:
107: if ($presenter instanceof UI\Presenter && $presenter->hasFlashSession()) {
108: $id = $control->getParameterId('flash');
109: $template->flashes = (array) $presenter->getFlashSession()->$id;
110: }
111:
112: return $template;
113: }
114:
115: }
116: