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

- Petr64
- Člen | 22
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
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
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
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
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 givenpublic 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
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)