Jak nastavit validationScope pro javascriptem vyvolaný submit formuláře?
- duke
- Člen | 650
Nette aktuálně umožňuje submit buttonům nastavit tzv. validationScope, který určuje, které inputy se v případě odeslání daným tlačítkem budou validovat a které naopak ne, či úplně validaci vypnout.
Aktuálně řeším situaci, kdy ajaxem odesílám formulář při change eventu na některých inputech (abych podle nových hodnot aktualizoval některé zobrazené údaje) a potřeboval bych pro tento automatický submit vypnout validaci pro některé inputy (které chci mít povinné, jen pokud uživatel klikne na odesílací tlačítko formuláře).
Existuje nějaká elegantní možnost, jak nastavit tuto „výchozí“ validationScope, která není vázaná na žádné submit tlačítko?
Popř. lze nějak javascriptem emulovat submit konkrétním tlačítkem (tj. tak, aby si Nette myslelo, že formulář byl odeslán oním tlačítkem)?
- duke
- Člen | 650
Javascriptovou validaci se mi podařilo vyřešit následujícím způsobem:
Před zavoláním submit() z javascriptu je třeba nastavit
form['nette-submittedBy']
na element submit tlačítka, které má
Nette považovat za odesílací (kde form
je element formuláře).
Takže to s jquery pak vypadá nějak takto:
$form[0]['nette-submittedBy'] = $('#recalculate')[0];
$form.submit();
Serverová validace je však stále aktivní…
Editoval duke (1. 10. 2017 16:29)
- duke
- Člen | 650
Tak jsem zdá se vyřešil i tu serverovou část. Vyrobil jsem si na to speciální typ submit buttonu, který se bude tvářit jako odesílající, pokud žádný jiný submit button odesílající není. Kdyby to někdo potřeboval, tak zde je moje řešení:
class FallbackSubmitButton extends Nette\Forms\Controls\SubmitButton
{
/**
* Loads HTTP data.
* @return void
*/
public function loadHttpData()
{
$isSubmitted = $this->getForm()->isSubmitted();
$this->setValue($isSubmitted === TRUE || $isSubmitted === $this ?: NULL);
if ($this->isFilled()) {
$this->getForm()->setSubmittedBy($this);
}
}
}
Přidání speciálního submitu do formuláře a vypnutí validace:
$form['autoRecalculate'] = new FallbackSubmitButton;
$form['autoRecalculate']->setValidationScope(FALSE);
… nyní je vypnutá serverová validace při odeslání formuláře javascriptem.