Jak zavolat onClick nad neodesílacím tlačítkem?
- h4kuna
- Backer | 740
Co jsem koukal do API tak Nette\Forms\Controls\Button nikdy neměl událost onClick alespoň od v2.0. Nespletl jsis zápis?
- CZechBoY
- Člen | 3608
Co vim tak to vždy bylo minimálně v SubmitButton https://api.nette.org/…ton.php.html#…
- Šaman
- Člen | 2663
Aha, díky, tak to nevím, kde se mi to tu vzalo. Každopádně po
přepsání na Submit to sice funguje, ale musím bypassovat jak validaci, tak
onSubmit. Takže si asi vytvořím vlastní tlačítko, na který mohu navázat
php obsluhu.
Nebo mi něco uniká a ten Button je použitelný i na spuštění nějaké
události bez vlastního JS?
- h4kuna
- Backer | 740
Říkám si proč tady píšeš o onSubmit, protože tato událost se používá vzácně a většinou chceš onSuccess.
Nevím co chceš bypassovat, neznám use case. Nicméně formulář má několik událostí.
- onValidate, zde by měla být dodatečná validace nikoliv v onSuccess
- onSuccess, se spustí pouze pokud prošla validace
- tlačítko → onClick
- onError, se spustí pokud validace neprojde
- onSubmit, se spustí vždy když se odešle form
A někde mezi tím se spouští onClick pokud je form odeslaný právě tím tlačítkem.
Editoval h4kuna (5. 11. 2019 9:06)
- Pavel Kravčík
- Člen | 1195
Třeba na návratové odkazy, které chce mít vedle submitu, na to se hodí rozšířit Form třebas, dal by se tam tam dát ajax třeba na to a ovlivnit tu stránku formuláře.
$form->addLink('return', 'Zpět na seznam')
->setIcon('chevron-circle-left')
->setColor('warning')
->setLink($this->getPresenter()->link(':Trial:Term:', ['id' => null, 'testId' => null]));
Vygeneruje to Html::el('a')
.
Editoval Pavel Kravčík (5. 11. 2019 9:47)
- Šaman
- Člen | 2663
Díky za reakce. Chci to přesně na to, co píše @PavelKravčík a
většinou to taky dělám odkazem.
Teď mám ale formulář, který do návratového odkazu musí předat nějaké
ID a to není ještě v době vytvoření formuláře známé. Nastavím ho až
při načtení defaultních hodnot, tedy mimo továrnu. Přes událost je to
v pohodě.
@h4kuna Používám opravdu pro odesílání formuláře
onSuccess
a v tomto případě to navěšuji na
onClick
.
<?php
$form->addSubmit('cancel', 'Zavřít')
->setValidationScope([])
->onClick[] = function ($button) {…};
?>
Ale protože používám zároveň i onValidate
a kód výše
vytvoří normální submit button, zkouší to nejprve validovat. Když
validace neproběhne v pořádku, místo akce zavřít mi to vypíše chybové
hlášky. A když tohle bypassnu (validaci přeskočím pro cancel button), tak
se mi to dokonce uloží s nekorektními hodnotami, protože submit button
provedl odeslání (a validace byla vypnutá).
Přijde mi, že v tomhle případě opravdu nechci použít
addSubmit()
, ale nějaký addButton()
na který takto
navěsím událost onClick a který bude zcela mimo běžné odeslání a
zpracování formuláře.
Editoval Šaman (5. 11. 2019 12:11)
- Šaman
- Člen | 2663
Mně ale není jasné, proč bych měl vytvořit submitButton a pak obcházet to submitování. Já chci naopak vytvořit tlačítko, které s těmito rutinami nemá nic společného. Jen na něho nechci navěšovat JS obsluhu (stále mi to připadá že k tomu addButton slouží), ale spustit vlastní php událost (také by to mohlo být nějaké přepočítání hodnot ve formuláři apod).