AJAX – nezpracování snippetů v includovaných šablonách
- Panda
- Člen | 569
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
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
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
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 ;)