Odobratie hodnoty zo selectu po odoslani formularu

vladimir.biro
Člen | 163
+
0
-

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:

  1. V selecte si vyberiem produkt a kliknem na pridat http://prntscr.com/jagwk1
  2. 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
  3. 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 :)

MajklNajt
Člen | 498
+
0
-

ahoj, čo tak napĺňať hodnoty selectboxu až v handle metóde? v createComponentForm to necháš prázdne…

vladimir.biro
Člen | 163
+
0
-

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

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

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

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:

  1. Odoslem formular
  2. Najskor sa vygeneruje formular nanovo (cim sa naplni selectbox)
  3. Potom sa spracuje formualr (odoberie sa polozka z databazi)
  4. 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

CZechBoY
Člen | 3608
+
0
-

Jo, pro zpracování formuláře ho musíš nejdřív vytvořit.

Co udělat redirect nebo znovu načtení dat po odeslání?

vladimir.biro
Člen | 163
+
0
-

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:

  1. createComponentForm()
  2. formSuccess
  3. 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.

CZechBoY
Člen | 3608
+
0
-

Pošli kod jak máš teď udělaný ten formulář.

MajklNajt
Člen | 498
+
0
-

@vladimir.biro práveže v tom fillSampleBox sa dáta opäť načítajú z databázy a opäť sa vložia do selectboxu (prepíšu), čiže by to fungovať malo – skúšal si si dumpnúť, aké dáta sa ti vytiahnu z manažéra pri tom opätovnom volaní fillSampleBox?