Invalidace snippetu ve snippetu v komponentě
- CZechBoY
- Člen | 3608
Zdravím,
jaký parametr mám dát k volání metody $this->redrawControl()
v metodě handleLike($content_id) u komponenty, když chci
invalidovat pouze snippet likeCount-$content->content_id?
Šablona komponenty ContentsView:
<div n:snippet="all" data-ajax-append="true">
<div n:snippet="each">
<div n:foreach="$contents as $content">
<div n:snippet="likeCount-$content->content_id">
<div class="likeCount">{$content->related('like')->count('*')}</div>
</div>
</div>
</div>
</div>
Zkoušel jsem
- $this->redrawComponent(‚likeCount-‘ . $content_id)
- $this->redrawComponent(‚contentsView-likeCount-‘ . $content_id);
- $this->redrawComponent(‚all-each-likeCount-‘ . $content_id);
a vše mi vrací prázdný state :-(
Neví někdo teda jaký název bych tam měl napsat?
Díky
- David Matějka
- Moderator | 6445
invaliduj each a do sablony posli pouze ty $contents
, ktere
chces prekreslit
Editoval matej21 (1. 8. 2014 19:45)
- David Kudera
- Člen | 455
Pokud tvou otázku chápu správně, tak by to mělo být i tvým řešením. Takže. Máš několik dyn. snippetů a jen jeden z nich chceš invalidovat. Správně?
Jestli jo, tak je to celkem snadný, i když se může zdát, že docela zamotaný a je to přesně to, co je v tom odkazu..
V handlu dáš do šablony do proměnné $contents
pole, ve
kterým bude ve skutečnosti jen jeden „content“.
Dál v handlu budeš invalidovat i ten jeden dynamický snippet podle id a i jeho statického rodiče (jen při ajax požadavku).
No a v renderu jen zkontroluješ, jestli už v templatě existuje
proměnná $contents
(možná už naplněná z handle metody) a
když tam nebude, tak ji normálně předáš s kompletním polem
všech dat.
Edit: tohle je vlastně jen trochu rozepsaný, co psal i @matej21 jo a asi ten dyn. snippet možná ani nemusíš invalidovat
Editoval David Kudera (4. 8. 2014 11:06)
- David Kudera
- Člen | 455
Kód se mi moc psát teda nechtělo no :-D
public function render()
{
if (!isset($this->template->contents)) {
$this->template->contents = getContentsSomehow();
}
}
public function handleLike($content_id)
{
$content = getContentByIdSomehow($content_id);
doSomething();
if ($this->isAjax()) {
$this->template->contents = array(
$content,
);
$this->redrawControl('each');
} else {
$this->redirect('this');
}
}
teoreticky by to mělo být takhle nějak
Edit: jo a možná (nejsem si jistý) to budeš muset mít jako asociativní pole podle ID těch záznamů, jako je to v dokumentaci. Ale to si vyzkoušej kdyžtak
Edit 2: jo ahá.. taky jsi editoval text, teď to vypadá, že si tu jen tak chodím psát kódy :-D
Editoval David Kudera (4. 8. 2014 12:08)