Ošetřit odesílaná data tlačítka Nette\Forms\Controls\Button
- m.brecher
- Generous Backer | 863
Ahoj,
v dokumentaci https://doc.nette.org/…rms/controls#… je uvedeno speciální tlačítko Nette\Forms\Controls\Button, které „nemá odesílací funkci“ a lze jej použít např. pro vyvolání javascriptu. Použijme toto tlačítko ve formuláři spolu s normálním odesílacím tlačítkem:
$form = new Form()
//.....
$form->addSubmit('submit', 'Odeslat');
$form->addButton('button', 'Akce');
return $form;
Když odešleme formulář standardním SubmitButton tlačítkem, potom ve $values odeslaného formuláře je i položka ‚button‘ ⇒ ‚Akce‘, což jsou data tlačítka Button. Toto je nežádoucí a vyvolá výjimku při ukládání do databáze.
Tlačítka třídy Nette\Forms\Controls\SubmitButton mají v konstruktoru toto nežádoucí prosáknutí dat tlačítka do $values ošetřeno:
public function __construct(string|Stringable|null $caption = null)
{
parent::__construct($caption);
$this->control->type = 'submit';
$this->setOmitted(true); // zamezení prosakování dat
}
Zatímco v nadřazené třídě Nette\Forms\Controls\Button toto ošetření chybí:
public function __construct(string|Stringable|null $caption = null)
{
parent::__construct($caption);
$this->control->type = 'button';
$this->setOption('type', 'button');
}
Přesuneme tedy řádek $this->setOmitted(true); do konstruktoru nadřazené třídy aby se aplikoval na všechna tlačítka a problém je vyřešen.
PR https://github.com/…rms/pull/330
Editoval m.brecher (4. 5. 19:55)