Jak poslat snippet komponenty, která je součástí json response?

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

Zdravím,
řešil jste někdo problém jak odeslat pouze snippet komponenty, která je příjemcem signálu, pokud odesílám vyrenderovaná data pomocí jsonu? $presenter->sendJson($json_s_komponentami)

Kod presenteru zhruba takto:

function actionXXX($id)
{
	$this->data = $this->sezenData($id);
}
function renderXXX($id)
{
	$jsonData = [];
	foreach ($data as $d) {
		ob_start();
		$this['komponentaA-' . $d->id]->render();
		$text = ob_get_clean();
		$jsonData[] = zpracujDataDoJson($text);
	}
	$this->sendJson($jsonData);
}
function createComponentKomponentaA()
{
	return new Multiplier(function($id) {
		return $this->factoryA->create($id);
	});
}

Potom v komponentě A mám subkomponentu, která už vypisuje data. Na ni jen deleguju render:

	function render ()
	{
		$this['komponentaB']->render();
	}

V komponentě B mám konečně komponentu C, která přijímá signál update!:

	function handleUpdate()
	{
		$this->redrawControl('snippet');
	}

Editoval CZechBoY (17. 2. 2016 8:58)

srigi
Nette Blogger | 558
+
0
-

Riesil som nieco podobne. Bohuzial poslat JSON pomocou sendJson() a zaroven invalidovat snippety nie je mozne. Je za to zodpovedny tento kod.

Pri invalidacii sa posiela TextResponse, pri sendJson/sendPayload sa posiela JsonResponse a vdaka tomu cez hentu podmienku neprejdes.

CZechBoY
Člen | 3608
+
0
-

Zkusil jsem ještě pohackovat přes parametr do, který se posílá. Ten parametr (bez signálu) si předám do šablony

{layout ""}
{control $redrawControlName}

a zkoušim vykreslit samostatně bez odesílání ajaxu.
Aktuálně jsem na problému, že odesílám http header ikdyž už mám data v bufferu (nastavení content-type:application/json).

CZechBoY
Člen | 3608
+
0
-

Už jsem to vyřešil – nepředal jsem si proměnnou a IF neprošel do true větve a komponenta, která se chtěla přereslit se nevykreslila vůbec.
Tak zas celej den pryč kvůli prkotině :-))