Ošetřit odesílaná data tlačítka Nette\Forms\Controls\Button

m.brecher
Generous Backer | 863
+
-1
-

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)