Problém s vykreslením, Control, snippety

- joe
 - Člen | 313
 
Ahoj, prolezl jsem toho dost, ale pořád mi to není úplně jasné. Tak mi třeba někdo poradíte. A co mi jde, mám několik odkazů, na které když kliknu, tak se objeví další, na které zase když kliknu, tak se objeví zase další, … atd. Čili to má být takový AJAXový filtr. Zobrazování aktuálních kritérií při průchodu jsem nějakým způsobem vyřešil, i když asi ne úplně tak, jak by to mělo fungovat, ale nefiltrují se mi položky a já už nevím co s tím. Napsal jsem si teda jednoduchou komponentu.
class PlaceControl extends Control {
	/** persistent */
	public $continentId = NULL;
	/** persistent */
	public $countryId = NULL;
	/** persistent */
	public $cityId = NULL;
	public function render() {
		$template = $this->getTemplate();
		$template->setFile(dirname(__FILE__) . '/PlaceControl.phtml');
		$template->continents = dibi...
		$template->countries = dibi...
		$template->cities = dibi...
		$template->places = dibi...
		$template->render();
	}
	public function handleLoadCountries($continentId) {
		$this->continentId = $continentId;
		//$this->invalidateControl(); ?
		$this->presenter->payload->snippets['snippet-place-countries'] = ... // SEM DAVAM Z CONTROLU PRIMO HTML, TAK TO MA BYT? TIMTO ZPUSOBEM BYCH ZREJME NEMEL UKLADAT DATA DO PAYLOAD? *1)
		$this->cityId = NULL;
		$this->presenter->payload->snippets['snippet-place-cities'] = '';
		if ($this->presenter->isAjax()) {
				$this->invalidateControl('countries');
				$this->presenter->terminate(); // TADY FUNGUJE JEN TERMINATE(), POKUD NAPISU SENDPAYLOAD(), NEPREPISUJE SE MI TO
		} else {
			$this->presenter->redirect('this');
		}
		$this->invalidateControl('places');
		$this->presenter->sendPayload();
	}
}
soubor PlaceControl.phtml
{foreach $continents as $key => $value}
<div class="selectBoxItem"><a href="{link loadCountries! $key}" class="ajax">{$value}</a></div>
{/foreach}
{snippet countries}
{foreach $countries as $key => $value}
<div class="selectBoxItem"><a href="{link loadCities! $key}" class="ajax">{$value}</a></div>
{/foreach}
{/snippet}
@{if empty($places)}
	Žádné places.
@{else}
	{snippet places}
		{foreach $places as $place}
		<div class="place">
			place {$place->title_add_info}
		</div>
		{/foreach}
	{/snippet}
@{/if}
Pak další věci. Inicializace komponenty:
	public function createComponentPlace() {
		$place = new PlaceControl;
		return $place;
	}
A v defaultním view defaultního presenteru mám toto
@{block #content}
{control place}
Komponenta dělá tedy z části to, co chci. Nevím jestli to dělám
dobře, ale v layoutu načítám tento JS: https://componette.org/search/?…
Kde by mě ještě zajímalo, jak mám správně do toho payloadu zapisovat, aby
vůbec došlo k volání funkce jQuery.nette.updateSnippet
Tam se počítá s polem payload.snippets – to pole si mám zařizovat sám?
Nebo to by mělo být automaticky? (podle mě druhá možnost, jenže to se mi
nepovedlo zprovoznit), proto jsem to psal v kódu natvrdo a nějakým způsobem
to tam dostal, aby se mi vůbec něco měnilo.
A pak by mě zajímalo, jak mám udělat to, aby po zpracování signálu loadCountries(..) se změnil snippet places a načetly se právě ty omezené Places – tedy to, co se nakliká v tom filtru. Snad je to pochopitelné :)
Vycházel jsem z příkladů z Nette, procházel jsem fóra, zkoušel různý věci, ale pořád nevím, jestli na to jdu tím správným směrem a jak bych měl docílit toho, co chci.
EDIT: Třeba právě v tom automatu na kávu, se o to pole snippets vůbec nemusím starat. Dělal jsem to podle toho, ale nevím co mám špatně. Koukám do toho celý den.
Díky za pomoc.
Editoval joe (31. 8. 2010 20:52)

- joe
 - Člen | 313
 
Tak si odpovím sám, už jsem se s tím nějak vypořádal a veřejné díky Ondrovi Mirtesovi.)
Moje chyby – neměl jsem úplně správně zavináče – viz zavináčová magie.
Poslední místa, o co mi šlo, jsem měl špatně ten snippet – ify mají být uvnitř snippetu.
{snippet places}
	{if empty($places)}
		žádné places
	{else}
		{foreach $places as $place}
		<div class="place">
			place {$place->title_add_info}
		</div>
		{/foreach}
	{/if}
{/snippet}