Jak nastavit validationScope pro javascriptem vyvolaný submit formuláře?

duke
Člen | 650
+
0
-

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

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

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.