Form s několika tlačítky – jak poznám na co se kliklo

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

Ahoj,
prosím o radu. Mám formulář se dvěma tlačítky a pro zpracování bych potřeboval rozlišit, které bylo stisknuto. V dokumentaci jsem našel možnost volat svůj handler pomocí onClick. V handleru to padne chybou
„Recoverable Error: Argument 1 passed to App\Forms\RezervaceFormFactory::formSubmittedExit() must be an instance of Nette\Application\UI\Form, instance of Nette\Forms\Controls\SubmitButton given in C:\Program Files\EasyPHP-Devserver-16.1\eds-www\nette-apda\app\forms\RezervaceFormFactory.php:95 @ http://127.0.0.1/nette-apda/www/?… @@ exception–2017–12–25–14–42–b9660062b3.html“

   ...
		$form->addSubmit('send', 'Odeslat mail');
    $form->addSubmit('exit', 'zpět')
            ->onClick[] = [$this, 'formSubmittedExit'];

    $form->onSuccess[] = [$this, 'formSucceeded'];
    return $form;
}

public function formSucceeded(Form $form)
{
dump($form);
//die();
}
public function formSubmittedExit(Form $form)
{
dump($form);
//die();
}

Není jednodušší cesta jak zjistit, že form byl odeslán tlačítkem ‚exit‘?
Např něco jako $form->subnittedBy->name …

Editoval Petr64 (25. 12. 2017 15:20)

duke
Člen | 650
+
+1
-

Co ti na tom připadá složitého?
Jak tě koneckonců upozorňuje i ta chybová hláška, handler na onClick událost prostě jako argument nepřijímá instanci formuláře, nýbrž odesílací tlačítko. Tzn.:

public function formSubmittedExit(SubmitButton $button)
{
	dump($button->getForm());
}
Petr64
Člen | 22
+
0
-

duke napsal(a):

Co ti na tom připadá složitého?
Jak tě koneckonců upozorňuje i ta chybová hláška, handler na onClick událost prostě jako argument nepřijímá instanci formuláře, nýbrž odesílací tlačítko. Tzn.:

public function formSubmittedExit(SubmitButton $button)
{
	dump($button->getForm());
}

No ono to asi nebude složité pokud tomu rozumíš. Ale já se to snažím teprve chápat a moc mi to nejde.
Například tvůj příklad skončí podobnou chybou :
.. Error: Argument 1 passed to App\Forms\RezervaceFormFactory::formSubmittedExit() must be an instance of App\Forms\SubmitButton, instance of Nette\Forms\Controls\SubmitButton given in C:\Program Files\EasyPHP-Devserver-16.1\eds-www\nette-apda\app\forms\RezervaceFormFactory.php:95 …

<?php
$form->addSubmit('exit', 'Zpět')
     ->onClick[] = [$this, 'formSubmittedExit'];
?>

Předpokládám to $this znamená objekt buton

Tak jsem zjistil, že je potřeba to lehce upravit:

public function formSubmittedExit(\Nette\Forms\Controls\SubmitButton $button)
{
	dump($button->getForm());
}

Ale každopádně díky za každé nakopnutí správným směrem.

Editoval Petr64 (25. 12. 2017 18:54)

japlavaren
Člen | 404
+
-2
-

ahoj,

zase tam mas krasnu hlasku, ktoru necitas
Error: Argument 1 passed to App\Forms\RezervaceFormFactory::formSubmittedExit() must be an instance of App\Forms\SubmitButton, instance of Nette\Forms\Controls\SubmitButton given

public function formSubmittedExit(SubmitButton $button)
{
  dump($button->getForm());

}

ak ti to hadze tu chybu, tak mas urcite v niekde hore

use Nette\Forms\Controls\SubmitButton;

namiesto toho co to pyta:

use App\Forms\SubmitButton;

Editoval japlavaren (26. 12. 2017 6:43)

Petr64
Člen | 22
+
0
-

japlavaren napsal(a):

ahoj,

zase tam mas krasnu hlasku, ktoru necitas
Error: Argument 1 passed to App\Forms\RezervaceFormFactory::formSubmittedExit() must be an instance of App\Forms\SubmitButton, instance of Nette\Forms\Controls\SubmitButton given

public function formSubmittedExit(SubmitButton $button)
{
  dump($button->getForm());

}

ak ti to hadze tu chybu, tak mas urcite v niekde hore

use Nette\Forms\Controls\SubmitButton;

namiesto toho co to pyta:

use App\Forms\SubmitButton;

Ahoj,
čítam veď som to už opravil. Pozri hore.
Díky vašim reakcím jsem si už dohledal ve fóru další odpovědi. Pro začátečníka je to stravitelnější než suchý odkaz na dokumentaci.

https://forum.nette.org/…ve-formulari

https://forum.nette.org/…vracet-nikdy

díky

Editoval Petr64 (26. 12. 2017 9:49)

duke
Člen | 650
+
+3
-

Ohledně namespace problémů ti již poradili jiní, takže zareaguji jen na jediné:

Petr64 napsal(a):

$form->addSubmit('exit', 'Zpět')
     ->onClick[] = [$this, 'formSubmittedExit'];

Předpokládám to $this znamená objekt buton

Nikoli. $this zastupuje objekt, ze kterého se provádí tento kód, a jeho význam zde je stanovit, kde se nachází metoda formSubmittedExit, která se má volat při události odeslání formuláře tímto tlačítkem. Ve tvém případě tedy konkrétní objekt RezervaceFormFactory. Když chceš na nějakou událost navázat volání metody nějakého konkrétního objektu, používá se na to v PHP právě tento způsob odkazování na metodu, tzn. výše uvedený kód lze česky číst jako:

Přidej do formuláře $form submit tlačítko s názvem „exit“ a popiskem „Zpět“ a pak na tomto tlačítku zaregistruj handler události onClick, kterým budiž metoda formSubmittedExit objektu $this.

Kdybys tam měl jen:

	->onClick[] = 'formSubmittedExit';

… zkoušelo by to volat globální funkci formSubmittedExit (a nikoli metodu nějakého objektu/třídy).
Víc k tomuto v manuálu PHP, část „Passing“.

Editoval duke (26. 12. 2017 17:26)