Problém s vykreslením, Control, snippety

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

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
+
0
-

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}