AJAX – nezpracování snippetů v includovaných šablonách

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Panda
Člen | 569
+
0
-

Pokud mám jako hlavní šablonu @layout.phtml, ve kterém includuji ‚obsahovou‘ ($content) šablonu daného view přes {include $content} (po vzoru příkladů akrabat, skeleton a modules-usage), tak Nette v includované šabloně vůbec nezpracují snippets, což je trošku na obtíž. Je to kvůli tomu, že se celá šablona @layout.phtml obalí do if ($control->isOutputAllowed()) { } a ke zpracování vložené šablony se Nette vůbec nedostane.

Vložená šablona je automaticky také obalena do if ($control->isOutputAllowed()) { }, takže je oprava problému relativně jednoduchá – před includovanou šablonou podmínku ukončit a za ní začít novou. V Nette/Templates/TemplateFilters.php, v metodě curlyBrackets statické třídy TemplateFilters, stačí upravit úvodní podmínku (v rev. 42 z webu začíná na řádku 103) z:

		// snippets support
		if (isset($template->control) &&
			$template->control instanceof IPartiallyRenderable) {
			$s = '<?php if ($control->isOutputAllowed()) { ?>' . $s . '<?php } ?>';
		}

na:

		// snippets support
		if (isset($template->control) &&
			$template->control instanceof IPartiallyRenderable) {
			$s = '<?php if ($control->isOutputAllowed()) { ?>' . $s . '<?php } ?>';
			self::$curlyXlatMask['include '] = '<?php } $template->subTemplate(#)->render(); if ($control->isOutputAllowed()) { ?>';
		}else
			self::$curlyXlatMask['include '] = '<?php $template->subTemplate(#)->render() ?>';

Možná existuje elegantnější řešení, ale toto mi nyní přišlo nejsnažší a poradí si to i s renderováním šablon u objektů, které neimplementují IPartiallyRenderable.

ViliamKopecky
Nette hipster | 230
+
0
-

Nevím jestli je to to samé, ale když napíšeš zavináč před snippetem @{snippet neco}...@{snippet neco} tak by to myslim mělo dělat to o čem píšeš.

Panda
Člen | 569
+
0
-

enoice napsal(a):

Nevím jestli je to to samé, ale když napíšeš zavináč před snippetem @{snippet neco}...@{snippet neco} tak by to myslim mělo dělat to o čem píšeš.

Aha, tak přece je to nějak ošetřené, nějak jsem to tam přehlédl. Díky, jen se ten zavináč musí fouknout před to {include $content}, ne před snippet…

Jen by možná bylo lepší, kdyby se to vyhodnocování operátoru @ dalo do té podmínky, aby se to náhodou neprovedlo u šablony, která nebude mít podporu pro snippety a tudíž nebude ohraničená v if ($control->isOutputAllowed()) { }. Možná díky tomu jsem to přehlédl – hledal jsem v té podmínce a dál se už nějak nekoukal. Také by nebylo na škodu dodělat pro to nějakou escape sekvenci, pak by napřiklad sestavování mailů v šabloně přes

{$mailbox}@{$domain}

nemuselo dopadnout úplně nejlépe.

ViliamKopecky
Nette hipster | 230
+
0
-

Panda napsal(a):

enoice napsal(a):

Nevím jestli je to to samé, ale když napíšeš zavináč před snippetem @{snippet neco}...@{snippet neco} tak by to myslim mělo dělat to o čem píšeš.

Aha, tak přece je to nějak ošetřené, nějak jsem to tam přehlédl. Díky, jen se ten zavináč musí fouknout před to {include $content}, ne před snippet…

Jen by možná bylo lepší, kdyby se to vyhodnocování operátoru @ dalo do té podmínky, aby se to náhodou neprovedlo u šablony, která nebude mít podporu pro snippety a tudíž nebude ohraničená v if ($control->isOutputAllowed()) { }. Možná díky tomu jsem to přehlédl – hledal jsem v té podmínce a dál se už nějak nekoukal. Také by nebylo na škodu dodělat pro to nějakou escape sekvenci, pak by napřiklad sestavování mailů v šabloně přes

{$mailbox}@{$domain}

nemuselo dopadnout úplně nejlépe.

Já jsem to s těma zavináčema moc nezkoušel. David mi to řek po telefonu, tak jsem to špatně pochopil.

Můžeš napsat do Feature requests ;)

A.
Člen | 87
+
0
-

Dovolil jsem si toto vytahnout do dokumentace, jelikoz to pro me znamenalo minus jednu hodinu meho casu. Priste to zkusim otocit a forum pouziju pred osobnim nalezenim problemu :).