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)