zavolání metody presenteru při změně hodnoty radio ve formu
- Jarek92
- Člen | 91
Zdravím,
mám formulář, který kromě jiných položek obsahuje také element radio.
Chtěl bych zajistit, aby při aktivaci tohoto radio prvku se zavolala metoda
v Presenteru (např. handleClick) a ajaxově vrátila odpoveď zpět do
šablony. Má s tím někdo zkušenosti? Zkoušle jsem v JS metodě
přesměrovat na metodu příslušného presenteru, ale bez výsledku.
- pata.kusik111
- Člen | 78
Osobně chodím cestou nejmenšího odporu a na takhle jednoduchou úlohu nepoužiji ani žádný framework. Na událost toho radioboxu v JS navěsím hook ve kterém pošlu AJAX dotaz na ten handle (URL handleru si vygerenuju pomocí link makra, které funguje i v kontextu JS). A v onSuccess metodě toho AJAX dotazu zpracuji odpověď – předpokládám, že budeš chtít něco přidávat do DOMu.
- Jarek92
- Člen | 91
pata.kusik111 napsal(a):
Osobně chodím cestou nejmenšího odporu a na takhle jednoduchou úlohu nepoužiji ani žádný framework. Na událost toho radioboxu v JS navěsím hook ve kterém pošlu AJAX dotaz na ten handle (URL handleru si vygerenuju pomocí link makra, které funguje i v kontextu JS). A v onSuccess metodě toho AJAX dotazu zpracuji odpověď – předpokládám, že budeš chtít něco přidávat do DOMu.
Link makro funguje i v kontextu JS … mohl bys mi prosím hodit nějaký příklad? Zkoušel jsem to v JS a nemůžu se dobrat cíle.
- Barvoj
- Člen | 60
Záleží na tom, co přesně bude odpověď serveru. Pokud nějaký html, který se má do stránky přidat, tak já na to používám snippety + on change navěšený na ten input..
Kód by mohl vypadat cca takto:
MyForm.php
class MyForm extends Control {
protected $showHtml = false;
public function handleMySelect()
{
$this->showHtml = true;
$this->redrawControl('mySnippet');
}
public function render()
{
$this->template->showHtml = $this->showHtml;
}
public function createComponentMyForm()
{
$form = new Form();
$form->addSelect('mySelect', 'My select', $options = [...]);
return $form;
}
}
MyForm.latte
{form myForm}
{input mySelect}
{snippet mySnippet}
{if $showHtml}
<div>additional html code</div>
{/if}
{/snippet}
{/form}
<script>
$({
$('#'+{$control['myForm']['mySelect']->htmlId}).on('change', function() {
$.nette.ajax({
type: 'GET',
url: {link mySelect!}
});
});
});
</script>
Pak stačí takovou komponentu v presenteru vytvořit a vykreslit v šabloně makrem control..
Kód jsem psal z hlavy, takže asi nebude fungovat, ale hlavní myšlenka je z toho snad vidět.. :)