Nepřenáší se proměnná do includnutého templatu
- Mas3r
- Člen | 116
Ahoj, vyskytla se mi taková chybička a nevím, jak ji opravit
<?php
foreach($gallery as $key) {
<div class="image">
<div class="inner">
<img src="<?= $photoPath.$key->id ?>_thumb.jpg" />
</div>
<div class="txt">
{include '@form_image.phtml'}
</div>
</div>
}
?>
Do @form_image.phtml se mi nepřenese proměnná $key . Samozřejmě proměnné, které se deklarují přímo v presenteru valí.
V Nette 0.7 to jelo. Nevíte, co s tím? (trošku jsem to upravil kvůli obarvení…)
- PetrP
- Člen | 587
zkusím trochu experimentovat, include se nahrazuje za
$template->subTemplate(#)->render() kde v subTemplate je první parametr
$file a druhý $params = NULL
v subTemplate je cca toto if ($params === NULL) $tpl->params = &
$this->params;
proto bych zkusil
{include '@form_image.phtml', array_merge($template->params, array('key' => $key))}
je to takové nic moc, hlavně tam už není reference, takže je to datově náročnější
//EDIT teď koukám že $params je private
v tom případě bych prozatimně hodil, než se k tomu vyjádří někdo kompetentní
<?php
$tpl = $template->subTemplate('@form_image.phtml');
$tpl->add('key',$key);
$tpl->render();
?>
Editoval PetrP (18. 8. 2008 15:13)
- David Grudl
- Nette Core | 8249
To je jedna z věcí, kde by směr měla ukázat až praxe.
V tuto chvíli to funguje tak, že podšablona dostane přístup ke všem parametrům aktuální šablony, nebo pouze k okruhu určenému druhým parametrem. Mimochodem, tyto zápisy jsou ekvivalentní:
{include '@form_image.phtml', array('key' => $key)}
{include '@form_image.phtml', 'key' => $key}
Ale jak jít dál (a vyřešit titulní problém):
- předat všechny parametry + doplnit o vyjmenované
- automaticky vytvořit parameter $parent, vedoucí na nadřazenou šablonu
(odpovídá
{include '@form_image.phtml', 'parent' => $template}
Co myslíte?
- phx
- Člen | 651
Takova otazka: Nestacil by proste obycejny php include.
Odpoved: stacil, pokud vkladana sablona je ciste php.
A tak me napada reseni:
Kdyz vytvaris sablonu do cache (tu preparsnutou jen do PHP) tak co tam v tom
include hodit jen relativni include na cache te subsablony? PHP by si vsechny
promenne melo predat samo ne?
- David Grudl
- Nette Core | 8249
Tím bys přišel o velmi důležitou vlastnost – odstínění lokálních parametrů. To, že by nějaká sub-sub-sub-šablonka mohla pozměnit lokální parametr vyšší šablony, by vedlo k těžko odhalitelným nepříjemným chybám. Takhle se každá šablona chová jako funkce: je světem sama pro sebe a podporuje znovupoužitelnost HTML kódu + nějaké jednoduché logiky.
- David Grudl
- Nette Core | 8249
phx napsal(a):
Pravda.
But to implementovat jako volitelnou moznost s tim, ze rizika jsou na zvazeni kazdeho programatora a nebo tuto „nebezpecnou zbran“ radeji netvorit.
Třeba takto {?include 'subdir/include1.phtml'}
:-) Jen bacha,
bude hledat vůči aktuálnímu adresáři.
ps. {?...}
je „curlyzkratka“ pro
<?php ... ?>
- phx
- Člen | 651
Jj, ale s tim, ze by to jiz zajistovaly curlyFilter s tim, ze by tam byla abosolutni cesta do cache na spravnou subsablonu. Treba:
{force_include @include.phtml}
A vysledek:
<?php include dirname(__FILE__).'cache-Nette.Templace....?~đ&đĐ[@'; ?>
I kdyz ja osobne to zatim nevyuziji narozdil od Mas3r
- PetrP
- Člen | 587
David Grudl napsal(a):
Ale jak jít dál (a vyřešit titulní problém):
- předat všechny parametry + doplnit o vyjmenované
- automaticky vytvořit parameter $parent, vedoucí na nadřazenou šablonu (odpovídá
{include '@form_image.phtml', 'parent' => $template}
Co myslíte?
Jsem pro první možnost. Když nevyplním druhý parametr tak se stejně předávaj. Nenapadá mě příklad při kterým by tam ty parametry vadily. Snad jedině problém s pamětí, protože se tam nemůže použít reference. Teda určitě ne na celý pole params jedině na jednotlivé klíče, a zakázet přepisovat existující, aby se nepřepsali parametry v rodičovské šábloně.
- PetrP
- Člen | 587
Mas3r napsal(a):
No myslím, že tady ten force_include je asi zbytečný, spíše udělat to předávání přes $parent.
To mi pak ale nedáva smysl že když mám:
{include 'asd'} tak $this->params['od-rodice']
{include 'asd', $key} tak $this->params['parent']['od-rodice']
Kdybych se zničeho nic rozhodl ze přidam $key, tak bych musel přepsat šablony. Bud dat dat rodičovské parametry do parent vždycky, nebo nikdy.
//EDIT
aha spatně jsem pochopil. Bylo to myšleno jako další parametr funkce. To že
to je v kliči parent má nějaký smysl? Jestli se očekává více
nastavování, bo tak.
Editoval PetrP (19. 8. 2008 18:11)
- David Grudl
- Nette Core | 8249
Souhlasím, že nejočekávatelnější chování je prostě přidat vyjmenované parametry.
- David Grudl
- Nette Core | 8249
Implementováno, mělo by to fungovat takto:
<?php
{foreach $gallery as $key}
<div class="image">
<div class="txt">
{include '@form_image.phtml', 'key' => $key}
</div>
</div>
{/foreach}
?>