zavolání metody presenteru při změně hodnoty radio ve formu

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

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

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

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

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.. :)