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}