použití snippet
- chemikus
- Člen | 49
Ahoj, mám problém a nevím si s ním rady. Nejspíš jsem asi správně nepochopil používání snippet a nebo celkového ajaxu. Na stránce mám následující kod
@{foreach $comments as $comment}
<div class="comment">
<span>{snippet} ({$comment['karma']*100}%) {/snippet}</span>
<a href="{plink topComments!, $comment['id'], 'agree'}" title="Vhodný komentář" class="ajax">+</a>
<hr />
</div>
@{/foreach}
v Presenteru mám
public function handleTopComments($idComment, $act) {
$hit = Comments::addHit('agree', $idComment);
if (!$this->isAjax()) {
$this->redirect('this');
}
}
public function renderTopComments($idComment, $act) {
$hit = Comments::addHit('agree', $idComment);
$this->template->comments = Comments::topComments();
}
Karma se mi v databázi upraví, ale na stránkách se mi neaktualizuje. Můžete mi prosím pomoc, jak mám následující kod upravit, aby se mi vždy po stisku + aktualizovala karma příspěvku? Zároveň bych rád zachoval fčnost i bez podpory Ajaxu. Prosím pomocte, já teď opravdu nevím :-/
Editoval chemikus (15. 9. 2009 10:59)
- Ondřej Brejla
- Člen | 746
Nejsem si jistý a nemám možnost zkoušet, ale zkontroloval bych zavináče na cestě ke snippetu a případně bych zkusil:
<span>{snippet mySnippet} ({$comment['karma']*100}%) {/snippet}</span>
public function handleTopComments($idComment, $act) {
$hit = Comments::addHit('agree', $idComment);
$this->invalidateControl('mySnippet');
if (!$this->isAjax()) {
$this->redirect('this');
}
}
Ale je to jen nástřel.
Editoval Warden (15. 9. 2009 11:13)
- chemikus
- Člen | 49
Něco podobnýho jsem už zkoušel, ale stále se mi nechce ta karma aktualizovat na těch stránkách. Do databáze se aktuální hodnoty zapíšou. Není potřeba ještě načíst do nějaké proměnné (v mém případě nejspíš $comment) aktuální hodnotu z databáze a tu nějakým způsobem předat za pomocí snippet? K načtení hodnot z databáze používám
$this->template->comments = Comments::topComments();
Ale tento příkaz mi načte všechny komentáře (nějakých TOP 100 dle karmy) a ne jen aktualizovaný řádek.
Nebo mám uzavřít celý cyklus foreach do snippetu a nechat znovu načíst všechny komentáře a zobrazit?
Warden napsal(a):
Nejsem si jistý a nemám možnost zkoušet, ale zkontroloval bych zavináče na cestě ke snippetu a případně bych zkusil:
<span>{snippet mySnippet} ({$comment['karma']*100}%) {/snippet}</span> public function handleTopComments($idComment, $act) { $hit = Comments::addHit('agree', $idComment); $this->invalidateControl('mySnippet'); if (!$this->isAjax()) { $this->redirect('this'); } }
Ale je to jen nástřel.
- vlki
- Člen | 218
Nebo mám uzavřít celý cyklus foreach do snippetu a nechat znovu načíst všechny komentáře a
zobrazit?
No, myslím, že je zbytečné si posílat celé texty komentářů. Bylo by to strašně pomalé.
Do šablony komponenty bych k identifikaci snippetu přidal informaci o tom, ke kterému komentáři patří. Jinak by to stejně dělalo problém, protože snippet udělá div s id toho názvu, který mu předáš.
@{foreach $comments as $comment}
<div class="comment">
<span>{snippet comment-$comment['id']} ({$comment['karma']*100}%) {/snippet}</span>
<a href="{plink topComments!, $comment['id'], 'agree'}" title="Vhodný komentář" class="ajax">+</a>
<hr />
</div>
@{/foreach}
Ve zpracování pak invaliduješ jen ten jeden snippet, který se updatoval.
public function handleTopComments($idComment, $act) {
$hit = Comments::addHit('agree', $idComment);
$this->invalidateControl('comment-' . $idComment);
if (!$this->isAjax()) {
$this->redirect('this');
}
}
Není potřeba ještě načíst do nějaké proměnné (v mém případě nejspíš $comment) aktuální hodnotu
z databáze a tu nějakým způsobem předat za pomocí snippet?
Ta hodnota se ti vytvoří, protože komponenta vlastně projde svým životním cyklem. Jen ty si z obsahu vyzobneš jen to, co potřebuješ.
Jak vypadá @layout.phtml? Máš tam také zavináče? Používáš Firebug pro ladění AJAXu?
- Ondřej Brejla
- Člen | 746
Jo ty si ješte ve foreach
, to jsem si nevšiml. Pak je
nejspíš potřeba každý snippet
pojmenovat jedinečně a
invalidovat vždy jen ten jedinečný, aktualizovaný, snippet
.
EDIT: Jo…a vlki byl rychlejší :-) Odpovídat na cviku není nejrychlejší ;-)
Editoval Warden (15. 9. 2009 12:04)
- chemikus
- Člen | 49
Do šablony komponenty bych k identifikaci snippetu přidal informaci o tom, ke kterému komentáři patří. Jinak by to stejně dělalo problém, protože snippet udělá div s id toho názvu, který mu předáš.
@{foreach $comments as $comment} <div class="comment"> <span>{snippet comment-$comment['id']} ({$comment['karma']*100}%) {/snippet}</span> <a href="{plink topComments!, $comment['id'], 'agree'}" title="Vhodný komentář" class="ajax">+</a> <hr /> </div> @{/foreach}
Ve zpracování pak invaliduješ jen ten jeden snippet, který se updatoval.
public function handleTopComments($idComment, $act) { $hit = Comments::addHit('agree', $idComment); $this->invalidateControl('comment-' . $idComment); if (!$this->isAjax()) { $this->redirect('this'); } }
Upravil jsem ten snippet a hlásí mi to chybu
syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
Jak vypadá @layout.phtml? Máš tam také zavináče? Používáš Firebug pro ladění AJAXu?
V @layout.phtml Mám akorát šablonu stránky s {include $content}.
A obsah stránky (změna karmy komentáře) provádím na stránce
topComment.phtml
Ještě jsem se chtěl zeptat, jestli je problém v tom, že mám
v Presenteru
public function renderTopComments() {
...
}
public function handleTopComments() {
...
}
a nebo je to jedno. Protože při načtení stránky se vykoná render a po kliknutí na odkaz se vykoná handle? Opravdu se v tom ještě moc nevyznám :-(
- vlki
- Člen | 218
Hm, jsem se zase trochu moc rozšoupl:) Zkus změnit v šabloně to
{snippet comment-$comment['id']}
na
{snippet 'comment-' . $comment['id']}
.
No, tak třeba u toho {include $content}
musí být zavináč
taky ;) A proč? No, mrkni sem.
Render se vykoná dokonce i když pak klikneš na ten odkaz s
topComments!
. Pokud v handle neredirectuješ, samozřejmě.
Zkus si ještě prolítnout dokumentaci o signálech, AJAXu a snippetech. Pěkně čtivě to máš třeba v seriálu na zdrojáku http://zdrojak.root.cz/…mework-ajax/.
- chemikus
- Člen | 49
Super. Děkuji Vám moc za pomoc :-) Už se mi to podařilo zprovoznit. Konečně jsem pochopil, jak to vlastně funguje ;-)
Akorát jsem ještě trochu upravil snippet na
{snippet 'comment-'.$comment['id'] span} ({$comment['karma']*100}%) {/snippet}
Editoval chemikus (15. 9. 2009 12:38)