Naplnění selectboxu vytvořeného v továrničce
- visitor
- Člen | 22
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
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ě.
- nAS
- Člen | 277
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.
- Patrik Votoček
- Člen | 2221
<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).