Invalidace snippetu ve snippetu v komponentě

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

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

  1. $this->redrawComponent(‚likeCount-‘ . $content_id)
  2. $this->redrawComponent(‚contentsView-likeCount-‘ . $content_id);
  3. $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
+
+1
-

invaliduj each a do sablony posli pouze ty $contents, ktere chces prekreslit

Editoval matej21 (1. 8. 2014 19:45)

CZechBoY
Člen | 3608
+
0
-

Já chci překreslit jen likeCount, ne všechny příspěvky. To bych si potom musel nějak zapamatovat příspěvky, který jsou vykreslený.

CZechBoY
Člen | 3608
+
0
-

No tak jsem poslal jen content co potřebuju, ale stejně mi to vrací bordel, kterej nepotřebuju… Nepotřebuju vůbec snippet all. Potřebuju jen likeCount.
Jde toho nějak docílit?

CZechBoY
Člen | 3608
+
0
-

Nikdo neřešil?

David Kudera
Člen | 455
+
0
-

Koukal jsi sem?

CZechBoY
Člen | 3608
+
0
-

Jj hodně krát.
Nicméně řešení na můj problém někdo nemá?

David Kudera
Člen | 455
+
+1
-

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)

CZechBoY
Člen | 3608
+
0
-

Jo ajo, už mi jde invalidovat each. Divný předtim nešlo :-(

Tak díky za odpovědi.

On totiž @matej21 editoval příspěvek a nějak jsem tu editaci přehlídl.

Editoval CZechBoY (4. 8. 2014 12:05)

David Kudera
Člen | 455
+
+1
-

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)