[2.1-dev] Jak použít cache?

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

Zdravím, mám v šabloně následující kód:

{#content}
	{cache $id, expire => '+1 week'}
		{var $person = $person->fetch()}
		<section>
			<table>
				...
			</table>
		</section>
	{/cache}
{/#}

Tohle je v pohodě, při prvním zavolání se provede dotaz do DB, při dalších se načítá z cache.
Problém ale je, že chci do titulku stránky dostat kus z $person.

{#title}{$person->name|capitalize}{/#}

Teď co s tím? Dát {cache} tag přes celou šablonu (uvnitř mít {#title} a {#include}) nejde.

Takže vidím dvě možnosti. Buď cachovat mimo šablonu $person, ale to zase nebudu mít v cache celou šablonu. Nebo cachovat šablonu a zvlášť cachovat jenom ten název pro title, ale to zase budu mít jednu stránku rozdělenou ve 2 cache.

Budu vděčnej za jakejkoliv nápad / popostrčení. Díky.

Michalek
Člen | 211
+
0
-

Trvalo mi dva roky přijít na to :-) „n:block“

{#content}
    {cache $id, expire => '+1 week'}
        {var $person = $person->fetch()}
        <section>
            <table>
                <tr><td><h2 n:block="title">{$person->name|capitalize}</h2></td></tr>
            </table>
        </section>
    {/cache}
{/#}

Editoval Michalek (16. 9. 2013 20:59)

Mysteria
Člen | 797
+
0
-

@Michalek: Díky za nakopnutí, ale tak jednoduché to nebude. :P

Po chvilce zápolení jsem přišel na opravdu zajímavou věc:
Pokud mám kód:

{#content}
	{cache $id, expire => '+1 week'}
		{var $file = $person->fetchAll()}
		<section class='download'>
			<table class='download'>
				{define #title}{$person[58]->name}{/define}
			</table>
		</section>
	{/cache}
{/#}

Tak se stránka zobrazí, a vloží se do titulku správná věc. Ale i přesto, že se vygeneruje cache, tak se znovu vykonává dotaz do databáze pokaždé!

{#content}
	{cache $id, expire => '+1 week'}
		{var $file = $person->fetch()}
		<section class='download'>
			<table class='download'>
				{define #title}{$person->name}{/define}
			</table>
		</section>
	{/cache}
{/#}

Tak dostanu chybu:

Cannot read an undeclared property Nette\Database\Table\Selection::$name.

Absolutně nemám páru proč s ->fetch() to nefunguje, když s ->fetchAll() a uvedením indexu pole to jde (i když jenom částečně, ale alespoň se to zobrazí).

Pokud použiju n: makro nebo místo {define} makro {block}, výsledky jsou pokaždé stejné. Nějaký další nápad? ;)

Editoval Mysteria (16. 9. 2013 22:44)