Prosim priklad: Opakovane vypisovana stejna komponent a ajax

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

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

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}
Vladik_hk
Člen | 50
+
0
-

vojtech.dobes: Jo jasne, to je preklep jen v tomto prikladu, jinak to mam v poradku, bohuzel:(

nejake tipy?

Vladik_hk
Člen | 50
+
0
-

Nikdo nevi? Resil nekdo podobny pripad? Ja se s tim morim cely den, uz fakt nevim… Nebyl by tu nekdo na konzultaci pres skype?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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!

Vladik_hk
Člen | 50
+
0
-

Slo by nejak udelat, aby se v pripade odpovedi na jendu otazku prenasel jen snippet te jedne otazky a ne cely vypis otazek?

joseff
Člen | 233
+
0
-

Mohu se prosím zeptat jak jsi vytvořil ty továrničky v presenteru? Řeším podobný problém ale nějak nevím jak mám vytvořit ty továrničky dinamicky. Dík