Nepřenáší se proměnná do includnutého templatu

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

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í…)

LM
Člen | 206
+
0
-

Ona pod šablona obdrží parametry z rodičovské šablony, je to další podobjekt nechová se to jako klasické include. Každopádně jí můžeš předat parametry vlastní:

{include '@form_image.phtml', array('key' => $key)}
Mas3r
Člen | 116
+
0
-

Aha, super, to sem nevěděl, THX

Mas3r
Člen | 116
+
0
-

Tak jsem to zkusil, ale zase „zmizely“ proměnné deklarované v presenteru :)

LM
Člen | 206
+
0
-

To je jasné :p , ale nemám řešení.

PetrP
Člen | 587
+
0
-

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 | 8082
+
0
-

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):

  1. předat všechny parametry + doplnit o vyjmenované
  2. automaticky vytvořit parameter $parent, vedoucí na nadřazenou šablonu (odpovídá {include '@form_image.phtml', 'parent' => $template}

Co myslíte?

phx
Člen | 651
+
0
-

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 | 8082
+
0
-

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.

phx
Člen | 651
+
0
-

Pravda.

But to implementovat jako volitelnou moznost s tim, ze rizika jsou na zvazeni kazdeho programatora a nebo tuto „nebezpecnou zbran“ radeji netvorit.

David Grudl
Nette Core | 8082
+
0
-

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
+
0
-

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

Mas3r
Člen | 116
+
0
-

No myslím, že tady ten force_include je asi zbytečný, spíše udělat to předávání přes $parent.

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

Ale jak jít dál (a vyřešit titulní problém):

  1. předat všechny parametry + doplnit o vyjmenované
  2. 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
+
0
-

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 | 8082
+
0
-

Souhlasím, že nejočekávatelnější chování je prostě přidat vyjmenované parametry.

David Grudl
Nette Core | 8082
+
0
-

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}
?>
LM
Člen | 206
+
0
-

Pěkný :-), bohužel teď ale v layoutu nefunguje {include $content}, protože to filtr převede na $template->subTemplate("$content")->render(), což zavolá Template::__toString to způsobí že se místo objektu Template předá obsah šablony…

David Grudl
Nette Core | 8082
+
0
-

Zrovna jsem si toho všiml. K dispozici je oprava.