Kešování v šabloně – jaký a jak zvolit název?
- CZechBoY
- Člen | 3608
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}&layout=button_count&action=like&show_faces=true&share=true&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
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)
- Zax
- Člen | 370
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)