Odobratie hodnoty zo selectu po odoslani formularu
- vladimir.biro
- Člen | 163
Ahojte.
Mam takyto problem.
Mam formular v ktorom je iba selectbox (naplnovany hodnotami z DB) a button
send.
Po vybrati hodnoty zo selectboxu a kliknuti na send sa ma vybrata hodnota
zapisat do databazi. Po odoslani formularu sa ma nacitat snippet (je to cez
ajax), vktorom je cely formular a chcel by som dosiahnut to, aby sa mi formular
nacital nanovo uz bez mnou vybratej hodnoty v selecte (hodnoty sa nacitavaju
z DB $db->table(‚article‘)->where(‚id NOT‘,
$vybraneHodnotySelect)).
Problem je ale v tom, ze vygenerovanie formularu (createComponent…) sa vykonava skor, ako sa vykona spracovanie formularu, cize novy formular sa mi nacita aj s uz predtym vybratou hodnotou.
Chcel som to hacknut tak, ze som este pred vygenerovanim formularu vytiahol vybratu hodnotu zo selectboxu cez $this->httpRequest->getPost(‚hodnota‘) a tu som dopocital z hodnot, ktore sa vkladaju do selectu. Proti tomu sa ale nette brani tym, ze ku spracovaniu vobec nedojde. Pravdepodobne z bezpecnostneho hladiska, aby kdekto nemohol pohadzovat ine moznosti ako formular ponuka.
Tu je na screenoch vyjadrene, ze co od toho chcem:
- V selecte si vyberiem produkt a kliknem na pridat http://prntscr.com/jagwk1
- Ajaxom sa mi nacita formular znovu. Pridal sa vybraty produkt, no zostal zaroven aj v selecte, co nechcem, lebo nechcem, aby sa dal vybrat znovu http://prntscr.com/jagx5p
- Ked vyberiem nejaky dalsi prdukt a dam pridat, tak ten prvy mi uz zo zoznamu zmizol, ale ten posledny tam stale je. http://prntscr.com/jagxrt
Znie to dost komplikovane, ale vedeli by ste mi s tym prosim nieto pomoct, ako na to?
Dakujem za kazdu radu. Ja sa s tym trapim od rana a nikam som sa nepohol :)
- vladimir.biro
- Člen | 163
MajklNajt napsal(a):
ahoj, čo tak napĺňať hodnoty selectboxu až v handle metóde? v createComponentForm to necháš prázdne…
Nejako to neviem uchopit … vedel by si mi napisat ten kusok kodu ako by sa to v handle dalo riesit?
- MajklNajt
- Člen | 498
Sorry, až teraz som si prečítal, že to odosielaš tlačidlom, čiže nebudeš to plniť v handle ale v processForm… Formulár si vytváraš asi takto nejako:
function createComponentSampleForm()
{
$form = new Nette\Application\UI\Form;
$form->addMultiSelect("sampleBox")->setItems([]); /* prázdne pole */
$form->addSubmit("save");
$form->onSuccess[] = [$this, "processForm"];
return $form;
}
čiže pri spracovaní asi takto nejako:
function processForm($form, $values)
{
$this->dbManager->save($values);
$this->fillSampleBox($values->sampleBox);
}
function fillSampleBox($selectedValues = null)
{
$data = $this->dbManager->findAllExcept($selectedValues);
$this["sampleForm"]["sampleBox"]->setItems($data);
}
a aby sa ti select naplnil aj pred odoslaním, tak:
function beforeRender()
{
parent::beforeRender();
$this->fillSampleBox();
}
Píšem z hlavy, ale malo by fungovať (nezabudni invalidovať snippety, ak to odosielaš ajaxom)
Editoval MajklNajt (27. 4. 2018 13:43)
- vladimir.biro
- Člen | 163
MajklNajt napsal(a):
Sorry, až teraz som si prečítal, že to odosielaš tlačidlom, čiže nebudeš to plniť v handle ale v processForm… Formulár si vytváraš asi takto nejako:
function createComponentSampleForm() { $form = new Nette\Application\UI\Form; $form->addMultiSelect("sampleBox")->setItems([]); /* prázdne pole */ $form->addSubmit("save"); $form->onSuccess[] = [$this, "processForm"]; return $form; }
čiže pri spracovaní asi takto nejako:
function processForm($form, $values) { $this->dbManager->save($values); $this->fillSampleBox($values->sampleBox); } function fillSampleBox($selectedValues = null) { $data = $this->dbManager->findAllExcept($selectedValues); $this["sampleForm"]["sampleBox"]->setItems($data); }
a aby sa ti select naplnil aj pred odoslaním, tak:
function beforeRender() { parent::beforeRender(); $this->fillSampleBox(); }
Píšem z hlavy, ale malo by fungovať (nezabudni invalidovať snippety, ak to odosielaš ajaxom)
Dakujem.
Vyskusam a dam vediet.
- vladimir.biro
- Člen | 163
MajklNajt napsal(a):
Sorry, až teraz som si prečítal, že to odosielaš tlačidlom, čiže nebudeš to plniť v handle ale v processForm… Formulár si vytváraš asi takto nejako:
function createComponentSampleForm() { $form = new Nette\Application\UI\Form; $form->addMultiSelect("sampleBox")->setItems([]); /* prázdne pole */ $form->addSubmit("save"); $form->onSuccess[] = [$this, "processForm"]; return $form; }
čiže pri spracovaní asi takto nejako:
function processForm($form, $values) { $this->dbManager->save($values); $this->fillSampleBox($values->sampleBox); } function fillSampleBox($selectedValues = null) { $data = $this->dbManager->findAllExcept($selectedValues); $this["sampleForm"]["sampleBox"]->setItems($data); }
a aby sa ti select naplnil aj pred odoslaním, tak:
function beforeRender() { parent::beforeRender(); $this->fillSampleBox(); }
Píšem z hlavy, ale malo by fungovať (nezabudni invalidovať snippety, ak to odosielaš ajaxom)
Tak som sa dostal k tomu az teraz.
Nezafungovalo to. Myslim si, ze zivotny cyklus je takyto:
- Odoslem formular
- Najskor sa vygeneruje formular nanovo (cim sa naplni selectbox)
- Potom sa spracuje formualr (odoberie sa polozka z databazi)
- Vygeneruje sa formular v snippete
To znamena, ze selectbox je vygenerovany skor, ako prebehne spracovanie formulara (cize selectbox sa vytvori este so „starimi“ udajmi z DB)
… nejako to ale predsa musi ist, spravit taku vec :D
- vladimir.biro
- Člen | 163
CZechBoY napsal(a):
Jo, pro zpracování formuláře ho musíš nejdřív vytvořit.
Co udělat redirect nebo znovu načtení dat po odeslání?
Redirect po spracovani formularu by to urcite vyriesil … ale chcem to mas cez ajax (koli povahe aplikacie by nebolo dobre, keby pocas prace s formularom stranka preblikavala)
No ked pouzijem spracovanie ajaxom, tak sa mi formular vygeneruje vzdy s udajmi, pred spracovanim formularu (cize aj s hodnotami, ktore by tam uz po spracovani formularu byt nemali)
To poradie je take:
- createComponentForm()
- formSuccess
- render
..... tak nejako mi to aspon vychadza podla toho, ako sa to sprava.
No ja v formSuccess odoberam z DB produkty, ktore sa maju nasledne nacitat do databazi. Vzhladom na to, ze to poradie je take, ako som pisal vyssie, tak sa najskor nacitaju produkty z DB, potom sa v formSuccess produkt vymaze z DB a potom sa formular vykresli. Cize ostane v nom aj produkt, ktory ma byt uz zmazany.
Nacitavat produkty v formSuccess nepomohlo, pretoze data pre formular su uz vytvorene v tej chvili a nic to nezmeni.
Bud je to teda tak, ze sa to proste neda, comu neverim, lebo podla mna sa da
vsetko :D
Alebo sa mylim a bud na to pozeram zle, alebo je na to nejaka tajna
finta :)
Dakujem dopredu za kazde rady.