Výběr z databáze po kliknutí na tlačítko a použití dalšího tlačítka – Nette v2.0

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Prochy
Člen | 91
+
0
-

Zdarvim,
mám formulář, kde je SelectBox, kde mám seznamy číselníku, a já chci, že když vyberu určitý číselník a kliknu na tlačítko, tak aby se mi načetla stránka, kde budou vypsané položky číselníku. Myslel sem, že to udělám, tak že kliknu na tlačíko a zavolám událost, kde přidám do továrny další select box, kde chci zobrazit položky číselníku, ale to mi nejde. Tak by mě zajímalo, jak by se takováto věc měla správně naprogramovat? Myslel jsem něco takovéhoto:
formulář

protected function createComponentDialForm($name)
{
 $form=new Form();
 $form->addSelect(,,$dials);
 $form->addSubmit('choose_dial',)->onClick[]=callback($this,'chooseDialFormSubmitted');
 return $form;
}
public function chooseDialFormSubmitted(SubmittedButton $button){
$dialItems=funkce pro vyhledání položek číselníku
$button->form->addSelect('dial_item','Položky číselníku',$dialItems);
$form->addSubmit('delete_item',)->onClick[]=callback($this,'deleteItemDialFormSubmitted');
}

Jak asi sami víte tohle mi nefunguje. Tušim, že by to mohlo být tím, že $form není globálně nadefinovanej jako form, a pokaždý se ta instance zruší po odeslání toho delete tlačítka.
Mohu tedy poprosit, jak to správně udělat? Napadlo mě ještě hodit nějaký ‚ifi‘ do továrničky, ale to mi přijde jako prasárna. Další věc, co mě napadla, bylo to, že bych ten select dial_item hodil do továrničky a nastavil parametr Disabled(), a potom naplnil hodnoty v tom DialFormSubmitted, ale taky nejde, jelikož už nemohu později naplnit hodnoty, nebo jsem na to zatim nepřišel. Pokud možnost všechno to chci mít na jedné stránce.
Předem se omlouvám za ten název Dial, ale nevim jak se řekne anglicky pro databázovej číselník. :)
Za každou pomoc budu moc vděčnej.

nanuqcz
Člen | 822
+
0
-

Ahoj, podle mě by mělo fungovat

public function chooseDialFormSubmitted(SubmittedButton $button){
    $dialItems = funkce pro vyhledání položek číselníku
    $this['dialForm']->addSelect('dial_item','Položky číselníku',$dialItems);
    $this['dialForm']->addSubmit('delete_item','Smazat')->onClick[] = callback($this,'deleteItemDialFormSubmitted');
}

ale jestli je to čisté řešení, si netroufám tvrdit. Pokud nespěcháš, raději si počkej na odpověď někoho zkušenějšího v tomhle :-)

Prochy
Člen | 91
+
0
-

Bohužel ani toto nefunguje. Nevim proč ale po kliknutí na tlačítko se refreshne stránka a začne se jako by od začátku. Když jsem to testoval, tak se vůbec nezavolá funkce deleteItemDialFormSubmitted, ikdyž tam dám úmyslně chybnej název, tak to nezahlásí žádnou chybu.

Prochy
Člen | 91
+
0
-

Omlouvám se, že ženu tenhle příspěvek nahoru, ale opravdu toto nikdo neví nebo mi nechce poradit? Děkuji

nanuqcz
Člen | 822
+
0
-

Když jsem to testoval, tak se vůbec nezavolá funkce deleteItemDialFormSubmitted, ikdyž tam dám úmyslně chybnej název, tak to nezahlásí žádnou chybu.

To znamená, že nový select a tlačítko pro smazání se ti už objeví? (tzn., vyřešili jsme první problém, teď zbývá druhý)

Prochy
Člen | 91
+
0
-

Ano přesně tak, tlačítko i select se objeví, ale neprovede se požadováná funkce po stiknutí tlačítka.

nanuqcz
Člen | 822
+
0
-

Tak jsem si to zkusil a problém je zde: Po odeslání formuláře tlačítkem delete_item se už znovu neprovede chooseDialFormSubmitted (což je správně), takže ve formuláři už tlačítko delete_item vlastně není, a tak je callback neplatný.

Vyřešil jsem to persistentní proměnnou, kam si ukládám, jestli už byla hodnota z prvního selectu vybrána. Funkční řešení tedy vypadá takhle (pro porovnání, nefunkční řešení zde).

Moc se mi to řešení ale nelíbí a mám pocit, že by se dalo vymyslet i hezčí. Kdyby měl někdo nápad, podělte se ;-)

Editoval nanuqcz (3. 3. 2012 14:37)

Prochy
Člen | 91
+
0
-

Děkuji funguje.