Naplnění selectboxu vytvořeného v továrničce

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

Od kódu viz níže, čekám, že naplní selectbox daty a ty po odeslání v $_POSTu ($form->getValues();) budou. Ale opak je pravdou.

<?php
    public function renderPrihlaseniNaAkci() {
        $rows = dibi::fetchPairs('SELECT [id], [nazev] FROM [clanky] WHERE [prihlasovani]="ano" AND [od] <= CURDATE() AND ([do] >= CURDATE() OR [do] = "0000-00-00") ORDER BY [od] DESC');
        $this['formPNA']->getComponent('id_akce')->setItems($rows);
	$this->template->form = $this['formPNA'];
    }

    function createComponentFormPNA() {
		$form = new AppForm;
		//$rows = dibi::fetchPairs('SELECT [id], [nazev] FROM [clanky] WHERE [prihlasovani]="ano" AND [od] <= CURDATE() AND ([do] >= CURDATE() OR [do] = "0000-00-00") ORDER BY [od] DESC');
		$form->addSelect('id_akce', 'Akce k přihlášení:')
		    ->skipFirst('Vyber Akci')
			->addRule(Form::FILLED, 'Je třeba vybrat akci.');
        $form->addSubmit('send', ' Přihlásit se ');

		$form->onSubmit[] = array($this, 'formPNASubmitted');

		return $form;
    }
?>

Už bylo řešeno zde, ale není tam nějaké konkrétní pěkné řešení, jak to řešit správně. To opravdu nejde takto plnit selectbox?

Případně kde je to správné místo jak dostat data do SB aniž bych musel v továrničce pouštět SQL dotaz (v příkladu zakomentovaný). Modely zatím nepoužívám, takže kdyby odpověď měla znít vytáhni si to z modelu, tak bych chtěl slyšet i tu možnost s pořadovým číslem dvě. Děkuji.

nAS
Člen | 277
+
0
-

To už je také evergreen. Fáze render se vykonává až po zpracování odeslání formuláře, takže formulář ještě nemá načtená žádná data. Proto nemůže porovnat, zda mu uživatel nepodstrčil nějaká data, která vůbec nebyla na výběr. Načítání dat proto musíš udělat dřív, buď v továrničce, nebo ve fázi action. V té fázi action to má ale tu nevýhodu, že komponentu můžeš používat ve více akcích a pak budeš duplikovat kód. Takže pokud nepoužíváš modely, tak si aspoň udělej v presenteru privátní metodu na načtení dat, a tu si zavolej v továrničce. Pak ti to bude fungovat spolehlivě.

visitor
Člen | 22
+
0
-

A není pak chyba v tom, že lze udělat

<?php
$this['formPNA']->getComponent('id_akce')->setItems($rows);
?>

? K čemu to pak je?

nAS
Člen | 277
+
0
-

Proč by v tom měla být chyba? To je úplně legitimní řádek, akorát ho děláš v nesprávnou chvíli. A i v tuto chvíli někdo může chtít naplnit selectBox jinými hodnotami, než které tam měl. Např. kvůli nějakému vlastnímu složitému překladu, si nejprve natáhne nepřeložená data (protože to je rychlé) a potom až v render fázi (která se při odeslání formuláře vůbec neprovede), se dopočítává ten překlad.

visitor
Člen | 22
+
0
-

OKa chápu ale neodpustím si polemizovat…

Takže si natáhnu data:
1, Jabko
2, Hruška
3, Pomeranč

A následně to přepíšu hodnotami:
1, Mamka
2, Taťka
3, Děcko

A toto je tedy v pořádku? Ano je to v rámci aplikace, kde je to na programátorovi, ale i tak mi to přijde divné.

Patrik Votoček
Člen | 2221
+
0
-

<OT>@visitor: prosím necituj zbytečně předchozí post (smazal jsem to)</OT>

Není to v pořádku protože pokud se mění význam jednotlivých políček v selectu ale zůstávají klíče (ta čísla) tak je to špatně.

Ale představ si že máš formulář stromových dat a v něm máš select box na parrent. Takže v tom máš všechny předtím vytvořené položky. Jenže chceš použít stejný form i pro editaci. U toho ale nemůžeš použít stejná zdroj dat jako u formuláře pro přidání položky, protože by obsahoval volbu sama sebe (mohl by být sám svím rodičem).

nAS
Člen | 277
+
0
-

visitor: To byl jenom příklad, který mě co nejrychleji napadl, sám bych to takhle pravděpodobně nenapsal. Jenom jsem chtěl ukázat, že nemusí být nesmysl plnit data ve fázi render.