Překreslení snippetu s formulářem
- monty
- Člen | 66
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
- Ondřej Kubíček
- Člen | 494
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
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
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
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.
- Mortisson
- Člen | 21
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ý