Překreslení snippetu s formulářem

monty
Člen | 66
+
0
-

Ahoj.

Mám formulář se dvěma radio buttony, při jejichž změně se mi překreslí snippet obalující formulář.

	public function createComponentAdvertForm() {
		$form = new Form;

		$form->getElementPrototype()->addAttributes(["class" => "w100"]);

		$form->addHidden("id");
		$form->addRadioList("type", "Typ", [
			"sell" => "Nabídka",
			"buy" => "Poptávka"
		])->setHtmlAttribute("data-snippet-loader", "advertForm");
		$form->addText("title", "Název");
		$form->addTextarea("text", "Popis");
		$form->addSelect("category_id", "Kategorie", $this->AdvertsManager->getCategoriesArray());
		$form->addInteger("price", "Cena")->setRequired();
		$form->addUpload("image", "Fotka")->addRule(Form::IMAGE)->setRequired(false);

		$form->addSubmit("save", "Uložit")->setHtmlAttribute("class", "green");

		$form->onSuccess[] = [$this->AdvertsManager, "advertSave"];

		return $form;
	}
		$(function() {
			$(document).on("change", "input[name=type]", function() {
				var type = $(this).val();
				$.nette.ajax({
					url: {link advertFormTypeSwitchTo!},
					data: {
						type: type
					}
				});
			});
		});
public function handleAdvertFormTypeSwitchTo($type) {
	$this->advertFormType = $type;
	$this["advertForm"]["type"]->setValue($this->advertFormType);

	if ($this->isAjax()) {
		$this->redrawControl("advertForm");
	}
}

Pokud se tak ale stane, po kliknutí na submit se formulář nevaliduje a ani neodešle, jen se refreshne stránka.

Tuším, že by to mohlo být kvůli netteForms.
Jakým způsobem formulář re-inicializuji?

Díky
Peťa

monty
Člen | 66
+
0
-

Tak netteForms za to nemůže.
Jen jsem zatím pořád nepřišel na to, proč se po překreslení formuláře po kliknutí na submit nic nestane. Resp. jen se reloadne stránka.

Napadá prosím někoho něco?
Určitě to bude nějaká hovadina, kterou nevidím.
Díky

monty
Člen | 66
+
0
-

Problém jsem zatím nevyřešil a momentálně se bez toho formuláře v projektu nehnu.

Nesetkal se prosím někdo s tímhle problémem?
Po překreslení snippetu formuláře se podle všeho nezavolá funkce onSubmit.

Pomůže mi někdo prosím?
Díky

Ondřej Kubíček
Člen | 494
+
0
-

uplně přesně nevím co dělá to, když radiolistu přidaš ten atribut data-snippet-loader:

->setHtmlAttribute("data-snippet-loader", "advertForm")

a tohle se pak snažíš redrawnout, jen ten radiolist? nevidím latte šablonu, tak nevím jak tam ten snippet máš.
proč potřebuješ po změně toho type radiolistu poslat request a na serveru tomu formu ten type znovu setnout?

monty
Člen | 66
+
0
-

Ahoj Ondro.

Ten html atribut slouzi js funkci, kterou jsem si napsal.
Podle jeho hodnoty nahodi po spusteni ajaxu spinner na prislusny element.

V latte neni nic zvlastniho.
Snippet a form jsou takhle…

{snippet advertForm}
   {control advertForm}
{/snippet}

Podle typu inzeratu (nabidka/poptavka), se vykresli nebo nevykresli policko pro cenu predmetu.
Podle toho i nastavim odpovidajici vychozi vybrany radio.

Ondřej Kubíček
Člen | 494
+
0
-

jenom kvůli zobrazení inputu pro cenu? tak to řešíš podle mě zbytečně overkill
nestačí ti to takhle https://doc.nette.org/…s/validation ?

monty
Člen | 66
+
0
-

No, v tomhle případě to overkill je, ale řeším teď stejný problém v jiné aplikaci, kde už je mnohem větší formulář a je v něm těchhle několik dependent selectů.
Ať už je to overkill nebo ne, hlavní je, že to nefunguje tak, jak by mělo a já bych rád věděl proč :)

Mimochodem ten toggle jsem zkoušel někdy z počátku a vypadá to, že ani on není zcela funkční, protože pokud ho použiju na skrytí required fieldu, tak mi při submitu formulář hlásí, že ho mám vyplnit :)
To je ale jiná kapitola, kterou řešit nepotřebuju.

Ondřej Kubíček
Člen | 494
+
0
-

tak nahod někam funkční ukázku, takhle můžu jen hádat

monty
Člen | 66
+
0
-

Dobře, večer pošlu odkazy.

Zatím díky

Mortisson
Člen | 21
+
+1
-

Ahoj, pokud se ti jen překreslí stránka a neodešle formulář, tak doporučuji přidat onError[] listener a dumpovat si $form->getErrors(), třeba se z toho něco zajímavého dozvíš

Mortisson
Člen | 21
+
+1
-

monty napsal(a):

No, v tomhle případě to overkill je, ale řeším teď stejný problém v jiné aplikaci, kde už je mnohem větší formulář a je v něm těchhle několik dependent selectů.
Ať už je to overkill nebo ne, hlavní je, že to nefunguje tak, jak by mělo a já bych rád věděl proč :)

Mimochodem ten toggle jsem zkoušel někdy z počátku a vypadá to, že ani on není zcela funkční, protože pokud ho použiju na skrytí required fieldu, tak mi při submitu formulář hlásí, že ho mám vyplnit :)
To je ale jiná kapitola, kterou řešit nepotřebuju.

Tady by bylo asi dobré ten ->setRequired() podmínit pomocí setConditionOn, pak bude prvek required jen pokud je radio button zaškrtnutý a tudíž prvek viditelný

monty
Člen | 66
+
0
-

@Mortisson
Dobře, zkusím to, díky.