Kešování v šabloně – jaký a jak zvolit název?

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

Zdravím,
mám menší problém s kešováním v šabloně.
Při vypisování obsahů (obrázky nebo text) mi to v seznamu obsahů vypíše některý dvakrát a některý vůbec.
Teďka mi to dokonce vypsalo při výpisu konkrétního obsahu cizí obsah (chtěl jsem obsah se slugem ABC a vypsalo do XYZ).
Bez keše to jede v pohodě.

Výpis všech obsahů

<div n:snippet="all" data-ajax-append="true">
<div n:snippet="each">
	<div n:foreach="$contents as $content" class="content well">
		{cache 'content/header/' . $content->content_id . '/' + $user->loggedIn . '/' . (string)(bool)empty($content->src), tags => ['content_id/' + $content->content_id]}
		<h4><a href="{plink content:show slug => $content->slug}">{$content->name}</a></h4>
		<div class="date">{$content->date_added|date:'d.n.Y'}</div>

		<div class="row">
			<div class="contentContent col-md-10">
				{!$content->category->type->html}
				<div n:if="empty($content->src)" class="description">{!$content->description|escape|nl2br}</div>
			</div>
		{/cache}
			<div n:snippet="likeCount-$content->content_id" class="contentVote col-md-2">
		{cache 'content/likeCount/' + $content->content_id, tags => array('content_id/' + $content->content_id, 'content_likecount/' + $content->content_id)}
				<div class="likeCount">{$content->related('like')->count('*')}</div>
		{/cache}
				{if !$user->loggedIn || $content->related('like')->where('user_id', $user->id)->fetch()}
				<a class="like liked" title="Toto se Vám líbí"><span class="glyphicon glyphicon-thumbs-up"></span></a>
				{else}
				<a n:href="like! $content->content_id" class="ajax like" title="To se mi líbí"><span class="glyphicon glyphicon-thumbs-up"></span></a>
				{/if}
			</div>
		</div>

		{cache 'content/footer/' . $content->content_id, tags => ['content_id' => $content->content_id, 'author_id' => $content->author_id]}
		<div class="contentFooter">
			<iframe src="//www.facebook.com/plugins/like.php?href={plink //content:show slug => $content->slug|url}&amp;layout=button_count&amp;action=like&amp;show_faces=true&amp;share=true&amp;height=21" style="border:none; overflow:hidden; height:21px; width: 100%;"></iframe>
			<div class="author"><a n:href="subscribe! $content->author_id" class="ajax" title="Sledovat uživatele">{$content->author->username}</a></div>
		</div>
		{/cache}
	</div>
	<a n:href="next! $category_id, $page" n:if="$page" onclick="this.remove()" class="ajaxpage ajax">Další strana</a>
</div>
</div>

Výpis konkrétního obsahu je potom stejné jako nahoře, jen tam chybí stránkování a mimo obalovací div jsou fb komenty.

Píšu ten název keše správně?
Díky za rady.

Zax
Člen | 370
+
+2
-

Ty tam zkoušíš připojovat text pomocí znaménka „plus“, přepiš pluska na tečky a zkus to znovu ;-)

CZechBoY
Člen | 3608
+
0
-

Jo někde jsou ještě plusy? No nejdřív jsem měl tečky, pak plusy (záhadně fungovalo) a teď to zase (záhadně) nefunguje :D

Jo už to jede (schválně jestli to pude i zejtra :D)
Zatím díky

Editoval CZechBoY (7. 8. 2014 0:12)

Zax
Člen | 370
+
+1
-

Ono to zas moc záhadné není :-D

(string)TRUE === '1'
(string)FALSE === ''

Plus je v PHP sčítání, nenumerické řetězce se tuším převádí na nulu.

Řekněme, že uživatel je přihlášen, $content->src není prázdný a $content->content_id je třeba 15. Když jsou všude znaménka plus, tak vznikne:

'content/header/' + $content->content_id + '/' + $user->loggedIn + '/' + (string)(bool)empty($content->src)
0 + 15 + 0 + 1 + 0 + 0 = 16

Pro každý content_id je tedy jiný výsledek, proto to vypadalo funkčně (ale bacha, kdyby content_id bylo 16 a uživatel nebyl přihlášený, tak je opět výsledek 16 – proto jen vypadalo)

Kombinace teček a plusů ale udělá toto:

'content/header/' . $content->content_id . '/' + $user->loggedIn . '/' . (string)(bool)empty($content->src)
'content/header/15/' + 1 . '/' . ''

‚content/header/15/‘ není číslo, takže se to při sčítání „požere“ a zůstane

1 . '/' . '' neboli '1/'

A tady už to nefunguje vůbec, protože ať je content_id jakýkoliv, vždycky se vrátí ‚1/‘ ;-)

Uff, snad jsem to moc nezamotal (nebo neudělal nějakou trapnou teoretickou chybu, kterou bych si později vyčítal :D)

Editoval Zax (7. 8. 2014 1:52)

CZechBoY
Člen | 3608
+
0
-

Jo díky, to nebylo nutný.
Nicméně mě pořád zajmá jaktože to předtim s tečkama nešlo :D Asi jsem tam měl málo podmínek.

Btw je nějakej rozdíl mezi oddělováním pomlčkama a lomítkama? Předtim jsem měl pomlčky.

Jinak zatim to jede dobře, i po nahrání novýho obsahu.

Zax
Člen | 370
+
+3
-

Rozdíl v tom není, klíč se vnitřně hashuje pomocí md5. Dokonce je možné místo řetězce použít cokoliv, co jde serializovat (pole, objekty…).

EDIT: Jo vím, nutný to nebylo, ale já jsem tvor docela zvídavý a jelikož jsem nikdy nezkoušel takhle drsně kombinovat sčítání a append, tak jsem si to prostě musel vyzkoušet a své poznatky popsat :D

Editoval Zax (7. 8. 2014 3:42)

CZechBoY
Člen | 3608
+
0
-

No to je jedno jestli tam dám pole nebo dlouhej string asi :-)