Jak zavolat onClick nad neodesílacím tlačítkem?

Šaman
Člen | 2635
+
0
-

Ahoj, v Nette 2.4 přestalo fungovat

<?php
$form->addButton('cancel', 'Zrušit')
     ->onClick[] = …;
?>

protože Button sám nemá událost onClick. Jaký je best practise?
Přidávat addSubmit a přesočit validaci, nebo ten cancel navěšovat jako JS, nebo jak?

h4kuna
Backer | 740
+
0
-

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

Co vim tak to vždy bylo minimálně v SubmitButton https://api.nette.org/…ton.php.html#…

Šaman
Člen | 2635
+
0
-

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

Ří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 | 1181
+
0
-

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

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)

h4kuna
Backer | 740
+
0
-

To by ti asi mělo stačit implementovat si vlastní ISubmitterControl?

Editoval h4kuna (5. 11. 2019 12:55)

Šaman
Člen | 2635
+
0
-

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