Prosim priklad: Opakovane vypisovana stejna komponent a ajax
- Vladik_hk
- Člen | 50
ahoj, uz jsem dnes mel otazku ohledne komponent. Bohuzel mi stale nefuguje ajax ve spojeni s opakovane zobrazenou stejnou komponentou.
Dokazal by nekdo udelat funkcni priklad na nasledujici?
Mam komponentu, ktera generuje tlacitka ANO a NE k dotaznikovym otazkam. Na strance mam otazek vice, takze tuto komponentu s tlacitky chci generovat ke kazde otazce. V prezenteru to delam tedy tak, ze si projdu foreachem otazky a pro kazdou otazku zaregistruju tu samou komponentu tlacitek, ale pod jinym nazvem (tlacitka+idOtazky). Nasledne komponenty zobrazim na strance a po kliknuti na nektere z tlacitek by se mel misto tlacitek zobrazit text „Odpoved vyplnena, dekujeme.“.
Ted to mam nasledujicim zpusobem, ale ajaxova odezva ze serveru mi vraci error. Pritom pokud zadam link primo do adresniho radku prohlizece tak to funguje.
V sablone presenteru pro vypis komponent:
<?php
@{foreach $questions as $question}
{var componentName => 'tlacitka' . $question->id}
@{control componentName}
<br />
@{/foreach}
?>
V sablone komponenty pak mam:
<?php
{snippet tlacitka}
<a href="{link answer! 1}" class="ajax">YES</a> / <a href="{link answer! 2}" class="ajax">NO</a>
{/snippet}
?>
V handle fci, ktera se stara o zachyceni ajax pozadavku po kliku na tlacitko je $this->getPresenter()->invalidateControl(‚tlacitka‘);
Zjistim jsem, ze problem nastava prakticky vzdy, kdy pouzivam pro zobrazeni komponenty jmeno tvorene promenou (tedy {control $jmenoJakoPromenna}), to by ale nemel byt snad problem. Proto by bylo nejlepsi, kdyby byl nekdo ochotny udelat nejaky funkcni priklad, protoze nevim, kde presne muze byt chyba. Take si nejsem jisty nazvem snippetu v komponente a invalidaci komponenty.
Diky moc! Odmena jista:)
- Vojtěch Dobeš
- Gold Partner | 1316
V příkladu je chybka (možná původce problému a možné ne, úplně jsem to nestudoval):
@{control componentName}
nejspíš má být
@{control $componentName}
- Vojtěch Dobeš
- Gold Partner | 1316
Nevím, jestli je to ideální příklad a správný postup, ale na
localhostu
mi to takto funguje. Celé jsem to obalil
komponentou
, která zvládá přijmout odpověď na otázku
(handleAnswer
) a vymazat všechny odpovědi
(handleRefresh
). Odpovědi si ukládám do session
a
v každém požadavku si překresluju výpis všech těch otázek v jednom
obalujícím snippetu
.
Zdrojový kód řešení: https://gist.github.com/817320
Oprava: opravil jsem bug se zápornou odpovědí, teď se objeví zprávička při jakékoliv odpovědi
Editoval vojtech.dobes (8. 2. 2011 23:02)
- Vladik_hk
- Člen | 50
vojtech.dobes: diky moc, takhle bych to mohl taky udelat. A co kdyby byly komponentou jenom ty tlacitka a text odpovedi se vypisoval normalne pres presenter? I kdyz… kdyz nad tim tak premyslim, tak udelat cely vypis otazek jako komponentu je asi lepsi, protoze pak jen vzdy predam komponente vsechny otazky a ta uz se postara o vykresleni vseho. Kazdopadne diky moc!